ModemManager USSD resonse patch



This patch fixes USSD respose handling.
    
Some operators sends answer to USSD message with connection termination code.
When the connection termination state recieved, we should check if we can decode
the answer string. If we can, we should return this string as answer instead of error.

diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index abc5a5c..2036490 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -4486,13 +4486,37 @@ cusd_process_string (MMBroadbandModem *self,
             break;
         }
 
-        case 2:
-            if (self->priv->pending_ussd_action)
-                g_simple_async_result_set_error (self->priv->pending_ussd_action,
-                                                 MM_CORE_ERROR,
-                                                 MM_CORE_ERROR_CANCELLED,
-                                                 "USSD terminated by network.");
+        case 2: /* Some operators can send response with connection termination*/ {
+            gchar *converted;
+            GError *error = NULL;
+
+            converted = decode_ussd_response (self, str, &error);
+            if (self->priv->pending_ussd_action) {
+                /* Response to the user's request */
+                if (error)
+                    g_simple_async_result_set_error (self->priv->pending_ussd_action,
+                                                     MM_CORE_ERROR,
+                                                     MM_CORE_ERROR_CANCELLED,
+                                                     "USSD terminated by network.");
+                else
+                    g_simple_async_result_set_op_res_gpointer (self->priv->pending_ussd_action,
+                                                               converted,
+                                                               g_free);
+            } else {
+                if (error) {
+                    mm_warn ("Invalid network initiated USSD notification: %s",
+                             error->message);
+                    g_error_free (error);
+                } else {
+                    /* Network-initiated USSD-Notify */
+                    mm_iface_modem_3gpp_ussd_update_network_notification (
+                        MM_IFACE_MODEM_3GPP_USSD (self),
+                        converted);
+                    g_free (converted);
+                }
+            }
             break;
+        }
 
         case 4:
             if (self->priv->pending_ussd_action)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]