--- 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); } @@ -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); } 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); @@ -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); + } + } 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); + + 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); } 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); + } + + 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); -- 1.7.1 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman