summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)