Update vconf for IPv6 address
[platform/core/connectivity/net-config.git] / src / network-state.c
index ab6051a..1a6b775 100755 (executable)
@@ -28,9 +28,6 @@
 #include <sys/ioctl.h>
 #include <ITapiSim.h>
 #include <TapiUtility.h>
-#include <bundle.h>
-#include <bundle_internal.h>
-#include <eventsystem.h>
 
 #include "log.h"
 #include "util.h"
@@ -44,7 +41,6 @@
 #include "network-monitor.h"
 #include "netsupplicant.h"
 #include "wifi-tel-intf.h"
-#include "clatd-handler.h"
 
 #include "generated-code.h"
 /* Define TCP buffer sizes for various networks */
@@ -165,20 +161,41 @@ static char *__netconfig_get_default_profile(void)
 static void __netconfig_get_default_connection_info(const char *profile)
 {
        GVariant *message = NULL, *variant = NULL, *variant2 = NULL;
-       GVariantIter *iter = NULL, *iter1 = NULL;
+       GVariantIter *iter = NULL, *iter1 = NULL,  *service = NULL;
        GVariant *next = NULL;
+       gchar *obj_path;
        gchar *key = NULL;
        gchar *key1 = NULL;
        gchar *key2 = NULL;
+       gboolean found_profile = 0;
 
-       message = netconfig_invoke_dbus_method(CONNMAN_SERVICE, profile,
-                       CONNMAN_SERVICE_INTERFACE, "GetProperties", NULL);
+       message = netconfig_invoke_dbus_method(CONNMAN_SERVICE,
+                       CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE,
+                       "GetServices", NULL);
        if (message == NULL) {
-               ERR("Failed to get service properties");
+               ERR("Failed to get services informations");
+               goto done;
+       }
+
+       g_variant_get(message, "(a(oa{sv}))", &service);
+       if (service == NULL) {
+               ERR("Failed to get services iter");
+               goto done;
+       }
+
+       while (g_variant_iter_loop(service, "(oa{sv})", &obj_path, &iter)) {
+               if (g_strcmp0(obj_path, profile) == 0) {
+                       g_free(obj_path);
+                       found_profile = 1;
+                       break;
+               }
+       }
+
+       if (iter == NULL || found_profile == 0) {
+               ERR("Profile %s doesn't exist", profile);
                goto done;
        }
 
-       g_variant_get(message, "(a{sv})", &iter);
        while (g_variant_iter_loop(iter, "{sv}", &key, &next)) {
                const gchar *value = NULL;
                guint16 freq = 0;
@@ -191,30 +208,42 @@ static void __netconfig_get_default_connection_info(const char *profile)
                        }
                } else if (g_strcmp0(key, "Ethernet") == 0) {
                        g_variant_get(next, "a{sv}", &iter1);
+                       if (iter1 == NULL)
+                               continue;
                        while (g_variant_iter_loop(iter1, "{sv}", &key1, &variant)) {
                                if (g_strcmp0(key1, "Interface") == 0) {
                                        value = g_variant_get_string(variant, NULL);
                                        netconfig_default_connection_info.ifname = g_strdup(value);
                                }
                        }
+                       g_variant_iter_free(iter1);
                } else if (g_strcmp0(key, "IPv4") == 0) {
                        g_variant_get(next, "a{sv}", &iter1);
+                       if (iter1 == NULL)
+                               continue;
                        while (g_variant_iter_loop(iter1, "{sv}", &key1, &variant)) {
                                if (g_strcmp0(key1, "Address") == 0) {
                                        value = g_variant_get_string(variant, NULL);
                                        netconfig_default_connection_info.ipaddress = g_strdup(value);
                                }
                        }
+                       g_variant_iter_free(iter1);
                } else if (g_strcmp0(key, "IPv6") == 0) {
                        g_variant_get(next, "a{sv}", &iter1);
+                       if (iter1 == NULL)
+                               continue;
                        while (g_variant_iter_loop(iter1, "{sv}", &key1, &variant)) {
                                if (g_strcmp0(key1, "Address") == 0) {
                                        value = g_variant_get_string(variant, NULL);
                                        netconfig_default_connection_info.ipaddress6 = g_strdup(value);
                                }
                        }
+                       g_variant_iter_free(iter1);
+
                } else if (g_strcmp0(key, "Proxy") == 0) {
                        g_variant_get(next, "a{sv}", &iter1);
+                       if (iter1 == NULL)
+                               continue;
                        while (g_variant_iter_loop(iter1, "{sv}", &key2, &variant2)) {
                                GVariantIter *iter_sub = NULL;
 
@@ -248,6 +277,7 @@ static void __netconfig_get_default_connection_info(const char *profile)
                                        }
                                }
                        }
+                       g_variant_iter_free(iter1);
                } else if (g_strcmp0(key, "Frequency") == 0) {
                        if (g_variant_is_of_type(next, G_VARIANT_TYPE_UINT16)) {
                                freq = g_variant_get_uint16(next);
@@ -263,8 +293,8 @@ done:
        if (iter)
                g_variant_iter_free(iter);
 
-       if (iter1)
-               g_variant_iter_free(iter1);
+       if (service)
+               g_variant_iter_free(service);
 
        return;
 }
@@ -416,15 +446,20 @@ static void __netconfig_update_default_connection_info(void)
        const char *proxy_addr = netconfig_get_default_proxy();
        unsigned int freq = netconfig_get_default_frequency();
 
-       if (emulator_is_emulated() == TRUE)
+       if (emulator_is_emulated() == TRUE) {
+               if (ip_addr != NULL)
+                       netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr);
+               else
+                       netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "");
                return;
+       }
 
        if (profile == NULL)
                DBG("Reset network state configuration");
        else
-               DBG("%s: ip(%s) proxy(%s)", profile, ip_addr, proxy_addr);
+               DBG("%s: ip(%s) ip6(%s) proxy(%s)", profile, ip_addr, ip_addr6, proxy_addr);
 
-       vconf_get_int(VCONFKEY_NETWORK_STATUS, &old_network_status);
+       netconfig_vconf_get_int(VCONFKEY_NETWORK_STATUS, &old_network_status);
 
        if (profile == NULL && old_network_status != VCONFKEY_NETWORK_OFF) {
                netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_OFF);
@@ -437,18 +472,17 @@ static void __netconfig_update_default_connection_info(void)
 
                DBG("Successfully clear IP and PROXY up");
 
-               /* Disable clatd if it is in running state */
-               netconfig_clatd_disable();
        } else if (profile != NULL) {
                char *old_ip = vconf_get_str(VCONFKEY_NETWORK_IP);
+               char *old_ip6 = vconf_get_str(VCONFKEY_NETWORK_IP6);
                char *old_proxy = vconf_get_str(VCONFKEY_NETWORK_PROXY);
 
                if (netconfig_is_wifi_profile(profile) == TRUE) {
                        netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_WIFI);
                        netconfig_set_vconf_int("memory/private/wifi/frequency", freq);
 
-                       netconfig_set_system_event(SYS_EVENT_NETWORK_STATUS,
-                               EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_WIFI);
+                       netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
+                               EKEY_NETWORK_STATUS, EVAL_NETWORK_WIFI);
                } else if (netconfig_is_cellular_profile(profile)) {
 
                        if (!netconfig_is_cellular_internet_profile(profile)) {
@@ -458,36 +492,38 @@ static void __netconfig_update_default_connection_info(void)
 
                        netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_CELLULAR);
 
-                       netconfig_set_system_event(SYS_EVENT_NETWORK_STATUS,
-                               EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_CELLULAR);
-
-                       /* Enable clatd if IPv6 is set and no IPv4 address */
-                       if (!ip_addr && ip_addr6)
-                               netconfig_clatd_enable();
+                       netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
+                               EKEY_NETWORK_STATUS, EVAL_NETWORK_CELLULAR);
                } else if (netconfig_is_ethernet_profile(profile) == TRUE) {
                        netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_ETHERNET);
-                       netconfig_set_system_event(SYS_EVENT_NETWORK_STATUS,
-                               EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_ETHERNET);
+                       netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
+                               EKEY_NETWORK_STATUS, EVAL_NETWORK_ETHERNET);
                } else if (netconfig_is_bluetooth_profile(profile) == TRUE) {
                        netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_BLUETOOTH);
-                       netconfig_set_system_event(SYS_EVENT_NETWORK_STATUS,
-                               EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_BT);
+                       netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
+                               EKEY_NETWORK_STATUS, EVAL_NETWORK_BT);
                } else{
                        netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_OFF);
-                       netconfig_set_system_event(SYS_EVENT_NETWORK_STATUS,
-                               EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_DISCONNECTED);
+                       netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
+                               EKEY_NETWORK_STATUS, EVAL_NETWORK_DISCONNECTED);
                }
 
                if (g_strcmp0(old_ip, ip_addr) != 0 || old_ip == NULL) {
                        if (ip_addr != NULL)
                                netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr);
-                       else if (ip_addr6 != NULL)
-                               netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr6);
                        else
                                netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "");
                }
                g_free(old_ip);
 
+               if (g_strcmp0(old_ip6, ip_addr6) != 0 || old_ip6 == NULL) {
+                       if (ip_addr6 != NULL)
+                               netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ip_addr6);
+                       else
+                               netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "");
+               }
+               g_free(old_ip6);
+
                if (g_strcmp0(old_proxy, proxy_addr) != 0) {
                        if (proxy_addr == NULL)
                                netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, "");
@@ -499,10 +535,6 @@ static void __netconfig_update_default_connection_info(void)
                netconfig_set_vconf_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 1);
 
                DBG("Successfully update default network configuration");
-
-               /* Disable clatd if it is in running state */
-               if (netconfig_is_cellular_profile(profile) != TRUE)
-                       netconfig_clatd_disable();
        }
 
        __netconfig_adjust_tcp_buffer_size();
@@ -620,44 +652,23 @@ done:
 
 static void __netconfig_network_notify_result(const char *sig_name, const char *key)
 {
-       gboolean reply;
+       GVariantBuilder *builder;
        GVariant *params;
-       GVariantBuilder *builder = NULL;
-       GDBusConnection *connection = NULL;
-       GError *error = NULL;
-       const char *prop_key = "key";
 
        INFO("[Signal] %s %s", sig_name, key);
 
-       connection = netdbus_get_connection();
-       if (connection == NULL) {
-               ERR("Failed to get GDBus Connection");
-               return;
-       }
-
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
-       g_variant_builder_add(builder, "{sv}", prop_key, g_variant_new_string(key));
-       params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+       g_variant_builder_add(builder, "{sv}", "key", g_variant_new_string(key));
 
+       params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
        g_variant_builder_unref(builder);
 
-       reply = g_dbus_connection_emit_signal(connection,
-                       NULL,
-                       NETCONFIG_NETWORK_PATH,
-                       NETCONFIG_NETWORK_INTERFACE,
-                       sig_name,
-                       params,
-                       &error);
-
-       if (reply != TRUE) {
-               if (error != NULL) {
-                       ERR("Failed to send signal [%s]", error->message);
-                       g_error_free(error);
-               }
-               return;
-       }
+       netconfig_dbus_emit_signal(NULL,
+                               NETCONFIG_NETWORK_PATH,
+                               NETCONFIG_NETWORK_INTERFACE,
+                               sig_name,
+                               params);
 
-       INFO("Sent signal (%s), key (%s)", sig_name, key);
        return;
 }
 
@@ -823,28 +834,48 @@ void netconfig_update_default(void)
 char *netconfig_get_ifname(const char *profile)
 {
        GVariant *message = NULL, *variant;
-       GVariantIter *iter, *next;
+       GVariantIter *iter, *next, *service;
+       gchar *obj_path;
        gchar *key;
        gchar *key1;
        const gchar *value = NULL;
        gchar *ifname = NULL;
+       gboolean found_profile = 0;
 
        if (profile == NULL)
                return NULL;
 
-       message = netconfig_invoke_dbus_method(CONNMAN_SERVICE, profile,
-                       CONNMAN_SERVICE_INTERFACE, "GetProperties", NULL);
+       message = netconfig_invoke_dbus_method(CONNMAN_SERVICE,
+                       CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE,
+                       "GetServices", NULL);
        if (message == NULL) {
-               ERR("Failed to get service properties");
+               ERR("Failed to get services informations");
+               return NULL;
+       }
+
+       g_variant_get(message, "(a(oa{sv}))", &service);
+       while (g_variant_iter_loop(service, "(oa{sv})", &obj_path, &iter)) {
+               if (g_strcmp0(obj_path, profile) == 0) {
+                       g_free(obj_path);
+                       found_profile = 1;
+                       break;
+               }
+       }
+
+       if (found_profile == 0) {
+               ERR("Profile %s doesn't exist", profile);
+               g_variant_iter_free(service);
+               g_variant_unref(message);
                return NULL;
        }
 
-       g_variant_get(message, "(a{sv})", &iter);
        while (g_variant_iter_loop(iter, "{sv}", &key, &next)) {
                if (g_strcmp0(key, "Ethernet") == 0) {
                        while (g_variant_iter_loop(next, "{sv}", &key1, &variant)) {
                                if (g_strcmp0(key1, "Interface") == 0) {
                                        value = g_variant_get_string(variant, NULL);
+                                       if (ifname)
+                                               g_free(ifname);
                                        ifname = g_strdup(value);
                                }
                        }
@@ -853,6 +884,7 @@ char *netconfig_get_ifname(const char *profile)
 
        g_variant_unref(message);
 
+       g_variant_iter_free(service);
        g_variant_iter_free(iter);
 
        return ifname;
@@ -1011,6 +1043,13 @@ static gboolean handle_check_profile_privilege(Network *object,
        return TRUE;
 }
 
+static gboolean handle_check_internet_privilege(Network *object,
+               GDBusMethodInvocation *context)
+{
+       network_complete_check_internet_privilege(object, context);
+       return TRUE;
+}
+
 gboolean handle_ethernet_cable_state(Network *object,
        GDBusMethodInvocation *context)
 {
@@ -1051,16 +1090,14 @@ void state_object_create_and_init(void)
                                G_CALLBACK(handle_check_get_privilege), NULL);
        g_signal_connect(netconfigstate, "handle-check-profile-privilege",
                                G_CALLBACK(handle_check_profile_privilege), NULL);
+       g_signal_connect(netconfigstate, "handle-check-internet-privilege",
+                               G_CALLBACK(handle_check_internet_privilege), NULL);
        g_signal_connect(netconfigstate, "handle-ethernet-cable-state",
                                G_CALLBACK(handle_ethernet_cable_state), NULL);
        g_signal_connect(netconfigstate, "handle-remove-route",
                                G_CALLBACK(handle_remove_route), NULL);
        g_signal_connect(netconfigstate, "handle-launch-mdns",
                                G_CALLBACK(handle_launch_mdns), NULL);
-       g_signal_connect(netconfigstate, "handle-ref-mdns",
-                               G_CALLBACK(handle_ref_mdns), NULL);
-       g_signal_connect(netconfigstate, "handle-unref-mdns",
-                               G_CALLBACK(handle_unref_mdns), NULL);
        g_signal_connect(netconfigstate, "handle-device-policy-set-wifi",
                                G_CALLBACK(handle_device_policy_set_wifi), NULL);
        g_signal_connect(netconfigstate, "handle-device-policy-get-wifi",