loopback: Return a More Descriptive Error Code
[framework/connectivity/connman.git] / plugins / ofono.c
index e5b786e..5a60882 100644 (file)
@@ -32,7 +32,6 @@
 
 #define CONNMAN_API_SUBJECT_TO_CHANGE
 #include <connman/plugin.h>
-#include <connman/element.h>
 #include <connman/device.h>
 #include <connman/network.h>
 #include <connman/ipconfig.h>
@@ -90,6 +89,7 @@ struct modem_data {
        connman_bool_t registered;
        connman_bool_t roaming;
        uint8_t strength, has_strength;
+       char *operator;
 };
 
 struct network_info {
@@ -356,6 +356,7 @@ static void remove_modem(gpointer data)
        modem_remove_device(modem);
 
        g_free(modem->path);
+       g_free(modem->operator);
 
        g_free(modem);
 }
@@ -364,6 +365,7 @@ static void remove_network(gpointer data)
 {
        struct network_info *info = data;
 
+       connman_network_unregister(info->network);
        connman_network_unref(info->network);
 
        g_free(info);
@@ -416,6 +418,8 @@ static gboolean pending_network_is_available(struct connman_network *network)
 static void set_connected(struct network_info *info,
                                connman_bool_t connected)
 {
+       gboolean setip = FALSE;
+
        DBG("network %p connected %d", info->network, connected);
 
        switch (info->ipv4_method) {
@@ -423,20 +427,20 @@ static void set_connected(struct network_info *info,
        case CONNMAN_IPCONFIG_METHOD_OFF:
        case CONNMAN_IPCONFIG_METHOD_MANUAL:
        case CONNMAN_IPCONFIG_METHOD_AUTO:
-               return;
+               break;
 
        case CONNMAN_IPCONFIG_METHOD_FIXED:
                connman_network_set_ipv4_method(info->network,
                                                        info->ipv4_method);
                connman_network_set_ipaddress(info->network,
                                                        &info->ipv4_address);
-
+               setip = TRUE;
                break;
 
        case CONNMAN_IPCONFIG_METHOD_DHCP:
                connman_network_set_ipv4_method(info->network,
                                                        info->ipv4_method);
-
+               setip = TRUE;
                break;
        }
 
@@ -446,18 +450,19 @@ static void set_connected(struct network_info *info,
        case CONNMAN_IPCONFIG_METHOD_MANUAL:
        case CONNMAN_IPCONFIG_METHOD_DHCP:
        case CONNMAN_IPCONFIG_METHOD_AUTO:
-               return;
+               break;
 
        case CONNMAN_IPCONFIG_METHOD_FIXED:
                connman_network_set_ipv6_method(info->network,
                                                        info->ipv6_method);
                connman_network_set_ipaddress(info->network,
                                                        &info->ipv6_address);
-
+               setip = TRUE;
                break;
        }
 
-       connman_network_set_connected(info->network, connected);
+       if (setip == TRUE)
+               connman_network_set_connected(info->network, connected);
 }
 
 static void set_active_reply(DBusPendingCall *call, void *user_data)
@@ -805,8 +810,6 @@ static int add_network(struct connman_device *device,
        struct connman_network *network;
        struct network_info *info;
        char *ident;
-       const char *hash_path;
-       char const *operator;
        dbus_bool_t active = FALSE;
 
        DBG("modem %p device %p path %s", modem, device, path);
@@ -830,8 +833,11 @@ static int add_network(struct connman_device *device,
        if (network == NULL)
                return -ENOMEM;
 
+       connman_network_register(network);
+
        info = g_try_new0(struct network_info, 1);
        if (info == NULL) {
+               connman_network_unregister(network);
                connman_network_unref(network);
                return -ENOMEM;
        }
@@ -841,24 +847,16 @@ static int add_network(struct connman_device *device,
        info->network = network;
 
        connman_network_set_string(network, "Path", path);
-       hash_path = connman_network_get_string(network, "Path");
-       if (hash_path == NULL) {
-               connman_network_unref(network);
-               g_free(info);
-               return -EIO;
-       }
 
        create_service(network);
 
-       connman_network_ref(network);
-       g_hash_table_insert(network_hash, (char *) hash_path, info);
+       g_hash_table_insert(network_hash, (char *) path, info);
 
        connman_network_set_available(network, TRUE);
        connman_network_set_index(network, -1);
 
-       operator = connman_device_get_string(device, "Operator");
-       if (operator)
-               connman_network_set_name(network, operator);
+       if (modem->operator)
+               connman_network_set_name(network, modem->operator);
 
        if (modem->has_strength)
                connman_network_set_strength(network, modem->strength);
@@ -881,7 +879,7 @@ static int add_network(struct connman_device *device,
                        dbus_message_iter_get_basic(&value, &type);
                        if (g_strcmp0(type, "internet") != 0) {
                                DBG("path %p type %s", path, type);
-                               goto error;
+                               return -EIO;
                        }
                } else if (g_str_equal(key, "Settings"))
                        update_ipv4_settings(&value, info);
@@ -894,18 +892,13 @@ static int add_network(struct connman_device *device,
        }
 
        if (connman_device_add_network(device, network) != 0)
-               goto error;
+               return -EIO;
 
        /* Connect only if requested to do so */
        if (active && connman_network_get_connecting(network) == TRUE)
                set_connected(info, active);
 
        return 0;
-
-error:
-       connman_network_unref(network);
-       g_hash_table_remove(network_hash, hash_path);
-       return -EIO;
 }
 
 static void check_networks_reply(DBusPendingCall *call, void *user_data)
@@ -992,7 +985,9 @@ static void modem_operator_name_changed(struct modem_data *modem,
        if (device == NULL)
                return;
 
-       connman_device_set_string(device, "Operator", name);
+       if (modem->operator != NULL)
+               g_free(modem->operator);
+       modem->operator = g_strdup(name);
 
        for (g_hash_table_iter_init(&i, network_hash);
             g_hash_table_iter_next(&i, NULL, &value);) {