[dbus-plugin] Upgrading signal subscription logic. 97/83997/1 accepted/tizen/common/20160818.144042 accepted/tizen/ivi/20160818.231616 accepted/tizen/mobile/20160818.231559 accepted/tizen/tv/20160818.231608 accepted/tizen/wearable/20160818.231549 submit/tizen/20160818.002458
authorNishant Chaprana <n.chaprana@samsung.com>
Tue, 16 Aug 2016 07:25:24 +0000 (12:55 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Tue, 16 Aug 2016 07:25:24 +0000 (12:55 +0530)
This patch upgrades signal subscription logic of dbus plugin.
Currently there is a common signal handler which checks received
signal name and based on that it callss signals handler funciton.
This process is dnoe for every received signal.
If we register signals seperately then we will same extra processing
of for loop to find handler function of signal, dbus will directly call
handler function of the subscribed signal.

Change-Id: I3fa6b02bc2b215515d2caee0109f0ee43e2c3182
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
packaging/wifi-direct-manager.spec
plugin/wpasupplicant/ctrl_iface_dbus/include/wfd-plugin-wpasupplicant.h
plugin/wpasupplicant/ctrl_iface_dbus/wfd-plugin-wpasupplicant.c

index 40b1edc..219586e 100644 (file)
@@ -1,6 +1,6 @@
 Name:          wifi-direct-manager
 Summary:       Wi-Fi Direct manger
-Version:       1.2.195
+Version:       1.2.196
 Release:       1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
index bc1330e..d9fcd90 100644 (file)
@@ -389,13 +389,8 @@ typedef struct {
        int concurrent;
 
        GDBusConnection *g_dbus;
-       guint supp_sub_id;
        char iface_path[150];
        char group_iface_path[150];
-       guint iface_sub_id;
-       guint p2pdevice_sub_id;
-       guint group_sub_id;
-       guint group_iface_sub_id;
        unsigned char local_dev_addr[WS_MACADDR_LEN];
        wfd_oem_event_cb callback;
        void *user_data;
index 6d67856..a24f61c 100644 (file)
@@ -169,22 +169,6 @@ static GList *service_list;
 
 static GList *seek_list;
 
-static void _supplicant_signal_cb(GDBusConnection *connection,
-               const gchar *sender, const gchar *object_path, const gchar *interface,
-               const gchar *signal, GVariant *parameters, gpointer user_data);
-
-static void _p2pdevice_signal_cb(GDBusConnection *connection,
-               const gchar *sender, const gchar *object_path, const gchar *interface,
-               const gchar *signal, GVariant *parameters, gpointer user_data);
-
-static void _group_signal_cb(GDBusConnection *connection,
-               const gchar *sender, const gchar *object_path, const gchar *interface,
-               const gchar *signal, GVariant *parameters, gpointer user_data);
-
-static void _interface_signal_cb(GDBusConnection *connection,
-               const gchar *sender, const gchar *object_path, const gchar *interface,
-               const gchar *signal, GVariant *parameters, gpointer user_data);
-
 static int __ws_txt_to_mac(unsigned char *txt, unsigned char *mac)
 {
        int i = 0;
@@ -531,55 +515,71 @@ static int _ws_get_local_dev_mac(unsigned char *dev_mac)
        return 0;
 }
 
-static void _supplicant_signal_cb(GDBusConnection *connection,
+static void _ws_process_interface_removed(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data)
 {
+       __WDP_LOG_FUNC_ENTER__;
+       static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
+       const char *path = NULL;
+
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
        if (!g_pd) {
-               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
                return;
        }
 
-       if (!g_strcmp0(signal, "InterfaceAdded")) {
-               WDP_LOGD("InterfaceAdded");
-
-       } else if (!g_strcmp0(signal, "InterfaceRemoved")) {
-               WDP_LOGD("InterfaceRemoved");
-               static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
-               const char *path = NULL;
-
-               g_variant_get(parameters, "(&o)", &path);
-               g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
-
-               WDP_LOGD("Retrive removed path [%s]", interface_path);
+       g_variant_get(parameters, "(&o)", &path);
+       g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
 
-               if (!g_strcmp0(g_pd->group_iface_path, interface_path)) {
+       WDP_LOGD("Retrive removed path [%s]", interface_path);
 
-                       WDP_LOGD("p2p group interface removed");
-                       memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
-               }
+       if (!g_strcmp0(g_pd->group_iface_path, interface_path)) {
+               WDP_LOGD("p2p group interface removed");
+               memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
+       }
 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_PROFILE_MOBILE)
-               else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
+       else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
 
-                       WDP_LOGD("p2p interface removed");
-                       wfd_oem_event_s event;
+               WDP_LOGD("p2p interface removed");
+               wfd_oem_event_s event;
 
-                       ws_deactivate(1);
+               ws_deactivate(1);
 
-                       memset(&event, 0x0, sizeof(wfd_oem_event_s));
-                       event.event_id = WFD_OEM_EVENT_DEACTIVATED;
-                       G_PD_CALLBACK(g_pd->user_data, &event);
+               memset(&event, 0x0, sizeof(wfd_oem_event_s));
+               event.event_id = WFD_OEM_EVENT_DEACTIVATED;
+               G_PD_CALLBACK(g_pd->user_data, &event);
 
-                       memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
-               }
-#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_PROFILE_MOBILE */
-       } else if (!g_strcmp0(signal, "PropertiesChanged")) {
-               WDP_LOGD("PropertiesChanged");
+               memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
        }
+#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_PROFILE_MOBILE */
+       __WDP_LOG_FUNC_EXIT__;
 }
 
+static struct {
+       int sub_id;
+       const char *interface;
+       const char *member;
+       void (*function) (GDBusConnection *connection,
+                       const gchar *sender, const gchar *object_path, const gchar *interface,
+                       const gchar *signal, GVariant *parameters, gpointer user_data);
+} ws_supplicant_signal_map[] = {
+       {
+               0,
+               SUPPLICANT_INTERFACE,
+               "InterfaceRemoved",
+               _ws_process_interface_removed
+       },
+       {
+               0,
+               NULL,
+               NULL,
+               NULL
+       }
+};
+
 static void __ws_get_peer_property(const char *key, GVariant *value, void *user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -888,6 +888,138 @@ void __ws_extract_invitation_details(const char *key, GVariant *value, void *use
        return;
 }
 
+static void __ws_parse_peer_joined(char *peer_path,
+               unsigned char *dev_addr, unsigned char *ip_addr, GVariant *parameter)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       GVariantIter *iter;
+       static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
+       const char *path = NULL;
+       char *loc = NULL;
+#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
+       int i = 0;
+#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
+
+       g_variant_get(parameter, "(&oay)", &path, &iter);
+       g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
+       WDP_LOGD("Retrive Added path [%s]", peer_path);
+
+       loc = strrchr(peer_path, '/');
+       if (loc != NULL)
+               __ws_mac_compact_to_normal(loc + 1, peer_dev);
+       __ws_txt_to_mac(peer_dev, dev_addr);
+       WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
+#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
+       for (i = 0; i < OEM_IPADDR_LEN; i++)
+               g_variant_iter_loop(iter, "y", &ip_addr[i]);
+       g_variant_iter_free(iter);
+
+       WDP_LOGD("peer ip [" IPSTR "]", IP2STR(ip_addr));
+#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
+
+       __WDP_LOG_FUNC_EXIT__;
+       return;
+}
+
+static void _ws_process_peer_joined(GDBusConnection *connection,
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       wfd_oem_event_s event;
+       wfd_oem_dev_data_s *edata = NULL;
+       static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
+
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
+       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
+       if (!edata) {
+               WDP_LOGF("Failed to allocate memory for event. [%s]",
+                               strerror(errno));
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+       memset(&event, 0x0, sizeof(wfd_oem_event_s));
+
+       event.edata = (void*) edata;
+       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
+       event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
+
+       __ws_parse_peer_joined(peer_path, event.dev_addr, event.ip_addr_peer, parameters);
+
+       dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
+                       __ws_peer_property, event.edata);
+
+       g_pd->callback(g_pd->user_data, &event);
+       is_peer_joined_notified = 1;
+
+       g_free(edata);
+       __WDP_LOG_FUNC_EXIT__;
+}
+
+static void _ws_process_peer_disconnected(GDBusConnection *connection,
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       wfd_oem_event_s event;
+       static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
+
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
+       memset(&event, 0x0, sizeof(wfd_oem_event_s));
+
+       event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
+       event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
+
+       __ws_path_to_addr(peer_path, event.dev_addr, parameters);
+
+       g_pd->callback(g_pd->user_data, &event);
+       is_peer_disconnected_notified = 1;
+       __WDP_LOG_FUNC_EXIT__;
+}
+
+static struct {
+       int sub_id;
+       const char *interface;
+       const char *member;
+       void (*function) (GDBusConnection *connection,
+                       const gchar *sender, const gchar *object_path, const gchar *interface,
+                       const gchar *signal, GVariant *parameters, gpointer user_data);
+} ws_group_signal_map[] = {
+       {
+               0,
+               SUPPLICANT_P2P_GROUP,
+               "PeerJoined",
+               _ws_process_peer_joined
+       },
+       {
+               0,
+               SUPPLICANT_P2P_GROUP,
+               "PeerDisconnected",
+               _ws_process_peer_disconnected
+       },
+       {
+               0,
+               NULL,
+               NULL,
+               NULL
+       }
+};
+
 void __ws_extract_group_details(const char *key, GVariant *value, void *user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -948,6 +1080,7 @@ void __ws_extract_group_details(const char *key, GVariant *value, void *user_dat
        } else if (g_strcmp0(key, "group_object") == 0) {
                static char group_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
                const char *g_path;
+               int i = 0;
 
                g_variant_get(value, "&o", &g_path);
                g_strlcpy(group_path, g_path, DBUS_OBJECT_PATH_MAX);
@@ -955,18 +1088,19 @@ void __ws_extract_group_details(const char *key, GVariant *value, void *user_dat
                dbus_property_get_all(group_path, g_pd->g_dbus, SUPPLICANT_P2P_GROUP,
                                __ws_group_property, event);
 
-               g_pd->group_sub_id =
-                       g_dbus_connection_signal_subscribe(
-                               g_pd->g_dbus,
-                               SUPPLICANT_SERVICE, /* bus name */
-                               SUPPLICANT_P2P_GROUP, /* interface */
-                               NULL, /* member */
-                               group_path, /* object path */
-                               NULL, /* arg0 */
-                               G_DBUS_SIGNAL_FLAGS_NONE,
-                               _group_signal_cb,
-                               NULL, NULL);
-               WDP_LOGD("Subscribed group iface signal: [%d]", g_pd->group_sub_id);
+               for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
+                       ws_group_signal_map[i].sub_id =
+                               g_dbus_connection_signal_subscribe(g_pd->g_dbus,
+                                               SUPPLICANT_SERVICE, /* bus name */
+                                               ws_group_signal_map[i].interface, /* interface */
+                                               ws_group_signal_map[i].member, /* member */
+                                               group_path, /* object path */
+                                               NULL, /* arg0 */
+                                               G_DBUS_SIGNAL_FLAGS_NONE,
+                                               ws_group_signal_map[i].function,
+                                               NULL, NULL);
+                       WDP_LOGD("Subscribed Group iface signal [%s]", ws_group_signal_map[i].member);
+               }
        }
        __WDP_LOG_FUNC_EXIT__;
        return;
@@ -1613,7 +1747,8 @@ GLIST_ITER_END()
 #endif /* TIZEN_FEATURE_ASP */
 
 static void _ws_process_device_found_properties(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
@@ -1624,6 +1759,14 @@ static void _ws_process_device_found_properties(GDBusConnection *connection,
        GVariantIter *iter = NULL;
        const char *path = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -1664,7 +1807,7 @@ static void _ws_process_device_found_properties(GDBusConnection *connection,
                ws_get_advertise_service(peer_path, (GList **)&(event.asp_services));
 #endif /* TIZEN_FEATURE_ASP */
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 #if defined(TIZEN_FEATURE_ASP)
        if (event.asp_services != NULL) {
                GList *l;
@@ -1683,12 +1826,21 @@ static void _ws_process_device_found_properties(GDBusConnection *connection,
 }
 
 static void _ws_process_device_lost(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
@@ -1696,41 +1848,57 @@ static void _ws_process_device_lost(GDBusConnection *connection,
 
        __ws_path_to_addr(peer_path, event.dev_addr, parameters);
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_find_stoppped(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
        event.event_id = WFD_OEM_EVENT_DISCOVERY_FINISHED;
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
-
        wfd_oem_event_s event;
        wfd_oem_dev_data_s *edata = NULL;
-
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
        static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
        const char *path = NULL;
        const char *pin = NULL;
        char *loc = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -1761,26 +1929,33 @@ static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
        dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
                        __ws_peer_property, event.edata);
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
-
        wfd_oem_event_s event;
        wfd_oem_dev_data_s *edata = NULL;
-
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
        static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
        const char *path = NULL;
        const char *pin = NULL;
        char *loc = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -1811,20 +1986,29 @@ static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
        dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
                        __ws_peer_property, event.edata);
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
        wfd_oem_dev_data_s *edata = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -1844,20 +2028,29 @@ static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
        dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
                        __ws_peer_property, event.edata);
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
        wfd_oem_dev_data_s *edata = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -1877,20 +2070,29 @@ static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
        dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
                        __ws_peer_property, event.edata);
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
        wfd_oem_dev_data_s *edata = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -1910,20 +2112,29 @@ static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
        dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
                        __ws_peer_property, event.edata);
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
        wfd_oem_dev_data_s *edata = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -1943,7 +2154,7 @@ static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
        dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
                        __ws_peer_property, event.edata);
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
@@ -1951,13 +2162,22 @@ static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
 
 #if defined(TIZEN_FEATURE_ASP)
 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
        wfd_oem_asp_prov_s *edata;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -1981,7 +2201,7 @@ static void _ws_process_prov_disc_failure(GDBusConnection *connection,
                WDP_LOGE("No Properties");
        }
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 
        if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
                g_free(edata->session_information);
@@ -1991,7 +2211,8 @@ static void _ws_process_prov_disc_failure(GDBusConnection *connection,
 }
 #else
 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
@@ -2001,6 +2222,14 @@ static void _ws_process_prov_disc_failure(GDBusConnection *connection,
        int prov_status = 0;
        char *loc = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
@@ -2017,7 +2246,7 @@ static void _ws_process_prov_disc_failure(GDBusConnection *connection,
        __ws_txt_to_mac(peer_dev, event.dev_addr);
        WDP_LOGE("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 
        __WDP_LOG_FUNC_EXIT__;
 }
@@ -2025,13 +2254,22 @@ static void _ws_process_prov_disc_failure(GDBusConnection *connection,
 
 
 static void _ws_process_group_started(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
        wfd_oem_group_data_s *edata = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_group_data_s*)calloc(1, sizeof(wfd_oem_group_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -2056,24 +2294,33 @@ static void _ws_process_group_started(GDBusConnection *connection,
                WDP_LOGE("No properties");
        }
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_go_neg_success(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
        wfd_oem_conn_data_s *edata = NULL;
 
-       edata = (wfd_oem_conn_data_s*)calloc(1, sizeof(wfd_oem_conn_data_s));
-       if (!edata) {
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               strerror(errno));
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
+       edata = (wfd_oem_conn_data_s*)calloc(1, sizeof(wfd_oem_conn_data_s));
+       if (!edata) {
+               WDP_LOGF("Failed to allocate memory for event. [%s]",
+                               strerror(errno));
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
@@ -2094,20 +2341,29 @@ static void _ws_process_go_neg_success(GDBusConnection *connection,
                WDP_LOGE("No properties");
        }
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_go_neg_failure(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
        wfd_oem_conn_data_s *edata = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_conn_data_s *) g_try_malloc0(sizeof(wfd_oem_conn_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -2132,14 +2388,15 @@ static void _ws_process_go_neg_failure(GDBusConnection *connection,
                WDP_LOGE("No properties");
        }
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_go_neg_request(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
@@ -2148,10 +2405,17 @@ static void _ws_process_go_neg_request(GDBusConnection *connection,
        static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
        const char *path = NULL;
        char * loc = NULL;
-
        int dev_passwd_id = 0;
        int device_go_intent = 0;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -2191,19 +2455,28 @@ static void _ws_process_go_neg_request(GDBusConnection *connection,
        dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
                        __ws_peer_property, event.edata);
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 static void _ws_process_invitation_received(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
        wfd_oem_invite_data_s *edata = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_invite_data_s *) g_try_malloc0(sizeof(wfd_oem_invite_data_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -2229,50 +2502,82 @@ static void _ws_process_invitation_received(GDBusConnection *connection,
        }
        memcpy(&(event.dev_addr), edata->sa, OEM_MACADDR_LEN);
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(event.edata);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_invitation_result(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
+
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_group_finished(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
+       int i = 0;
+
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
 
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        event.event_id = WFD_OEM_EVENT_GROUP_DESTROYED;
        event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
 
-       g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, g_pd->group_sub_id);
+       for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
+               g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, ws_group_signal_map[i].sub_id);
+               ws_group_signal_map[i].sub_id = 0;
+       }
        memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
        _ws_flush();
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
 static void _ws_process_service_discovery_response(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        event.event_id = WFD_OEM_EVENT_SERV_DISC_RESP;
@@ -2288,7 +2593,7 @@ static void _ws_process_service_discovery_response(GDBusConnection *connection,
                WDP_LOGE("No Properties");
        }
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 
        if (event.edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE)
                g_list_free((GList*) event.edata);
@@ -2299,7 +2604,8 @@ static void _ws_process_service_discovery_response(GDBusConnection *connection,
 
 #if defined(TIZEN_FEATURE_ASP)
 static void _ws_process_service_asp_response(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
@@ -2307,6 +2613,14 @@ static void _ws_process_service_asp_response(GDBusConnection *connection,
        wfd_oem_asp_service_s *service = NULL;
        wfd_oem_asp_service_s *tmp = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        service = (wfd_oem_asp_service_s *) g_try_malloc0(sizeof(wfd_oem_asp_service_s));
        if (!service) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -2341,7 +2655,7 @@ GLIST_ITER_START(seek_list, tmp)
 GLIST_ITER_END()
 
        if (tmp != NULL && tmp->service_info != NULL)
-               G_PD_CALLBACK(g_pd->user_data, &event);
+               g_pd->callback(g_pd->user_data, &event);
        else
                WDP_LOGD("service info is not required, don't notify to user");
 
@@ -2354,33 +2668,62 @@ GLIST_ITER_END()
 #endif /* TIZEN_FEATURE_ASP */
 
 static void _ws_process_persistent_group_added(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
+
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_persistent_group_removed(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
+
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_wps_failed(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
        const char *name = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        event.event_id = WFD_OEM_EVENT_WPS_FAIL;
@@ -2401,34 +2744,52 @@ static void _ws_process_wps_failed(GDBusConnection *connection,
                g_variant_iter_free(iter);
        }
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_group_formation_failure(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        event.event_id = WFD_OEM_EVENT_GROUP_FORMATION_FAILURE;
        event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_invitation_accepted(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
        event.event_id = WFD_OEM_EVENT_INVITATION_ACCEPTED;
@@ -2452,19 +2813,28 @@ static void _ws_process_invitation_accepted(GDBusConnection *connection,
                }
        }
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        __WDP_LOG_FUNC_EXIT__;
 }
 
 #if defined(TIZEN_FEATURE_ASP)
 static void _ws_process_asp_provision_start(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
        wfd_oem_asp_prov_s *edata;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -2488,7 +2858,7 @@ static void _ws_process_asp_provision_start(GDBusConnection *connection,
                WDP_LOGE("No Properties");
        }
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
 
        if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
                g_free(edata->session_information);
@@ -2498,13 +2868,22 @@ static void _ws_process_asp_provision_start(GDBusConnection *connection,
 }
 
 static void _ws_process_asp_provision_done(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        GVariantIter *iter = NULL;
        wfd_oem_event_s event;
        wfd_oem_asp_prov_s *edata;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
        if (!edata) {
                WDP_LOGF("Failed to allocate memory for event. [%s]",
@@ -2528,7 +2907,7 @@ static void _ws_process_asp_provision_done(GDBusConnection *connection,
                WDP_LOGE("No Properties");
        }
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        g_free(edata);
 
        __WDP_LOG_FUNC_EXIT__;
@@ -2536,98 +2915,118 @@ static void _ws_process_asp_provision_done(GDBusConnection *connection,
 #endif /* TIZEN_FEATURE_ASP */
 
 static struct {
+       int sub_id;
        const char *interface;
        const char *member;
-       void (*function) (GDBusConnection *connection, const gchar *object_path,
-                       GVariant *parameters);
+       void (*function) (GDBusConnection *connection,
+                       const gchar *sender, const gchar *object_path, const gchar *interface,
+                       const gchar *signal, GVariant *parameters, gpointer user_data);
 } ws_p2pdevice_signal_map[] = {
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "DeviceFoundProperties",
                _ws_process_device_found_properties
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "DeviceLost",
                _ws_process_device_lost
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "FindStopped",
                _ws_process_find_stoppped
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ProvisionDiscoveryRequestDisplayPin",
                _ws_process_prov_disc_req_display_pin
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ProvisionDiscoveryResponseDisplayPin",
                _ws_process_prov_disc_resp_display_pin
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ProvisionDiscoveryRequestEnterPin",
                _ws_process_prov_disc_req_enter_pin
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ProvisionDiscoveryResponseEnterPin",
                _ws_process_prov_disc_resp_enter_pin
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ProvisionDiscoveryPBCRequest",
                _ws_process_prov_disc_pbc_req
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ProvisionDiscoveryPBCResponse",
                _ws_process_prov_disc_pbc_resp
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ProvisionDiscoveryFailure",
                _ws_process_prov_disc_failure
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "GroupStarted",
                _ws_process_group_started
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "GONegotiationSuccess",
                _ws_process_go_neg_success
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "GONegotiationFailure",
                _ws_process_go_neg_failure
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "GONegotiationRequest",
                _ws_process_go_neg_request
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "InvitationReceived",
                _ws_process_invitation_received
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "InvitationResult",
                _ws_process_invitation_result
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "GroupFinished",
                _ws_process_group_finished
        },
 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ServiceDiscoveryResponse",
                _ws_process_service_discovery_response
@@ -2635,80 +3034,78 @@ static struct {
 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 #if defined(TIZEN_FEATURE_ASP)
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ServiceASPResponse",
                _ws_process_service_asp_response
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ASPProvisionStart",
                _ws_process_asp_provision_start
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "ASPProvisionDone",
                _ws_process_asp_provision_done
        },
 #endif /* TIZEN_FEATURE_ASP */
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "PersistentGroupAdded",
                _ws_process_persistent_group_added
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "PersistentGroupRemoved",
                _ws_process_persistent_group_removed
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "WpsFailed",
                _ws_process_wps_failed
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "GroupFormationFailure",
                _ws_process_group_formation_failure
        },
        {
+               0,
                SUPPLICANT_P2PDEVICE,
                "InvitationAccepted",
                _ws_process_invitation_accepted
        },
        {
+               0,
                NULL,
                NULL,
                NULL
        }
 };
 
-static void _p2pdevice_signal_cb(GDBusConnection *connection,
+static void _ws_process_sta_authorized(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data)
 {
-       int i = 0;
+       __WDP_LOG_FUNC_ENTER__;
+       wfd_oem_event_s event;
+       const gchar* mac_str = NULL;
+
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
-       if (!g_pd) {
-               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
                return;
        }
 
-       for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
-               if (!g_strcmp0(signal, ws_p2pdevice_signal_map[i].member) &&
-                               ws_p2pdevice_signal_map[i].function != NULL)
-                       ws_p2pdevice_signal_map[i].function(connection, object_path, parameters);
-       }
-}
-
-
-static void _ws_process_sta_authorized(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       wfd_oem_event_s event;
-       const gchar* mac_str = NULL;
-
        if (is_peer_joined_notified) {
                is_peer_joined_notified = 0;
                __WDP_LOG_FUNC_EXIT__;
@@ -2722,17 +3119,26 @@ static void _ws_process_sta_authorized(GDBusConnection *connection,
        event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
        event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static void _ws_process_sta_deauthorized(GDBusConnection *connection,
-               const gchar *object_path, GVariant *parameters)
+               const gchar *sender, const gchar *object_path, const gchar *interface,
+               const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
        const gchar* mac_str = NULL;
 
+       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
+
+       if (!g_pd || !g_pd->callback) {
+               WDP_LOGD("Ignoring event");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
        if (is_peer_disconnected_notified) {
                is_peer_disconnected_notified = 0;
                __WDP_LOG_FUNC_EXIT__;
@@ -2746,154 +3152,45 @@ static void _ws_process_sta_deauthorized(GDBusConnection *connection,
        event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
        event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
 
-       G_PD_CALLBACK(g_pd->user_data, &event);
+       g_pd->callback(g_pd->user_data, &event);
        __WDP_LOG_FUNC_EXIT__;
 }
 
 static struct {
+       int sub_id;
        const char *interface;
        const char *member;
-       void (*function) (GDBusConnection *connection, const gchar *object_path,
-                       GVariant *parameters);
+       void (*function) (GDBusConnection *connection,
+                       const gchar *sender, const gchar *object_path, const gchar *interface,
+                       const gchar *signal, GVariant *parameters, gpointer user_data);
 } ws_interface_signal_map[] = {
        {
+               0,
                SUPPLICANT_INTERFACE,
                "StaAuthorized",
                _ws_process_sta_authorized
        },
        {
+               0,
                SUPPLICANT_INTERFACE,
                "StaDeauthorized",
                _ws_process_sta_deauthorized
        },
        {
+               0,
                NULL,
                NULL,
                NULL
        }
 };
 
-static void _interface_signal_cb(GDBusConnection *connection,
-               const gchar *sender, const gchar *object_path, const gchar *interface,
-               const gchar *signal, GVariant *parameters, gpointer user_data)
-{
-       int i = 0;
-       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
-
-       if (!g_pd) {
-               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
-               __WDP_LOG_FUNC_EXIT__;
-               return;
-       }
-
-       for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
-               if (!g_strcmp0(signal, ws_interface_signal_map[i].member) &&
-                               ws_interface_signal_map[i].function != NULL)
-                       ws_interface_signal_map[i].function(connection, object_path, parameters);
-       }
-}
-
-
-static void __ws_parse_peer_joined(char *peer_path,
-               unsigned char *dev_addr, unsigned char *ip_addr, GVariant *parameter)
-{
-       __WDP_LOG_FUNC_ENTER__;
-
-       GVariantIter *iter;
-       static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
-       const char *path = NULL;
-       char *loc = NULL;
-#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
-       int i = 0;
-#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
-
-       g_variant_get(parameter, "(&oay)", &path, &iter);
-       g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
-       WDP_LOGD("Retrive Added path [%s]", peer_path);
-
-       loc = strrchr(peer_path, '/');
-       if (loc != NULL)
-               __ws_mac_compact_to_normal(loc + 1, peer_dev);
-       __ws_txt_to_mac(peer_dev, dev_addr);
-       WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
-#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
-       for (i = 0; i < OEM_IPADDR_LEN; i++)
-               g_variant_iter_loop(iter, "y", &ip_addr[i]);
-       g_variant_iter_free(iter);
-
-       WDP_LOGD("peer ip [" IPSTR "]", IP2STR(ip_addr));
-#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
-
-       __WDP_LOG_FUNC_EXIT__;
-       return;
-}
-
-
-static void _group_signal_cb(GDBusConnection *connection,
-               const gchar *sender, const gchar *object_path, const gchar *interface,
-               const gchar *signal, GVariant *parameters, gpointer user_data)
-{
-       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
-
-       if (!g_pd) {
-               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
-               return;
-       }
-
-       if (!g_strcmp0(signal, "PeerJoined")) {
-
-               wfd_oem_event_s event;
-               wfd_oem_dev_data_s *edata = NULL;
-
-               static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
-
-               edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-               if (!edata) {
-                       WDP_LOGF("Failed to allocate memory for event. [%s]",
-                                       strerror(errno));
-                       __WDP_LOG_FUNC_EXIT__;
-                       return;
-               }
-               memset(&event, 0x0, sizeof(wfd_oem_event_s));
-
-               event.edata = (void*) edata;
-               event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-               event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
-
-               __ws_parse_peer_joined(peer_path, event.dev_addr, event.ip_addr_peer, parameters);
-
-               dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
-                               __ws_peer_property, event.edata);
-
-               G_PD_CALLBACK(g_pd->user_data, &event);
-               is_peer_joined_notified = 1;
-
-               g_free(edata);
-
-       } else if (!g_strcmp0(signal, "PeerDisconnected")) {
-
-               wfd_oem_event_s event;
-
-               static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
-
-               memset(&event, 0x0, sizeof(wfd_oem_event_s));
-
-               event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
-               event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
-
-               __ws_path_to_addr(peer_path, event.dev_addr, parameters);
-
-               G_PD_CALLBACK(g_pd->user_data, &event);
-               is_peer_disconnected_notified = 1;
-       }
-}
-
 static void __register_p2pdevice_signal(GVariant *value, void *user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        ws_dbus_plugin_data_s * pd_data;
        static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
        const char *path = NULL;
+       int i = 0;
 
        if (!g_pd) {
                WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
@@ -2909,30 +3206,35 @@ static void __register_p2pdevice_signal(GVariant *value, void *user_data)
        WDP_LOGD("interface object path [%s]", interface_path);
 
        /* subscribe Interface iface signal */
-       pd_data->iface_sub_id = g_dbus_connection_signal_subscribe(
-               pd_data->g_dbus,
-               SUPPLICANT_SERVICE, /* bus name */
-               SUPPLICANT_IFACE, /* interface */
-               NULL, /* member */
-               NULL, /* object path */
-               NULL, /* arg0 */
-               G_DBUS_SIGNAL_FLAGS_NONE,
-               _interface_signal_cb,
-               NULL, NULL);
-       WDP_LOGD("Subscribed Interface iface signal: [%d]", pd_data->iface_sub_id);
+       for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
+               ws_interface_signal_map[i].sub_id =
+                       g_dbus_connection_signal_subscribe(pd_data->g_dbus,
+                                       SUPPLICANT_SERVICE, /* bus name */
+                                       ws_interface_signal_map[i].interface, /* interface */
+                                       ws_interface_signal_map[i].member, /* member */
+                                       pd_data->iface_path, /* object path */
+                                       NULL, /* arg0 */
+                                       G_DBUS_SIGNAL_FLAGS_NONE,
+                                       ws_interface_signal_map[i].function,
+                                       NULL, NULL);
+               WDP_LOGD("Subscribed Interface iface signal [%s]", ws_interface_signal_map[i].member);
+       }
 
        /* subscribe P2PDevice iface signal */
-       pd_data->p2pdevice_sub_id = g_dbus_connection_signal_subscribe(
-               pd_data->g_dbus,
-               SUPPLICANT_SERVICE, /* bus name */
-               SUPPLICANT_P2PDEVICE, /* interface */
-               NULL, /* member */
-               NULL, /* object path */
-               NULL, /* arg0 */
-               G_DBUS_SIGNAL_FLAGS_NONE,
-               _p2pdevice_signal_cb,
-               NULL, NULL);
-       WDP_LOGD("Subscribed P2PDevice iface signal: [%d]", pd_data->p2pdevice_sub_id);
+       for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
+               ws_p2pdevice_signal_map[i].sub_id =
+                       g_dbus_connection_signal_subscribe(pd_data->g_dbus,
+                                       SUPPLICANT_SERVICE, /* bus name */
+                                       ws_p2pdevice_signal_map[i].interface, /* interface */
+                                       ws_p2pdevice_signal_map[i].member, /* member */
+                                       pd_data->iface_path, /* object path */
+                                       NULL, /* arg0 */
+                                       G_DBUS_SIGNAL_FLAGS_NONE,
+                                       ws_p2pdevice_signal_map[i].function,
+                                       NULL, NULL);
+               WDP_LOGD("Subscribed P2PDevice iface signal [%s]", ws_p2pdevice_signal_map[i].member);
+       }
+
        __WDP_LOG_FUNC_EXIT__;
 }
 
@@ -3057,6 +3359,7 @@ static int _ws_init_dbus_connection(void)
        GDBusConnection *conn = NULL;
        GError *error = NULL;
        int res = 0;
+       int i = 0;
 
        if (!g_pd) {
                WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
@@ -3077,18 +3380,19 @@ static int _ws_init_dbus_connection(void)
 
        g_pd->g_dbus = conn;
 
-       /* subscribe supplicant signal */
-       g_pd->supp_sub_id = g_dbus_connection_signal_subscribe(
-               g_pd->g_dbus,
-               SUPPLICANT_SERVICE, /* bus name */
-               SUPPLICANT_INTERFACE, /* interface */
-               NULL, /* member */
-               SUPPLICANT_PATH, /* object path */
-               NULL, /* arg0 */
-               G_DBUS_SIGNAL_FLAGS_NONE,
-               _supplicant_signal_cb,
-               NULL, NULL);
-       WDP_LOGD("Subscribed supplicant iface signal: [%d]", g_pd->supp_sub_id);
+       for (i = 0; ws_supplicant_signal_map[i].member != NULL; i++) {
+               ws_supplicant_signal_map[i].sub_id =
+                       g_dbus_connection_signal_subscribe(g_pd->g_dbus,
+                                       SUPPLICANT_SERVICE, /* bus name */
+                                       ws_supplicant_signal_map[i].interface, /* interface */
+                                       ws_supplicant_signal_map[i].member, /* member */
+                                       SUPPLICANT_PATH, /* object path */
+                                       NULL, /* arg0 */
+                                       G_DBUS_SIGNAL_FLAGS_NONE,
+                                       ws_supplicant_signal_map[i].function,
+                                       NULL, NULL);
+               WDP_LOGD("Subscribed supplicant iface signal [%s]", ws_supplicant_signal_map[i].member);
+       }
 
 #if defined(TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
        if (_ws_get_interface(COMMON_IFACE_NAME, NULL, NULL) < 0)
@@ -3112,6 +3416,7 @@ static int _ws_init_dbus_connection(void)
 static int _ws_deinit_dbus_connection(void)
 {
        GDBusConnection *g_dbus = NULL;
+       int i = 0;
 
        if (!g_pd) {
                WDP_LOGE("Invalid parameter");
@@ -3125,15 +3430,26 @@ static int _ws_deinit_dbus_connection(void)
                return -1;
        }
 
-       g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->supp_sub_id);
-       g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->iface_sub_id);
-       g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->p2pdevice_sub_id);
-       g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->group_sub_id);
+       for (i = 0; ws_supplicant_signal_map[i].member != NULL; i++) {
+               g_dbus_connection_signal_unsubscribe(g_dbus, ws_supplicant_signal_map[i].sub_id);
+               ws_supplicant_signal_map[i].sub_id = 0;
+       }
+
+       for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
+               g_dbus_connection_signal_unsubscribe(g_dbus, ws_interface_signal_map[i].sub_id);
+               ws_interface_signal_map[i].sub_id = 0;
+       }
+
+       for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
+               g_dbus_connection_signal_unsubscribe(g_dbus, ws_p2pdevice_signal_map[i].sub_id);
+               ws_p2pdevice_signal_map[i].sub_id = 0;
+       }
+
+       for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
+               g_dbus_connection_signal_unsubscribe(g_dbus, ws_group_signal_map[i].sub_id);
+               ws_group_signal_map[i].sub_id = 0;
+       }
 
-       g_pd->group_iface_sub_id = 0;
-       g_pd->iface_sub_id = 0;
-       g_pd->p2pdevice_sub_id = 0;
-       g_pd->group_sub_id = 0;
        memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
        memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);