Hi Guillaume,

> Change log from v4:
>       - Check if modem name is sent by oFono
>       - CDMA modem name is used as network name
>       - Change modem_data property from is_cdma into has_cdma
> 
>  plugins/ofono.c |  156 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 files changed, 151 insertions(+), 5 deletions(-)
> 
> diff --git a/plugins/ofono.c b/plugins/ofono.c
> index 8650bfc..88a1781 100644
> --- a/plugins/ofono.c
> +++ b/plugins/ofono.c
> @@ -50,6 +50,7 @@
>  #define OFONO_CONTEXT_INTERFACE              OFONO_SERVICE 
> ".ConnectionContext"
>  #define OFONO_SIM_INTERFACE          OFONO_SERVICE ".SimManager"
>  #define OFONO_REGISTRATION_INTERFACE OFONO_SERVICE ".NetworkRegistration"
> +#define OFONO_CDMA_INTERFACE         OFONO_SERVICE ".cdma.ConnectionManager"
>  
>  #define PROPERTY_CHANGED             "PropertyChanged"
>  #define GET_PROPERTIES                       "GetProperties"
> @@ -76,6 +77,7 @@ struct modem_data {
>       gboolean has_sim;
>       gboolean has_reg;
>       gboolean has_gprs;
> +     gboolean has_cdma;
>       gboolean available;
>       gboolean pending_online;
>       dbus_bool_t requested_online;
> @@ -337,6 +339,7 @@ static struct connman_device_driver modem_driver = {
>  
>  static void remove_device_networks(struct connman_device *device)
>  {
> +     struct modem_data *modem = connman_device_get_data(device);
>       GHashTableIter iter;
>       gpointer key, value;
>       GSList *info_list = NULL;
> @@ -362,6 +365,11 @@ static void remove_device_networks(struct connman_device 
> *device)
>               connman_device_remove_network(device, info->network);
>       }
>  
> +     if (modem->has_cdma == TRUE) {
> +             g_hash_table_remove(network_hash, "/context1");
> +             modem->has_cdma = FALSE;
> +     }
> +
>       g_slist_free(info_list);
>  }

I do not like this "/context1" stuff at all. What is wrong with just
using the modem object path that you get from oFono here. I do not
remember that devices and networks have to have distinct object paths. I
think that limitation is gone since a long time.
 
> @@ -541,25 +549,57 @@ done:
>  
>  static int set_network_active(struct connman_network *network)
>  {
> +     struct connman_device *device;
> +     struct modem_data *modem;
>       dbus_bool_t value = TRUE;
>       const char *path = connman_network_get_string(network, "Path");
>  
>       DBG("network %p, path %s", network, path);
>  
> -     return set_property(path, OFONO_CONTEXT_INTERFACE,
> -                             "Active", DBUS_TYPE_BOOLEAN, &value,
> -                             set_active_reply, g_strdup(path), g_free);
> +     device = connman_network_get_device(network);
> +     if (device == NULL)
> +             return -ENODEV;
> +
> +     modem = connman_device_get_data(device);
> +     if (modem == NULL)
> +             return -ENODEV;
> +
> +     if (modem->has_cdma == TRUE)
> +             return set_property(modem->path, OFONO_CDMA_INTERFACE,
> +                                     "Powered", DBUS_TYPE_BOOLEAN, &value,
> +                                     set_active_reply, g_strdup(modem->path),
> +                                     g_free);
> +     else
> +             return set_property(path, OFONO_CONTEXT_INTERFACE,
> +                                     "Active", DBUS_TYPE_BOOLEAN, &value,
> +                                     set_active_reply,
> +                                     g_strdup(path), g_free);
>  }

the Path should be set properly here. So I prefer that a CDMA network
object looks similar to a GSM network object.

Dragging the device object into this here seems wrong.

>  static int set_network_inactive(struct connman_network *network)
>  {
> +     struct connman_device *device;
> +     struct modem_data *modem;
>       int err;
>       dbus_bool_t value = FALSE;
>       const char *path = connman_network_get_string(network, "Path");
>  
>       DBG("network %p, path %s", network, path);
>  
> -     err = set_property(path, OFONO_CONTEXT_INTERFACE,
> +     device = connman_network_get_device(network);
> +     if (device == NULL)
> +             return -ENODEV;
> +
> +     modem = connman_device_get_data(device);
> +     if (modem == NULL)
> +             return -ENODEV;
> +
> +     if (modem->has_cdma == TRUE)
> +             err = set_property(modem->path, OFONO_CDMA_INTERFACE,
> +                                     "Powered", DBUS_TYPE_BOOLEAN, &value,
> +                                     NULL, NULL, NULL);
> +     else
> +             err = set_property(path, OFONO_CONTEXT_INTERFACE,
>                               "Active", DBUS_TYPE_BOOLEAN, &value,
>                               NULL, NULL, NULL);

Same comments as above.
 
> @@ -584,6 +624,9 @@ static int network_connect(struct connman_network 
> *network)
>       if (modem == NULL)
>               return -ENODEV;
>  
> +     if (modem->has_cdma == TRUE)
> +             return set_network_active(network);
> +
>       if (modem->registered == FALSE)
>               return -ENOLINK;
>  
> @@ -1464,6 +1507,12 @@ static gboolean modem_has_gprs(DBusMessageIter *array)
>       return modem_has_interface(array, OFONO_GPRS_INTERFACE);
>  }
>  
> +static gboolean modem_has_cdma(DBusMessageIter *array)
> +{
> +     return modem_has_interface(array,
> +                             OFONO_CDMA_INTERFACE);
> +}
> +
>  static void add_modem(const char *path, DBusMessageIter *prop)
>  {
>       struct modem_data *modem;
> @@ -1473,6 +1522,7 @@ static void add_modem(const char *path, DBusMessageIter 
> *prop)
>       gboolean has_sim = FALSE;
>       gboolean has_reg = FALSE;
>       gboolean has_gprs = FALSE;
> +     gboolean has_cdma = FALSE;
>  
>       modem = g_hash_table_lookup(modem_hash, path);
>  
> @@ -1486,6 +1536,7 @@ static void add_modem(const char *path, DBusMessageIter 
> *prop)
>       modem->path = g_strdup(path);
>       modem->device = NULL;
>       modem->available = TRUE;
> +     modem->operator = NULL;
>  
>       g_hash_table_insert(modem_hash, g_strdup(path), modem);
>  
> @@ -1507,6 +1558,7 @@ static void add_modem(const char *path, DBusMessageIter 
> *prop)
>                       has_sim = modem_has_sim(&value);
>                       has_reg = modem_has_reg(&value);
>                       has_gprs = modem_has_gprs(&value);
> +                     has_cdma = modem_has_cdma(&value);
>               }
>  
>               dbus_message_iter_next(prop);
> @@ -1521,6 +1573,7 @@ static void add_modem(const char *path, DBusMessageIter 
> *prop)
>       modem->has_sim = has_sim;
>       modem->has_reg = has_reg;
>       modem->has_gprs = has_gprs;
> +     modem->has_cdma = has_cdma;
>  
>       update_modem_online(modem, online);
>  
> @@ -1658,10 +1711,27 @@ static gboolean modem_changed(DBusConnection 
> *connection, DBusMessage *message,
>               gboolean had_reg = modem->has_reg;
>               gboolean has_gprs = modem_has_gprs(&value);
>               gboolean had_gprs = modem->has_gprs;
> +             gboolean has_cdma = modem_has_cdma(&value);
> +             gboolean had_cdma = modem->has_cdma;
>  
>               modem->has_sim = has_sim;
>               modem->has_reg = has_reg;
>               modem->has_gprs = has_gprs;
> +             modem->has_cdma = has_cdma;
> +
> +             if (has_cdma) {
> +                     if (modem->device == NULL)
> +                             return TRUE;
> +
> +                     add_network(modem->device, "/context1", NULL);
> +
> +                     return TRUE;
> +             } else {
> +                     if (has_cdma == FALSE && had_cdma == TRUE) {
> +                             modem->has_cdma = had_cdma;
> +                             modem_remove_device(modem);
> +                     }
> +             }

This is horrible :(

First of all, the second has_cdma check is implied anyway. And second,
why so complicated. This can be done surely a lot simpler.

>               if (modem->device == NULL) {
>                       if (has_sim)
> @@ -1679,6 +1749,25 @@ static gboolean modem_changed(DBusConnection 
> *connection, DBusMessage *message,
>                               check_gprs(modem);
>                       }
>               }
> +     } else if (g_str_equal(key, "Serial") == TRUE) {
> +             const char *hw_serial;
> +
> +             dbus_message_iter_get_basic(&value, &hw_serial);
> +
> +             add_device(modem->path, hw_serial);

This breaks GSM. Have you actually tested that this does not break
anything. Now in the GSM case, you just add  device with the IMEI here.

> +
> +             if (modem->has_cdma == TRUE)
> +                     add_network(modem->device, "/context1", NULL);
> +     } else if (g_str_equal(key, "Model") == TRUE) {
> +             const char *model;
> +
> +             dbus_message_iter_get_basic(&value, &model);
> +
> +             if (modem->has_cdma == TRUE)
> +                     modem->operator = g_strdup(model);
> +
> +             if (modem->device != NULL && modem->has_cdma == TRUE)
> +                     add_network(modem->device, "/context1", NULL);
>       }

So what happens if Model comes before Serial property?

>       return TRUE;
> @@ -1888,6 +1977,55 @@ static gboolean context_changed(DBusConnection 
> *connection,
>       return TRUE;
>  }
>  
> +static gboolean cdma_changed(DBusConnection *connection,
> +                                     DBusMessage *message, void *user_data)
> +{
> +     struct network_info *info;
> +     DBusMessageIter iter, value;
> +     const char *key;
> +
> +     DBG("");
> +
> +     info = g_hash_table_lookup(network_hash, "/context1");
> +     if (info == NULL)
> +             return TRUE;
> +
> +     if (!pending_network_is_available(info->network)) {
> +             g_hash_table_remove(network_hash, "/context1");
> +             return TRUE;
> +     }
> +
> +     connman_network_set_associating(info->network, FALSE);
> +
> +     if (dbus_message_iter_init(message, &iter) == FALSE)
> +             return TRUE;
> +
> +     dbus_message_iter_get_basic(&iter, &key);
> +
> +     dbus_message_iter_next(&iter);
> +     dbus_message_iter_recurse(&iter, &value);
> +
> +     DBG("key %s", key);
> +
> +     if (g_str_equal(key, "Settings") == TRUE)
> +             update_ipv4_settings(&value, info);
> +     else if (g_str_equal(key, "Powered") == TRUE) {
> +             dbus_bool_t active;
> +
> +             dbus_message_iter_get_basic(&value, &active);
> +
> +             if (active == FALSE)
> +                     set_connected(info, active);
> +
> +             /* Connect only if requested to do so */
> +             if (active == TRUE &&
> +                     connman_network_get_connecting(info->network) == TRUE)
> +                     set_connected(info, active);

Actually "... else if ..." statement exists for a reason ;)

> +     }
> +
> +     return TRUE;
> +}
> +
>  static guint watch;
>  static guint reg_watch;
>  static guint sim_watch;
> @@ -1898,6 +2036,7 @@ static guint modem_watch;
>  static guint modem_added_watch;
>  static guint modem_removed_watch;
>  static guint context_watch;
> +static guint cdma_watch;
>  
>  static int ofono_init(void)
>  {
> @@ -1964,11 +2103,17 @@ static int ofono_init(void)
>                                               context_changed,
>                                               NULL, NULL);
>  
> +     cdma_watch = g_dbus_add_signal_watch(connection, NULL, NULL,
> +                             OFONO_CDMA_INTERFACE,
> +                                             PROPERTY_CHANGED,
> +                                             cdma_changed,
> +                                             NULL, NULL);
> +
>       if (watch == 0 || gprs_watch == 0 || context_added_watch == 0 ||
>                       context_removed_watch == 0 || modem_watch == 0 ||
>                       reg_watch == 0 || sim_watch == 0 ||
>                       modem_added_watch == 0 || modem_removed_watch == 0 ||
> -                             context_watch == 0) {
> +                             context_watch == 0 || cdma_watch == 0) {
>               err = -EIO;
>               goto remove;
>       }
> @@ -1996,6 +2141,7 @@ remove:
>       g_dbus_remove_watch(connection, modem_added_watch);
>       g_dbus_remove_watch(connection, modem_removed_watch);
>       g_dbus_remove_watch(connection, context_watch);
> +     g_dbus_remove_watch(connection, cdma_watch);
>  
>       dbus_connection_unref(connection);
>  

Regards

Marcel


_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to