net-config: Notify network configuration changes using dbus signal 74/163774/4
authorSaurav Babu <saurav.babu@samsung.com>
Wed, 13 Dec 2017 09:45:09 +0000 (15:15 +0530)
committertaesub kim <taesub.kim@samsung.com>
Mon, 18 Dec 2017 07:02:06 +0000 (16:02 +0900)
This patch notifies network configuration changes like Connection Type,
IPv4 Address, IPv6 Address and Proxy Address using dbus signal

Change-Id: Icb10274d6306637770e847e575f4ea9644e2f9ab
Signed-off-by: Saurav Babu <saurav.babu@samsung.com>
src/network-state.c
src/signal-handler.c
src/utils/emulator.c

index 99b2d62..61c5242 100755 (executable)
@@ -716,17 +716,37 @@ static void __netconfig_update_default_connection_info(void)
        const char *ip_addr6 = netconfig_get_default_ipaddress6();
        const char *proxy_addr = netconfig_get_default_proxy();
        unsigned int freq = netconfig_get_default_frequency();
+       GVariantBuilder *builder;
+       GVariant *params;
 
        if (emulator_is_emulated() == TRUE) {
-               if (ip_addr != NULL)
+               builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+               if (ip_addr != NULL) {
                        netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr);
-               else
+                       g_variant_builder_add(builder, "{sv}", "IPv4Address",
+                                                                 g_variant_new_string(ip_addr));
+               } else {
                        netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "");
+                       g_variant_builder_add(builder, "{sv}", "IPv4Address",
+                                                                 g_variant_new_string(""));
+               }
 
-               if (ip_addr6 != NULL)
+               if (ip_addr6 != NULL) {
                        netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ip_addr6);
-               else
+                       g_variant_builder_add(builder, "{sv}", "IPv6Address",
+                                                                 g_variant_new_string(ip_addr6));
+               } else {
                        netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "");
+                       g_variant_builder_add(builder, "{sv}", "IPv6Address",
+                                                                 g_variant_new_string(""));
+               }
+
+               params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+
+               netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                                  NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
+                                                  params);
 
                return;
        }
@@ -734,18 +754,36 @@ static void __netconfig_update_default_connection_info(void)
        if (profile == NULL)
                DBG("Reset network state configuration");
        else
-               DBG("profile[%s] ipv4(%s) ipv6(%s) proxy(%s)", profile, ip_addr, ip_addr6, proxy_addr);
+               DBG("profile[%s] ipv4(%s) ipv6(%s) proxy(%s)", profile, ip_addr,
+                       ip_addr6, proxy_addr);
 
        netconfig_vconf_get_int(VCONFKEY_NETWORK_STATUS, &old_network_status);
 
        if (profile == NULL && old_network_status != VCONFKEY_NETWORK_OFF) {
+               builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
                netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_OFF);
+               g_variant_builder_add(builder, "{sv}", "NetworkStatus",
+                                                         g_variant_new_int32(VCONFKEY_NETWORK_OFF));
 
                netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "");
+               g_variant_builder_add(builder, "{sv}", "IPv4Address",
+                                                         g_variant_new_string(""));
+
                netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "");
+               g_variant_builder_add(builder, "{sv}", "IPv6Address",
+                                                         g_variant_new_string(""));
+
                netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, "");
+               g_variant_builder_add(builder, "{sv}", "ProxyAddress",
+                                                         g_variant_new_string(""));
+
+               params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
 
                netconfig_set_vconf_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 0);
+               netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                                  NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
+                                                  params);
                netconfig_set_vconf_int("memory/private/wifi/frequency", 0);
 
                DBG("Successfully clear IP and PROXY up");
@@ -755,8 +793,13 @@ static void __netconfig_update_default_connection_info(void)
                char *old_ip6 = vconf_get_str(VCONFKEY_NETWORK_IP6);
                char *old_proxy = vconf_get_str(VCONFKEY_NETWORK_PROXY);
 
+               builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
                if (netconfig_is_wifi_profile(profile) == TRUE) {
-                       netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_WIFI);
+                       netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS,
+                                                                       VCONFKEY_NETWORK_WIFI);
+                       g_variant_builder_add(builder, "{sv}", "NetworkStatus",
+                                                         g_variant_new_int32(VCONFKEY_NETWORK_WIFI));
                        netconfig_set_vconf_int("memory/private/wifi/frequency", freq);
 
                        netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
@@ -774,52 +817,84 @@ static void __netconfig_update_default_connection_info(void)
                                return;
                        }
 
-                       netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_CELLULAR);
+                       netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS,
+                                                                       VCONFKEY_NETWORK_CELLULAR);
+                       g_variant_builder_add(builder, "{sv}", "NetworkStatus",
+                                                         g_variant_new_int32(VCONFKEY_NETWORK_CELLULAR));
 
                        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_vconf_int(VCONFKEY_NETWORK_STATUS,
+                                                                       VCONFKEY_NETWORK_ETHERNET);
+                       g_variant_builder_add(builder, "{sv}", "NetworkStatus",
+                                                         g_variant_new_int32(VCONFKEY_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_vconf_int(VCONFKEY_NETWORK_STATUS,
+                                                                       VCONFKEY_NETWORK_BLUETOOTH);
+                       g_variant_builder_add(builder, "{sv}", "NetworkStatus",
+                                                         g_variant_new_int32(VCONFKEY_NETWORK_BLUETOOTH));
                        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_vconf_int(VCONFKEY_NETWORK_STATUS,
+                                                                       VCONFKEY_NETWORK_OFF);
+                       g_variant_builder_add(builder, "{sv}", "NetworkStatus",
+                                                         g_variant_new_int32(VCONFKEY_NETWORK_OFF));
                        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)
+                       if (ip_addr != NULL) {
                                netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr);
-                       else if (old_ip != NULL && strlen(old_ip) > 0)
+                               g_variant_builder_add(builder, "{sv}", "IPv4Address",
+                                                                 g_variant_new_string(ip_addr));
+                       } else if (old_ip != NULL && strlen(old_ip) > 0) {
                                netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "");
+                               g_variant_builder_add(builder, "{sv}", "IPv4Address",
+                                                                 g_variant_new_string(""));
+                       }
                }
                if (old_ip)
                        free(old_ip);
 
                if (g_strcmp0(old_ip6, ip_addr6) != 0 || old_ip6 == NULL) {
-                       if (ip_addr6 != NULL)
+                       if (ip_addr6 != NULL) {
                                netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ip_addr6);
-                       else if (old_ip6 != NULL && strlen(old_ip6) > 0)
+                               g_variant_builder_add(builder, "{sv}", "IPv6Address",
+                                                                 g_variant_new_string(ip_addr6));
+                       } else if (old_ip6 != NULL && strlen(old_ip6) > 0) {
                                netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "");
+                               g_variant_builder_add(builder, "{sv}", "IPv6Address",
+                                                                 g_variant_new_string(""));
+                       }
                }
                if (old_ip6)
                        free(old_ip6);
 
                if (g_strcmp0(old_proxy, proxy_addr) != 0) {
-                       if (proxy_addr == NULL)
+                       if (proxy_addr == NULL) {
                                netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, "");
-                       else
+                               g_variant_builder_add(builder, "{sv}", "ProxyAddress",
+                                                                 g_variant_new_string(""));
+                       } else {
                                netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, proxy_addr);
+                               g_variant_builder_add(builder, "{sv}", "ProxyAddress",
+                                                                 g_variant_new_string(proxy_addr));
+                       }
                }
                if (old_proxy)
                        free(old_proxy);
 
+               params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+
                netconfig_set_vconf_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 1);
+               netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                                  NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
+                                                  params);
 
                DBG("Successfully update default network configuration");
        }
index f53b49a..b9720a8 100755 (executable)
@@ -105,12 +105,15 @@ typedef void (*connman_signal_cb)(GDBusConnection *conn,
                const gchar *name, const gchar *path, const gchar *interface,
                const gchar *sig, GVariant *param, gpointer user_data);
 
-static void __netconfig_extract_ipv4_signal_data(GVariant *dictionary, const gchar *profile)
+static void __netconfig_extract_ipv4_signal_data(GVariant *dictionary,
+               const gchar *profile)
 {
        gchar *key = NULL;
        const gchar *value = NULL;
        GVariant *var = NULL;
        GVariantIter iter;
+       GVariantBuilder *builder;
+       GVariant *params;
 
        g_variant_iter_init(&iter, dictionary);
        while (g_variant_iter_loop(&iter, "{sv}", &key, &var)) {
@@ -118,24 +121,42 @@ static void __netconfig_extract_ipv4_signal_data(GVariant *dictionary, const gch
                        g_variant_get(var, "&s", &value);
                        char *old_ip = vconf_get_str(VCONFKEY_NETWORK_IP);
 
-                       DBG("Old IPv4.Address [%s] Received new IPv4.Address [%s]", old_ip, value);
+                       DBG("Old IPv4.Address [%s] Received new IPv4.Address [%s]", old_ip,
+                                                 value);
                        if (g_strcmp0(old_ip, value) != 0) {
-                               if (value != NULL)
+                               builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+                               if (value != NULL) {
                                        vconf_set_str(VCONFKEY_NETWORK_IP, value);
-                               else if (old_ip != NULL && strlen(old_ip) > 0)
+                                       g_variant_builder_add(builder, "{sv}", "IPv4Address",
+                                                                 g_variant_new_string(value));
+                               } else if (old_ip != NULL && strlen(old_ip) > 0) {
                                        vconf_set_str(VCONFKEY_NETWORK_IP, "");
+                                       g_variant_builder_add(builder, "{sv}", "IPv4Address",
+                                                                 g_variant_new_string(""));
+                               }
+
+                               params = g_variant_new("(@a{sv})",
+                                                                          g_variant_builder_end(builder));
+
+                               netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                                  NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
+                                                  params);
                        }
                        free(old_ip);
                }
        }
 }
 
-static void __netconfig_extract_ipv6_signal_data(GVariant *dictionary, const gchar *profile)
+static void __netconfig_extract_ipv6_signal_data(GVariant *dictionary,
+                                                                                                const gchar *profile)
 {
        gchar *key = NULL;
        const gchar *value = NULL;
        GVariant *var = NULL;
        GVariantIter iter;
+       GVariantBuilder *builder;
+       GVariant *params;
 
        g_variant_iter_init(&iter, dictionary);
        while (g_variant_iter_loop(&iter, "{sv}", &key, &var)) {
@@ -143,12 +164,27 @@ static void __netconfig_extract_ipv6_signal_data(GVariant *dictionary, const gch
                        g_variant_get(var, "&s", &value);
                        char *old_ip6 = vconf_get_str(VCONFKEY_NETWORK_IP6);
 
-                       DBG("Old IPv6.Address [%s] Received new IPv6.Address [%s]", old_ip6, value);
+                       DBG("Old IPv6.Address [%s] Received new IPv6.Address [%s]", old_ip6,
+                                                       value);
                        if (g_strcmp0(old_ip6, value) != 0) {
-                               if (value != NULL)
+                               builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+                               if (value != NULL) {
                                        vconf_set_str(VCONFKEY_NETWORK_IP6, value);
-                               else if (old_ip6 != NULL && strlen(old_ip6) > 0)
+                                       g_variant_builder_add(builder, "{sv}", "IPv6Address",
+                                                                 g_variant_new_string(value));
+                               } else if (old_ip6 != NULL && strlen(old_ip6) > 0) {
                                        vconf_set_str(VCONFKEY_NETWORK_IP6, "");
+                                       g_variant_builder_add(builder, "{sv}", "IPv6Address",
+                                                                 g_variant_new_string(""));
+                               }
+
+                               params = g_variant_new("(@a{sv})",
+                                                                          g_variant_builder_end(builder));
+
+                               netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                                  NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
+                                                  params);
                        }
                        free(old_ip6);
                }
@@ -356,9 +392,13 @@ static void _service_signal_cb(GDBusConnection *conn,
 
                g_variant_get(variant, "a{sv}", &iter);
                while (g_variant_iter_loop(iter, "{sv}", &property, &var)) {
+                       GVariantBuilder *builder;
+                       GVariant *sig_params;
                        if (g_strcmp0(property, "Servers") == 0) {
                                GVariantIter *iter_sub = NULL;
 
+                               builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
                                g_variant_get(var, "as", &iter_sub);
                                g_variant_iter_loop(iter_sub, "s", &value);
                                g_variant_iter_free(iter_sub);
@@ -366,6 +406,16 @@ static void _service_signal_cb(GDBusConnection *conn,
                                DBG("Proxy - [%s]", value);
                                vconf_set_str(VCONFKEY_NETWORK_PROXY, value);
 
+                               g_variant_builder_add(builder, "{sv}", "ProxyAddress",
+                                                               g_variant_new_string(value));
+
+                               sig_params = g_variant_new("(@a{sv})",
+                                                               g_variant_builder_end(builder));
+
+                               netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                                  NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
+                                                  sig_params);
+
                                g_free(property);
                                g_variant_unref(var);
                                break;
@@ -373,8 +423,20 @@ static void _service_signal_cb(GDBusConnection *conn,
                                value = g_variant_get_string(var, NULL);
                                DBG("Method - [%s]", value);
 
-                               if (g_strcmp0(value, "direct") == 0)
+                               if (g_strcmp0(value, "direct") == 0) {
+                                       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
                                        vconf_set_str(VCONFKEY_NETWORK_PROXY, "");
+                                       g_variant_builder_add(builder, "{sv}", "ProxyAddress",
+                                                               g_variant_new_string(""));
+
+                                       sig_params = g_variant_new("(@a{sv})",
+                                                               g_variant_builder_end(builder));
+
+                                       netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                                          NETCONFIG_NETWORK_INTERFACE,
+                                                          "NetworkConfigChanged", sig_params);
+                               }
 
                                g_free(property);
                                g_variant_unref(var);
index f8629d3..29f1ab9 100755 (executable)
@@ -29,6 +29,7 @@
 #include "log.h"
 #include "emulator.h"
 #include "util.h"
+#include "netdbus.h"
 
 static gboolean netconfig_is_emulated = FALSE;
 
@@ -62,6 +63,8 @@ static void __netconfig_emulator_set_ip(void)
        char ip[30] = { 0, };
        int sockfd = 0;
        struct ifreq ifr;
+       GVariantBuilder *builder;
+       GVariant *params;
 
        sockfd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
        if (sockfd < 0) {
@@ -85,27 +88,62 @@ static void __netconfig_emulator_set_ip(void)
                        inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr), 30);
 
        vconf_set_str(VCONFKEY_NETWORK_IP, ip);
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       g_variant_builder_add(builder, "{sv}", "IPv4Address",
+                                                 g_variant_new_string(ip));
+
+       params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+
+       netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                  NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged", params);
 }
 
 static void __netconfig_emulator_set_proxy(void)
 {
        const char HTTP_PROXY[] = "http_proxy";
        char *proxy = NULL;
+       GVariantBuilder *builder;
+       GVariant *params;
 
        proxy = netconfig_get_env(HTTP_PROXY);
        DBG("Get system proxy: %s", proxy);
 
        if (proxy != NULL) {
                vconf_set_str(VCONFKEY_NETWORK_PROXY, proxy);
+
+               builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+               g_variant_builder_add(builder, "{sv}", "ProxyAddress",
+                                                         g_variant_new_string(proxy));
+
+               params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+
+               netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                                  NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
+                                                  params);
+
                free(proxy);
        }
 }
 
 static void __netconfig_emulator_set_network_state(void)
 {
+       GVariantBuilder *builder;
+       GVariant *params;
+
        vconf_set_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 1);
        vconf_set_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_ETHERNET);
        vconf_set_int(VCONFKEY_DNET_STATE, VCONFKEY_DNET_NORMAL_CONNECTED);
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+       g_variant_builder_add(builder, "{sv}", "NetworkStatus",
+                                         g_variant_new_int32(VCONFKEY_NETWORK_ETHERNET));
+
+       params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+
+       netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
+                                  NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged", params);
 }
 
 static void __netconfig_emulator_config_emul_env(void)