<HTML><HEAD></HEAD><BODY id="enrich@telit.com"><!--?xml version="1.0" encoding="UTF-8"?-->
<p>
<table style="height: 80%;" border="0" cellspacing="0" cellpadding="0" width="95%" id="imp_template" class="enrich@telit.com">
<tbody>
<tr height="80%">
<td id="etexttd" class="mceNonEditable mceNonResizeable" style="padding:10px;" width="100%" valign="top">
<div id="imp_emailtext" class="mceNonEditable mceNonResizeable"><br />On giovedì 30 giugno 2016 15:54:48 CEST Aleksander Morgado wrote:<br />> Hey Carlo!<br />> <br />> On Thu, Jun 30, 2016 at 1:36 PM, Carlo Lobrano <c.lobrano@gmail.com> wrote:<br />> > BaseModem<br />> >   added reprobe property.<br />> ><br />> > MMDevice<br />> >   added logic to recreate the modem if it is set invalid and "to reprobe"<br />> ><br />> > MMBroadbandModem<br />> >  * added initialization step for SIM hot swap:<br />> >     1. keep dedicated ports open to listen to modem's unsolicited<br />> >     2. dedicated error management in case of initialization failure due to SIM missing<br />> >  * added function to be called in order to act upon SIM insertion/removal:<br />> >     1. close dedicated ports<br />> >     2. set the modem to be reprobed<br />> >     3. disable modem<br />> ><br />> > MMIfaceModem<br />> >  * added initialization step for SIM hot swap, if supported by the plugin<br />> >  * dedicated error management in case of initialization failure due to SIM missing<br />> > ---<br />> >  src/mm-base-modem.c      |  26 ++++++++++<br />> >  src/mm-base-modem.h      |   4 ++<br />> >  src/mm-broadband-modem.c | 126 ++++++++++++++++++++++++++++++++++++++++-------<br />> >  src/mm-broadband-modem.h |   5 ++<br />> >  src/mm-device.c          |  15 ++++++<br />> >  src/mm-iface-modem.c     |  41 +++++++++++++++<br />> >  src/mm-iface-modem.h     |   9 ++++<br />> >  7 files changed, 209 insertions(+), 17 deletions(-)<br />> ><br />> > diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c<br />> > index 9cd7c5f..ede014b 100644<br />> > --- a/src/mm-base-modem.c<br />> > +++ b/src/mm-base-modem.c<br />> > @@ -47,6 +47,7 @@ enum {<br />> >      PROP_VENDOR_ID,<br />> >      PROP_PRODUCT_ID,<br />> >      PROP_CONNECTION,<br />> > +    PROP_REPROBE,<br />> >      PROP_LAST<br />> >  };<br />> ><br />> > @@ -70,6 +71,7 @@ struct _MMBaseModemPrivate {<br />> ><br />> >      gboolean hotplugged;<br />> >      gboolean valid;<br />> > +    gboolean reprobe;<br />> ><br />> >      guint max_timeouts;<br />> ><br />> > @@ -392,6 +394,24 @@ mm_base_modem_set_valid (MMBaseModem *self,<br />> >      }<br />> >  }<br />> ><br />> > +void<br />> > +mm_base_modem_set_reprobe (MMBaseModem *self,<br />> > +                           gboolean reprobe)<br />> > +{<br />> > +    g_return_if_fail (MM_IS_BASE_MODEM (self));<br />> > +<br />> > +    self->priv->reprobe = reprobe;<br />> > +}<br />> > +<br />> > +gboolean<br />> > +mm_base_modem_get_reprobe (MMBaseModem *self)<br />> > +{<br />> > +    g_return_val_if_fail (MM_IS_BASE_MODEM (self), FALSE);<br />> > +<br />> > +    return self->priv->reprobe;<br />> > +}<br />> > +<br />> > +<br />> >  gboolean<br />> >  mm_base_modem_get_valid (MMBaseModem *self)<br />> >  {<br />> > @@ -1295,6 +1315,9 @@ set_property (GObject *object,<br />> >      case PROP_VALID:<br />> >          mm_base_modem_set_valid (self, g_value_get_boolean (value));<br />> >          break;<br />> > +    case PROP_REPROBE:<br />> > +        mm_base_modem_set_reprobe (self, g_value_get_boolean (value));<br />> > +        break;<br />> >      case PROP_MAX_TIMEOUTS:<br />> >          self->priv->max_timeouts = g_value_get_uint (value);<br />> >          break;<br />> > @@ -1338,6 +1361,9 @@ get_property (GObject *object,<br />> >      case PROP_VALID:<br />> >          g_value_set_boolean (value, self->priv->valid);<br />> >          break;<br />> > +    case PROP_REPROBE:<br />> > +        g_value_set_boolean (value, self->priv->reprobe);<br />> > +        break;<br />> >      case PROP_MAX_TIMEOUTS:<br />> >          g_value_set_uint (value, self->priv->max_timeouts);<br />> >          break;<br />> > diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h<br />> > index 3c0d16f..c4bcdce 100644<br />> > --- a/src/mm-base-modem.h<br />> > +++ b/src/mm-base-modem.h<br />> > @@ -166,6 +166,10 @@ void     mm_base_modem_set_valid    (MMBaseModem *self,<br />> >                                       gboolean valid);<br />> >  gboolean mm_base_modem_get_valid    (MMBaseModem *self);<br />> ><br />> > +void     mm_base_modem_set_reprobe (MMBaseModem *self,<br />> > +                                    gboolean reprobe);<br />> > +gboolean mm_base_modem_get_reprobe (MMBaseModem *self);<br />> > +<br />> >  const gchar  *mm_base_modem_get_device  (MMBaseModem *self);<br />> >  const gchar **mm_base_modem_get_drivers (MMBaseModem *self);<br />> >  const gchar  *mm_base_modem_get_plugin  (MMBaseModem *self);<br />> > diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c<br />> > index e1fd7ca..38fabed 100644<br />> > --- a/src/mm-broadband-modem.c<br />> > +++ b/src/mm-broadband-modem.c<br />> > @@ -124,6 +124,7 @@ typedef struct _PortsContext PortsContext;<br />> >  struct _MMBroadbandModemPrivate {<br />> >      /* Broadband modem specific implementation */<br />> >      PortsContext *enabled_ports_ctx;<br />> > +    PortsContext *sim_hot_swap_ports_ctx;<br />> >      gboolean modem_init_run;<br />> ><br />> >      /*<--- Modem interface --->*/<br />> > @@ -8317,6 +8318,11 @@ disabling_stopped (MMBroadbandModem *self,<br />> >          ports_context_unref (self->priv->enabled_ports_ctx);<br />> >          self->priv->enabled_ports_ctx = NULL;<br />> >      }<br />> > +<br />> > +    if (self->priv->sim_hot_swap_ports_ctx) {<br />> > +        ports_context_unref (self->priv->sim_hot_swap_ports_ctx);<br />> > +        self->priv->sim_hot_swap_ports_ctx = NULL;<br />> > +    }<br />> >      return TRUE;<br />> >  }<br />> ><br />> > @@ -9435,6 +9441,7 @@ typedef enum {<br />> >      INITIALIZE_STEP_IFACE_SIGNAL,<br />> >      INITIALIZE_STEP_IFACE_OMA,<br />> >      INITIALIZE_STEP_IFACE_FIRMWARE,<br />> > +    INITIALIZE_STEP_SIM_HOT_SWAP,<br />> >      INITIALIZE_STEP_IFACE_SIMPLE,<br />> >      INITIALIZE_STEP_LAST,<br />> >  } InitializeStep;<br />> > @@ -9776,6 +9783,38 @@ initialize_step (InitializeContext *ctx)<br />> >                                              ctx);<br />> >          return;<br />> ><br />> > +    case INITIALIZE_STEP_SIM_HOT_SWAP:<br />> > +        {<br />> > +            gboolean is_sim_hot_swap_supported = FALSE;<br />> > +<br />> > +            g_object_get(MM_BASE_MODEM (ctx->self),<br />> > +                         IS_SIM_HOT_SWAP_SUPPORTED_PROPERTY,<br />> > +                         &is_sim_hot_swap_supported,<br />> > +                         NULL);<br />> > +<br />> > +            if (!is_sim_hot_swap_supported) {<br />> > +                ctx->self->priv->sim_hot_swap_ports_ctx = NULL;<br />> > +            } else {<br />> > +                PortsContext *ports;<br />> > +                GError *error = NULL;<br />> > +<br />> > +                mm_dbg ("Modem supports SIM hot swap. Opening dedicated ports.");<br />> > +<br />> > +                ports = g_new0 (PortsContext, 1);<br />> > +                ports->ref_count = 1;<br />> > +<br />> > +                if (!open_ports_enabling (ctx->self, ports, FALSE, &error)) {<br />> > +                    g_prefix_error (&error, "Couldn't open ports during Modem SIM hot swap enabling: ");<br />> > +                    g_simple_async_result_take_error (ctx->result, error);<br />> <br />> Shouldn't the context be finished here? You're setting the error in<br />> the GSimpleAsyncResult, but it is not being completed anywhere.<br />> _<br /><br />Uhm, you're right. So, basically unref PortsContext and leave a log about the error would be enough? <br /><br /><br />> > +                } else {<br />> > +                    ctx->self->priv->sim_hot_swap_ports_ctx = ports_context_ref (ports);<br />> > +                    ports_context_unref (ports);<br />> > +                }<br />> > +            }<br />> > +        }<br />> > +        /* Fall down to next step */<br />> > +        ctx->step++;<br />> > +<br />> >      case INITIALIZE_STEP_IFACE_SIMPLE:<br />> >          if (ctx->self->priv->modem_state != MM_MODEM_STATE_FAILED)<br />> >              mm_iface_modem_simple_initialize (MM_IFACE_MODEM_SIMPLE (ctx->self));<br />> > @@ -9796,23 +9835,45 @@ initialize_step (InitializeContext *ctx)<br />> >                                                   "cannot fully initialize");<br />> >              } else {<br />> >                  /* Fatal SIM, firmware, or modem failure :-( */<br />> > -                g_simple_async_result_set_error (ctx->result,<br />> > -                                                 MM_CORE_ERROR,<br />> > -                                                 MM_CORE_ERROR_WRONG_STATE,<br />> > -                                                 "Modem is unusable, "<br />> > -                                                 "cannot fully initialize");<br />> > -                /* Ensure we only leave the Modem, OMA, and Firmware interfaces<br />> > -                 * around.  A failure could be caused by firmware issues, which<br />> > -                 * a firmware update, switch, or provisioning could fix.<br />> > -                 */<br />> > -                mm_iface_modem_3gpp_shutdown (MM_IFACE_MODEM_3GPP (ctx->self));<br />> > -                mm_iface_modem_3gpp_ussd_shutdown (MM_IFACE_MODEM_3GPP_USSD (ctx->self));<br />> > -                mm_iface_modem_cdma_shutdown (MM_IFACE_MODEM_CDMA (ctx->self));<br />> > -                mm_iface_modem_location_shutdown (MM_IFACE_MODEM_LOCATION (ctx->self));<br />> > -                mm_iface_modem_messaging_shutdown (MM_IFACE_MODEM_MESSAGING (ctx->self));<br />> > -                mm_iface_modem_voice_shutdown (MM_IFACE_MODEM_VOICE (ctx->self));<br />> > -                mm_iface_modem_time_shutdown (MM_IFACE_MODEM_TIME (ctx->self));<br />> > -                mm_iface_modem_simple_shutdown (MM_IFACE_MODEM_SIMPLE (ctx->self));<br />> > +                gboolean is_sim_hot_swap_supported = FALSE;<br />> > +                MMModemStateFailedReason reason =<br />> > +                    mm_gdbus_modem_get_state_failed_reason (<br />> > +                        (MmGdbusModem*)ctx->self->priv->modem_dbus_skeleton);<br />> > +<br />> > +                g_object_get(MM_BASE_MODEM (ctx->self),<br />> > +                             IS_SIM_HOT_SWAP_SUPPORTED_PROPERTY,<br />> > +                             &is_sim_hot_swap_supported,<br />> > +                             NULL);<br />> > +<br />> > +                if (reason == MM_MODEM_STATE_FAILED_REASON_SIM_MISSING &&<br />> > +                    is_sim_hot_swap_supported) {<br />> > +                        mm_info("SIM is missing, but the modem supports SIM hot insertion. Waiting for SIM...");<br />> > +                        g_simple_async_result_set_error (ctx->result,<br />> > +                                                         MM_CORE_ERROR,<br />> > +                                                         MM_CORE_ERROR_WRONG_STATE,<br />> > +                                                         "Modem is unusable due to SIM missing, "<br />> > +                                                         "cannot fully initialize, "<br />> > +                                                         "waiting for SIM insertion.");<br />> > +                } else {<br />> > +                    mm_dbg ("SIM is missing and Modem does not support SIM Hot Swap");<br />> > +                    g_simple_async_result_set_error (ctx->result,<br />> > +                                                     MM_CORE_ERROR,<br />> > +                                                     MM_CORE_ERROR_WRONG_STATE,<br />> > +                                                     "Modem is unusable, "<br />> > +                                                     "cannot fully initialize");<br />> > +                    /* Ensure we only leave the Modem, OMA, and Firmware interfaces<br />> > +                     * around.  A failure could be caused by firmware issues, which<br />> > +                     * a firmware update, switch, or provisioning could fix.<br />> > +                     */<br />> > +                    mm_iface_modem_3gpp_shutdown (MM_IFACE_MODEM_3GPP (ctx->self));<br />> > +                    mm_iface_modem_3gpp_ussd_shutdown (MM_IFACE_MODEM_3GPP_USSD (ctx->self));<br />> > +                    mm_iface_modem_cdma_shutdown (MM_IFACE_MODEM_CDMA (ctx->self));<br />> > +                    mm_iface_modem_location_shutdown (MM_IFACE_MODEM_LOCATION (ctx->self));<br />> > +                    mm_iface_modem_messaging_shutdown (MM_IFACE_MODEM_MESSAGING (ctx->self));<br />> > +                    mm_iface_modem_voice_shutdown (MM_IFACE_MODEM_VOICE (ctx->self));<br />> > +                    mm_iface_modem_time_shutdown (MM_IFACE_MODEM_TIME (ctx->self));<br />> > +                    mm_iface_modem_simple_shutdown (MM_IFACE_MODEM_SIMPLE (ctx->self));<br />> > +                }<br />> >              }<br />> >              initialize_context_complete_and_free (ctx);<br />> >              return;<br />> > @@ -9960,6 +10021,37 @@ mm_broadband_modem_create_device_identifier (MMBroadbandModem *self,<br />> >                      MM_GDBUS_MODEM (MM_BROADBAND_MODEM (self)->priv->modem_dbus_skeleton))));<br />> >  }<br />> ><br />> > +<br />> > +/*****************************************************************************/<br />> > +static void<br />> > +disable_ready (MMBaseModem *self,<br />> > +               GAsyncResult *res,<br />> > +               gpointer user_data)<br />> <br />> How about renaming this as "after_hotswap_event_disable_ready"?<br />> <br /><br />Agree<br /><br />> > +{<br />> > +    GError *error = NULL;<br />> > +    if (!mm_base_modem_disable_finish (self, res, &error)) {<br />> > +        mm_err ("Disable modem error: %s", error->message);<br />> <br />> GError leaks here.<br />> <br />> > +    } else {<br />> > +      mm_base_modem_set_valid (MM_BASE_MODEM (self), FALSE);<br />> > +    }<br />> > +}<br />> > +<br />> > +<br />> > +void mm_broadband_modem_update_sim_hot_swap_status (MMBroadbandModem *self,<br />> > +                                                    gboolean is_sim_missing)<br />> > +{<br />> > +    if (self->priv->sim_hot_swap_ports_ctx) {<br />> > +        mm_dbg ("Releasing SIM hot swap ports context");<br />> > +        ports_context_unref (self->priv->sim_hot_swap_ports_ctx);<br />> > +        self->priv->sim_hot_swap_ports_ctx = NULL;<br />> > +    }<br />> > +<br />> > +    mm_base_modem_set_reprobe (MM_BASE_MODEM (self), TRUE);<br />> > +    mm_base_modem_disable (MM_BASE_MODEM (self),<br />> > +                           (GAsyncReadyCallback)disable_ready,<br />> > +                           NULL);<br />> > +}<br />> > +<br />> >  /*****************************************************************************/<br />> ><br />> >  MMBroadbandModem *<br />> > diff --git a/src/mm-broadband-modem.h b/src/mm-broadband-modem.h<br />> > index 93ffeb5..ca5bab3 100644<br />> > --- a/src/mm-broadband-modem.h<br />> > +++ b/src/mm-broadband-modem.h<br />> > @@ -127,5 +127,10 @@ gboolean mm_broadband_modem_lock_sms_storages_finish (MMBroadbandModem *self,<br />> >  void     mm_broadband_modem_unlock_sms_storages      (MMBroadbandModem *self,<br />> >                                                        gboolean mem1,<br />> >                                                        gboolean mem2);<br />> > +/* Helper to update SIM hot swap */<br />> > +void mm_broadband_modem_update_sim_hot_swap_status (MMBroadbandModem *self,<br />> > +                                                    gboolean is_sim_missing);<br />> > +<br />> > +<br />> ><br />> >  #endif /* MM_BROADBAND_MODEM_H */<br />> > diff --git a/src/mm-device.c b/src/mm-device.c<br />> > index 2456cc8..abc8f30 100644<br />> > --- a/src/mm-device.c<br />> > +++ b/src/mm-device.c<br />> > @@ -489,8 +489,23 @@ modem_valid (MMBaseModem *modem,<br />> >               MMDevice    *self)<br />> >  {<br />> >      if (!mm_base_modem_get_valid (modem)) {<br />> > +        GDBusObjectManagerServer *object_manager = self->priv->object_manager;<br />> > +<br />> >          /* Modem no longer valid */<br />> >          mm_device_remove_modem (self);<br />> > +<br />> > +        if (mm_base_modem_get_reprobe (modem)) {<br />> > +            GError *error = NULL;<br />> > +<br />> > +            if (!mm_device_create_modem (self, object_manager, &error)) {<br />> > +                 mm_warn ("Could not recreate modem for device at '%s': %s",<br />> > +                         mm_device_get_path(self),<br />> > +                         error ? error->message : "unknown");<br />> > +                g_error_free (error);<br />> > +            } else {<br />> > +                mm_dbg ("Modem recreated for device '%s'", mm_device_get_path(self));<br />> > +            }<br />> > +        }<br />> >      } else {<br />> >          /* Modem now valid, export it, but only if we really have it around.<br />> >           * It may happen that the initialization sequence fails because the<br />> > diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c<br />> > index 516ed78..9aa6df8 100644<br />> > --- a/src/mm-iface-modem.c<br />> > +++ b/src/mm-iface-modem.c<br />> > @@ -3745,6 +3745,7 @@ typedef enum {<br />> >      INITIALIZATION_STEP_DEVICE_ID,<br />> >      INITIALIZATION_STEP_SUPPORTED_MODES,<br />> >      INITIALIZATION_STEP_SUPPORTED_BANDS,<br />> > +    INITIALIZATION_STEP_SIM_HOT_SWAP,<br />> >      INITIALIZATION_STEP_SUPPORTED_IP_FAMILIES,<br />> >      INITIALIZATION_STEP_POWER_STATE,<br />> >      INITIALIZATION_STEP_UNLOCK_REQUIRED,<br />> > @@ -4203,6 +4204,22 @@ load_current_bands_ready (MMIfaceModem *self,<br />> >      interface_initialization_step (ctx);<br />> >  }<br />> ><br />> > +/*****************************************************************************/<br />> > +/* Setup SIM hot swap (Modem interface) */<br />> > +static void<br />> > +setup_sim_hot_swap_ready (MMIfaceModem *self,<br />> > +                          GAsyncResult *res,<br />> > +                          gpointer user_data) {<br />> > +    GError *error = NULL;<br />> > +<br />> > +    MM_IFACE_MODEM_GET_INTERFACE (self)->setup_sim_hot_swap_finish (self, res, &error);<br />> > +    if (error)<br />> > +        mm_warn ("SIM hot swap setup failed: '%s'", error->message);<br />> <br />> error leaks.<br />> <br />> > +    else<br />> > +        mm_dbg ("SIM hot swap setup succeded");<br />> > +}<br />> > +<br />> >  static void<br />> >  interface_initialization_step (InitializationContext *ctx)<br />> >  {<br />> > @@ -4544,6 +4561,15 @@ interface_initialization_step (InitializationContext *ctx)<br />> >          /* Fall down to next step */<br />> >          ctx->step++;<br />> ><br />> > +    case INITIALIZATION_STEP_SIM_HOT_SWAP:<br />> > +        if (MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->setup_sim_hot_swap &&<br />> > +            MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->setup_sim_hot_swap_finish) {<br />> > +            MM_IFACE_MODEM_GET_INTERFACE (ctx->self)->setup_sim_hot_swap (<br />> > +                MM_IFACE_MODEM (ctx->self),<br />> > +                (GAsyncReadyCallback) setup_sim_hot_swap_ready,<br />> > +                NULL);<br />> <br />> A return is missing here.<br />> <br />> > +        }<br />> <br />> And the ctx->step++; is missing here.<br />> <br />> > +<br />> >      case INITIALIZATION_STEP_UNLOCK_REQUIRED:<br />> >          /* Only check unlock required if we were previously not unlocked */<br />> >          if (mm_gdbus_modem_get_unlock_required (ctx->skeleton) != MM_MODEM_LOCK_NONE) {<br />> > @@ -4707,6 +4733,21 @@ interface_initialization_step (InitializationContext *ctx)<br />> >                            ctx->self);<br />> ><br />> >          if (ctx->fatal_error) {<br />> > +            if (g_error_matches (ctx->fatal_error,<br />> > +                                 MM_MOBILE_EQUIPMENT_ERROR,<br />> > +                                 MM_MOBILE_EQUIPMENT_ERROR_SIM_NOT_INSERTED)) {<br />> > +                gboolean is_sim_hot_swap_supported = FALSE;<br />> > +<br />> > +                g_object_get(MM_BASE_MODEM (ctx->self),<br />> > +                             IS_SIM_HOT_SWAP_SUPPORTED_PROPERTY,<br />> > +                             &is_sim_hot_swap_supported,<br />> > +                             NULL);<br />> > +<br />> > +                if(is_sim_hot_swap_supported) {<br />> <br />> A whitespace before the open-parenthesis is missing.<br />> <br />> > +                    mm_iface_modem_update_failed_state (ctx->self,<br />> > +                                                        MM_MODEM_STATE_FAILED_REASON_SIM_MISSING);<br />> > +                }<br />> > +            }<br />> >              g_simple_async_result_take_error (ctx->result, ctx->fatal_error);<br />> >              ctx->fatal_error = NULL;<br />> >          } else {<br />> > diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h<br />> > index 74ea9f9..eabb0be 100644<br />> > --- a/src/mm-iface-modem.h<br />> > +++ b/src/mm-iface-modem.h<br />> > @@ -36,6 +36,7 @@<br />> >  #define MM_IFACE_MODEM_STATE         "iface-modem-state"<br />> >  #define MM_IFACE_MODEM_SIM           "iface-modem-sim"<br />> >  #define MM_IFACE_MODEM_BEARER_LIST   "iface-modem-bearer-list"<br />> > +#define IS_SIM_HOT_SWAP_SUPPORTED_PROPERTY "is-sim-hot-swap-supported"<br />> <br />> Property name should be prefixed with "MM_IFACE_MODEM", something like:<br />> #define MM_IFACE_MODEM_SIM_HOTSWAP_SUPPORTED<br />> "iface-modem-sim-hotswap-supported".<br />> <br />> ><br />> >  typedef struct _MMIfaceModem MMIfaceModem;<br />> ><br />> > @@ -327,6 +328,14 @@ struct _MMIfaceModem {<br />> >      MMBaseBearer * (*create_bearer_finish) (MMIfaceModem *self,<br />> >                                              GAsyncResult *res,<br />> >                                              GError **error);<br />> > +    /* Setup SIM hot swap */<br />> > +    void (*setup_sim_hot_swap) (MMIfaceModem *self,<br />> > +                                GAsyncReadyCallback callback,<br />> > +                                gpointer user_data);<br />> > +<br />> > +    gboolean (*setup_sim_hot_swap_finish) (MMIfaceModem *self,<br />> > +                                            GAsyncResult *res,<br />> > +                                            GError **error);<br />> >  };<br />> ><br />> >  GType mm_iface_modem_get_type (void);<br />> > --<br />> > 2.7.4<br />> ><br />> <br />> I see that the property defined in the mm-iface-modem isn't<br />> implemented by any of the base objects, and that is not right. The<br />> property must be implemented by MMBroadbandModem, so that getting the<br />> property doesn't fail (it likely doesn't fail for you in your tests<br />> because you implemented the property in the telit plugin in the next<br />> patch).<br />> <br /><br />I did tried without the plugin part, but I didn't see that problem.<br />To implement the property in MMBroadbandModem, do you mean like PROP_MODEM_SIM? I can use that as example?<br /><br />Thanks,<br />Carlo<br /><br /></div>
</td>
</tr>
<tr height="20%">
<td width="100%">
<table id="row2" style="height: 100%; font-family: Arial,Helvetica,sans-serif;" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td width="100%">
<table border="0">
<tbody>
<tr>
<td> <table id="autoSig" style="height: 100%; font-family: Arial,Helvetica,sans-serif;" border="0" cellspacing="0" cellpadding="2" width="100%">
<tbody>
<tr>
<td width="100%">
<table border="0" width="95%" align="left">
<tbody>
<tr>
<td colspan="2"><span style="font-family: arial,helvetica,sans-serif; color: #003366;"><strong>Carlo Lobrano <br /></strong></span></td>
</tr>
<tr>
<td colspan="2"><span style="font-family: arial,helvetica,sans-serif; color: #003366;">Senior Software Engineer, R&D <br /></span></td>
</tr>
<tr>
<td rowspan="3" width="100"><span style="font-family: arial,helvetica,sans-serif; color: #003366;"><img class="embedded_img" src="cid:imp_0.17188316821618388_autosig_Image_01" border="0" alt="Link" width="87" height="50" / style=" max-width:100%;"></span></td>
<td id="optional" valign="top"><span style="font-family: arial,helvetica,sans-serif; color: #003366;">T:<strong> </strong>  </span><span style="font-family: arial,helvetica,sans-serif; color: #003366;">+39 040 4192 560</span></td>
</tr>
<tr>
<TD>
</TD></tr>
<tr>
<td valign="top"><span style="font-family: arial,helvetica,sans-serif; color: #003366;"><a style="text-decoration: none; color:inherit;" id="rt" href="mailto:carlo.lobrano@telit.com"><strong style="text-decoration: none; color:inherit; font-weight:inherit;">carlo.lobrano@telit.com</strong></a></span></td>
</tr>
<tr>
<td colspan="2"><span style="font-family: arial,helvetica,sans-serif; color: #003366;"><img class="embedded_img" src="cid:imp_0.039725162470001574_autosig_Image_02" border="0" alt="Link" width="291" height="7" / style=" max-width:100%;"></span></td>
</tr>
<tr>
<td id="rt" style="font-family: arial,helvetica,sans-serif; color: #003366;" width="100"><a id="rt" href="http://www.telit.com">www.telit.com</a></td>
<td>
<table border="0">
<tbody>
<tr>
<td>        <br /></td>
<td><span style="font-family: arial,helvetica,sans-serif; color: #003366;"><a href="http://robustus.impactia.com/AnalyticServer/redirect?cid=15fbbe1bb7e142c9&mid=76947797&eurl=aHR0cDovL3d3dy55b3V0dWJlLmNvbS90ZWxpdGNvbW11bmljYXRpb25z&istmp=enrich@telit.com"><img class="embedded_img" src="cid:imp_0.6218734870792751_autosig_Image_03" border="0" alt="Link" / style=" max-width:100%;"></a></span></td>
<td><a href="http://robustus.impactia.com/AnalyticServer/redirect?cid=15fbbe1bb7e142c9&mid=76947797&eurl=aHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vK3RlbGl0&istmp=enrich@telit.com"><img class="embedded_img" src="cid:imp_0.8457206401702098_autosig_Image_04" border="0" alt="Link" / style=" max-width:100%;"></a></td>
<td><span style="font-family: arial,helvetica,sans-serif; color: #003366;"><a href="http://robustus.impactia.com/AnalyticServer/redirect?cid=15fbbe1bb7e142c9&mid=76947797&eurl=aHR0cHM6Ly90d2l0dGVyLmNvbS9UZWxpdF9XU19jb3Jw&istmp=enrich@telit.com"><img class="embedded_img" src="cid:imp_0.9103346379094965_autosig_Image_05" border="0" alt="Link" / style=" max-width:100%;"></a></span></td>
<td><span style="font-family: arial,helvetica,sans-serif; color: #003366;"><a href="http://robustus.impactia.com/AnalyticServer/redirect?cid=15fbbe1bb7e142c9&mid=76947797&eurl=aHR0cDovL2ZhY2Vib29rLmNvbS90ZWxpdHdpcmVsZXNz&istmp=enrich@telit.com"><img class="embedded_img" src="cid:imp_0.482301495721167_autosig_Image_06" border="0" alt="Link" / style=" max-width:100%;"></a></span></td>
<td><span style="font-family: arial,helvetica,sans-serif; color: #003366;"><a href="http://robustus.impactia.com/AnalyticServer/redirect?cid=15fbbe1bb7e142c9&mid=76947797&eurl=aHR0cDovL3d3dy5saW5rZWRpbi5jb20vY29tcGFueS90ZWxpdC13aXJlbGVzcy1zb2x1dGlvbnM=&istmp=enrich@telit.com"><img class="embedded_img" src="cid:imp_0.45394717426594733_autosig_Image_07" border="0" alt="Link" / style=" max-width:100%;"></a></span></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table> <br /></td>
</tr>
<tr>
<td><img class="embedded_img" src="cid:imp_0.46485045878752673_Image_01" border="0" alt="Link" / style=" max-width:100%;"><br /> 
<table border="0" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td rowspan="6"><span style="font-size: xx-small; font-family: verdana,geneva;"><span style="color: #808080;">This electronic message, including attachments, is intended only for the use of the individual or company named above or to which it is addressed.<br /> The information contained in this message shall be considered confidential and proprietary, and may include confidential work product. If you are not the intended recipient, please be aware that any unauthorized use, dissemination, <br />distribution or copying of this message is strictly prohibited. If you have received this email in error, please notify the sender by replying to this message and deleting this email immediately. <br /></span><br /><span style="color: #808080;">To the extent this email includes an offer to buy Telit products or an order confirmation, the offer or order confirmation is governed by Telit’s General Terms and Conditions of Sale, which are published <a id="rt" href="http://www.telit.com/terms-and-conditions/">here</a>.<br /></span></span><span style="font-size: xx-small; font-family: verdana,geneva;"><span style="color: #808080;"><br /></span></span></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>

</p><div id="footer" class="mceNonEditable mceNonResizeable" dir="ltr">
<hr size="1" noshade="65535" />
<span style="font-size: 7.5pt; font-family: Arial,sans-serif; color: #808080;"><br /></span></div>
</p></BODY></HTML>