summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorDaniel Wagner <daniel.wagner@bmw-carit.de>2011-12-21 14:06:15 +0100
committerDaniel Wagner <daniel.wagner@bmw-carit.de>2011-12-22 11:10:15 +0100
commitc444ef294e46ce96f5120d6ed8b9429ace095cce (patch)
tree365d65ad3bd3f15a7fdc48bd9d0d7b342406350d /plugins
parent6726eb11c18d84d3e473af7b37648e2daf94fc0c (diff)
downloadconnman-c444ef294e46ce96f5120d6ed8b9429ace095cce.tar.gz
connman-c444ef294e46ce96f5120d6ed8b9429ace095cce.tar.bz2
connman-c444ef294e46ce96f5120d6ed8b9429ace095cce.zip
ofono: Handle add/remove of API separatly
Simplify the way the interface apperance and disapperance are handled and write them explicitly out. This is not extremly fast or elegant but it is much more readable and maintainable. Also unregister the network object when the modem goes offline. Fixes BMC#24432
Diffstat (limited to 'plugins')
-rw-r--r--plugins/ofono.c186
1 files changed, 122 insertions, 64 deletions
diff --git a/plugins/ofono.c b/plugins/ofono.c
index 0dd0fe00..c27dc1ac 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -153,6 +153,24 @@ struct modem_data {
DBusPendingCall *call_get_contexts;
};
+static const char *api2string(enum ofono_api api)
+{
+ switch (api) {
+ case OFONO_API_SIM:
+ return "sim";
+ case OFONO_API_NETREG:
+ return "netreg";
+ case OFONO_API_CM:
+ return "cm";
+ case OFONO_API_CDMA_NETREG:
+ return "cdma-netreg";
+ case OFONO_API_CDMA_CM:
+ return "cmda-cm";
+ }
+
+ return "unknown";
+}
+
static char *get_ident(const char *path)
{
char *pos;
@@ -981,6 +999,20 @@ static void add_network(struct modem_data *modem)
}
}
+static void remove_network(struct modem_data *modem)
+{
+ DBG("%s", modem->path);
+
+ if (modem->network == NULL)
+ return;
+
+ DBG("network %p", modem->network);
+
+ connman_device_remove_network(modem->device, modem->network);
+ connman_network_unref(modem->network);
+ modem->network = NULL;
+}
+
static int add_cm_context(struct modem_data *modem, const char *context_path,
DBusMessageIter *dict)
{
@@ -1731,30 +1763,6 @@ static int cdma_cm_get_properties(struct modem_data *modem)
cdma_cm_properties_reply, modem);
}
-static connman_bool_t connection_manager_init(struct modem_data *modem)
-{
- if (has_interface(modem->interfaces, OFONO_API_CM) == TRUE) {
- if (modem->device != NULL) {
- cm_get_properties(modem);
- cm_get_contexts(modem);
- }
-
- return TRUE;
- }
-
- if (has_interface(modem->interfaces, OFONO_API_CDMA_CM) == TRUE) {
- if (ready_to_create_device(modem) == TRUE)
- create_device(modem);
-
- if (modem->device != NULL)
- cdma_cm_get_properties(modem);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
static void sim_update_imsi(struct modem_data *modem,
DBusMessageIter* value)
{
@@ -1850,6 +1858,88 @@ static int sim_get_properties(struct modem_data *modem)
sim_properties_reply, modem);
}
+static connman_bool_t api_added(uint8_t old_iface, uint8_t new_iface,
+ enum ofono_api api)
+{
+ if (has_interface(old_iface, api) == FALSE &&
+ has_interface(new_iface, api) == TRUE) {
+ DBG("%s added", api2string(api));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static connman_bool_t api_removed(uint8_t old_iface, uint8_t new_iface,
+ enum ofono_api api)
+{
+ if (has_interface(old_iface, api) == TRUE &&
+ has_interface(new_iface, api) == FALSE) {
+ DBG("%s removed", api2string(api));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void modem_update_interfaces(struct modem_data *modem,
+ uint8_t old_ifaces,
+ uint8_t new_ifaces)
+{
+ DBG("%s", modem->path);
+
+ if (api_added(old_ifaces, new_ifaces, OFONO_API_SIM) == TRUE) {
+ if (modem->imsi == NULL &&
+ modem->set_powered == FALSE) {
+ /*
+ * Only use do GetProperties() when
+ * device has not been powered up.
+ */
+ sim_get_properties(modem);
+ }
+ }
+
+ if (api_added(old_ifaces, new_ifaces, OFONO_API_CM) == TRUE) {
+ if (modem->device != NULL) {
+ cm_get_properties(modem);
+ cm_get_contexts(modem);
+ }
+ }
+
+ if (api_added(old_ifaces, new_ifaces, OFONO_API_CDMA_CM) == TRUE) {
+ if (ready_to_create_device(modem) == TRUE)
+ create_device(modem);
+
+ if (modem->device != NULL)
+ cdma_cm_get_properties(modem);
+ }
+
+ if (api_added(old_ifaces, new_ifaces, OFONO_API_NETREG) == TRUE) {
+ if (modem->attached == TRUE)
+ netreg_get_properties(modem);
+ }
+
+ if (api_added(old_ifaces, new_ifaces, OFONO_API_CDMA_NETREG) == TRUE) {
+ cdma_netreg_get_properties(modem);
+ }
+
+ if (api_removed(old_ifaces, new_ifaces, OFONO_API_CM) == TRUE) {
+ remove_cm_context(modem, modem->context->path);
+ }
+
+ if (api_removed(old_ifaces, new_ifaces, OFONO_API_CDMA_CM) == TRUE) {
+ remove_cm_context(modem, modem->context->path);
+ }
+
+ if (api_removed(old_ifaces, new_ifaces, OFONO_API_NETREG) == TRUE) {
+ remove_network(modem);
+ }
+
+ if (api_removed(old_ifaces, new_ifaces, OFONO_API_CDMA_NETREG == TRUE)) {
+ remove_network(modem);
+ }
+}
+
static gboolean modem_changed(DBusConnection *connection, DBusMessage *message,
void *user_data)
{
@@ -1892,41 +1982,11 @@ static gboolean modem_changed(DBusConnection *connection, DBusMessage *message,
if (interfaces == modem->interfaces)
return TRUE;
- modem->interfaces = interfaces;
+ DBG("%s Interfaces 0x%02x", modem->path, interfaces);
- DBG("%s Interfaces 0x%02x", modem->path,
- modem->interfaces);
-
- if (has_interface(modem->interfaces, OFONO_API_SIM) == TRUE) {
- if (modem->imsi == NULL &&
- modem->set_powered == FALSE) {
- /*
- * Only use do GetProperties() when
- * device has not been powered up.
- */
- sim_get_properties(modem);
- return TRUE;
- }
- }
+ modem_update_interfaces(modem, modem->interfaces, interfaces);
- if (connection_manager_init(modem) == FALSE) {
- if (modem->context != NULL) {
- remove_cm_context(modem,
- modem->context->path);
- }
-
- if (modem->device != NULL)
- destroy_device(modem);
-
- return TRUE;
- }
-
- if (has_interface(modem->interfaces, OFONO_API_NETREG) == TRUE) {
- if (modem->attached == TRUE)
- netreg_get_properties(modem);
- } else if (has_interface(modem->interfaces,
- OFONO_API_CDMA_NETREG) == TRUE)
- cdma_netreg_get_properties(modem);
+ modem->interfaces = interfaces;
} else if (g_str_equal(key, "Serial") == TRUE) {
char *serial;
@@ -1936,8 +1996,6 @@ static gboolean modem_changed(DBusConnection *connection, DBusMessage *message,
modem->serial = g_strdup(serial);
DBG("%s Serial %s", modem->path, modem->serial);
-
- connection_manager_init(modem);
}
return TRUE;
@@ -2015,12 +2073,12 @@ static void add_modem(const char *path, DBusMessageIter *prop)
if (modem->ignore == TRUE)
return;
- if (modem->powered == FALSE)
+ if (modem->powered == FALSE) {
modem_set_powered(modem, TRUE);
- else if (has_interface(modem->interfaces, OFONO_API_SIM) == TRUE)
- sim_get_properties(modem);
- else
- connection_manager_init(modem);
+ return;
+ }
+
+ modem_update_interfaces(modem, 0, modem->interfaces);
}
static void modem_power_down(gpointer key, gpointer value, gpointer user_data)