[PATCH 1/2] huawei: store modem model in MMBroadbandModemHuaweiPrivate

Ben Chan benchan at chromium.org
Tue Aug 13 00:54:42 PDT 2013


This patch adds a field in MMBroadbandModemHuaweiPrivate to keep the
modem model, which can be used later by the plugin to alter the
implementation based on model. The modem model is used instead of USB
product ID because different models of Huawei modems often share the
same USB product ID.
---
 plugins/huawei/mm-broadband-modem-huawei.c | 55 ++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/plugins/huawei/mm-broadband-modem-huawei.c b/plugins/huawei/mm-broadband-modem-huawei.c
index c34acc2..3cd3201 100644
--- a/plugins/huawei/mm-broadband-modem-huawei.c
+++ b/plugins/huawei/mm-broadband-modem-huawei.c
@@ -74,6 +74,8 @@ typedef enum {
 } RfswitchSupport;
 
 struct _MMBroadbandModemHuaweiPrivate {
+    gchar *model;
+
     /* Regex for signal quality related notifications */
     GRegex *rssi_regex;
     GRegex *rssilvl_regex;
@@ -446,6 +448,56 @@ reset (MMIfaceModem *self,
 }
 
 /*****************************************************************************/
+/* Model loading (Modem interface) */
+
+static gchar *
+load_model_finish (MMIfaceModem *self,
+                   GAsyncResult *res,
+                   GError **error)
+{
+    if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
+        return NULL;
+
+    return g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+}
+
+static void
+parent_load_model_ready (MMIfaceModem *_self,
+                         GAsyncResult *res,
+                         GSimpleAsyncResult *simple)
+{
+    MMBroadbandModemHuawei *self = MM_BROADBAND_MODEM_HUAWEI (_self);
+    GError *error = NULL;
+    gchar *model;
+
+    model = iface_modem_parent->load_model_finish (_self, res, &error);
+    if (model) {
+        g_assert (!self->priv->model);
+        self->priv->model = g_strdup (model);
+        g_simple_async_result_set_op_res_gpointer (simple, model, NULL);
+    } else
+        g_simple_async_result_take_error (simple, error);
+
+    g_simple_async_result_complete (simple);
+    g_object_unref (simple);
+}
+
+static void
+load_model (MMIfaceModem *self,
+            GAsyncReadyCallback callback,
+            gpointer user_data)
+{
+    /* Run parent's loading */
+    iface_modem_parent->load_model (
+        MM_IFACE_MODEM (self),
+        (GAsyncReadyCallback)parent_load_model_ready,
+        g_simple_async_result_new (G_OBJECT (self),
+                                   callback,
+                                   user_data,
+                                   load_model));
+}
+
+/*****************************************************************************/
 /* Load access technologies (Modem interface) */
 
 static MMModemAccessTechnology
@@ -2953,6 +3005,7 @@ finalize (GObject *object)
 {
     MMBroadbandModemHuawei *self = MM_BROADBAND_MODEM_HUAWEI (object);
 
+    g_free (self->priv->model);
     g_regex_unref (self->priv->rssi_regex);
     g_regex_unref (self->priv->rssilvl_regex);
     g_regex_unref (self->priv->hrssilvl_regex);
@@ -2977,6 +3030,8 @@ iface_modem_init (MMIfaceModem *iface)
 
     iface->reset = reset;
     iface->reset_finish = reset_finish;
+    iface->load_model = load_model;
+    iface->load_model_finish = load_model_finish;
     iface->load_access_technologies = load_access_technologies;
     iface->load_access_technologies_finish = load_access_technologies_finish;
     iface->load_unlock_retries = load_unlock_retries;
-- 
1.8.3



More information about the ModemManager-devel mailing list