Add wrapper to send event callback 30/244730/3
authorNishant Chaprana <n.chaprana@samsung.com>
Wed, 23 Sep 2020 14:26:10 +0000 (19:56 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Wed, 23 Sep 2020 15:29:09 +0000 (20:59 +0530)
Sends event only when network_info referenced by net_register_client()
If net_deregister_client() is called by App, then events are not sent.

Change-Id: I006b6ded8e3444a739e5be2a655bca692619d6c3
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
include/internal/network-info.h
packaging/libnet-client.spec
src/network-internal.c
src/network-signal-handler.c

index 2395b2f..ae6794e 100755 (executable)
@@ -122,7 +122,7 @@ typedef struct
 /*****************************************************************************
  *     Global Functions
  *****************************************************************************/
-
+gboolean _network_info_is_ref(network_info_t *network_info);
 void _network_info_ref(network_info_t *network_info);
 void _network_info_unref(network_info_t *network_info);
 
index b9b2fb0..dcbd933 100755 (executable)
@@ -1,6 +1,6 @@
 Name:          libnet-client
 Summary:       Network Client library (Shared library)
-Version:       1.2.3
+Version:       1.2.4
 Release:       1
 Group:         System/Network
 License:       Flora-1.1
index eb3927d..1103d62 100755 (executable)
@@ -117,6 +117,20 @@ gboolean _net_remove_idler_from_list(managed_idler_data_t *idler_data)
        return TRUE;
 }
 
+
+gboolean _network_info_is_ref(network_info_t *network_info)
+{
+       /**
+        * Maximum possible ref count is 6
+        * (1 of net_register_client() + 5 of dbus signals handlers)
+        * which gets decreased when net_deregister_client() is called.
+        */
+       if (__atomic_load_n(&network_info->refcount, __ATOMIC_ACQUIRE) < 6)
+               return FALSE;
+
+       return TRUE;
+}
+
 void _network_info_ref(network_info_t *network_info)
 {
        __atomic_add_fetch(&network_info->refcount, 1, __ATOMIC_ACQ_REL);
index 50e6d82..3cf04df 100755 (executable)
@@ -38,6 +38,16 @@ struct cs_tid_info {
 static GSList *cs_tid_list = NULL;
 
 /* LCOV_EXCL_START */
+static void __net_trigger_event_callback(network_info_t *network_info,
+               net_event_info_t *event_data)
+{
+       if (!network_info || !event_data || !_network_info_is_ref(network_info))
+               return;
+
+       if (network_info->event_callback)
+               network_info->event_callback(event_data, network_info->user_data);
+}
+
 static int __net_handle_wifi_power_rsp(gboolean value, network_info_t *network_info)
 {
        __NETWORK_FUNC_ENTER__;
@@ -83,8 +93,7 @@ static int __net_handle_wifi_power_rsp(gboolean value, network_info_t *network_i
        event_data->Datalength = sizeof(net_wifi_state_t);
        event_data->Data = &(net_wifi_state);
 
-       if (network_info->event_callback)
-               network_info->event_callback(event_data, network_info->user_data);
+       __net_trigger_event_callback(network_info, event_data);
        g_free(event_data);
 
        __NETWORK_FUNC_EXIT__;
@@ -122,7 +131,7 @@ static void __net_handle_state_ind(network_info_t *network_info,
                        "Sending NET_EVENT_NET_STATE_IND, state: %d, profile name: %s",
                        profile_state, event_data->ProfileName);
 
-       network_info->event_callback(event_data, network_info->user_data);
+       __net_trigger_event_callback(network_info, event_data);
        g_free(event_data);
 
        __NETWORK_FUNC_EXIT__;
@@ -159,7 +168,7 @@ static void __net_handle_internet_state_ind(network_info_t *network_info,
        NETWORK_LOG(NETWORK_LOW,
                        "Sending NET_EVENT_INTERNET_%s_IND", is_online ? "ONLINE" : "OFFLINE");
 
-       network_info->event_callback(event_data, network_info->user_data);
+       __net_trigger_event_callback(network_info, event_data);
        g_free(event_data);
 
        __NETWORK_FUNC_EXIT__;
@@ -236,8 +245,7 @@ static void __net_handle_failure_ind(network_info_t *network_info,
 
        NETWORK_LOG(NETWORK_ERROR, "State failure %d", event_data->Error);
 
-       if (network_info && network_info->event_callback)
-               network_info->event_callback(event_data, network_info->user_data);
+       __net_trigger_event_callback(network_info, event_data);
        g_free(event_data);
 
        /* Reseting the state back in case of failure state */
@@ -376,8 +384,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info,
                        event_data->Error = Error;
                        g_strlcpy(event_data->ProfileName, sig_path, NET_PROFILE_NAME_LEN_MAX+1);
 
-                       if (network_info && network_info->event_callback)
-                               network_info->event_callback(event_data, network_info->user_data);
+                       __net_trigger_event_callback(network_info, event_data);
                }
 
                break;
@@ -406,8 +413,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info,
 
                        NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_OPEN_RSP");
 
-                       if (network_info && network_info->event_callback)
-                               network_info->event_callback(event_data, network_info->user_data);
+                       __net_trigger_event_callback(network_info, event_data);
 
                        break;
                }
@@ -427,8 +433,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info,
 
                        NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_WIFI_WPS_RSP");
 
-                       if (network_info && network_info->event_callback)
-                               network_info->event_callback(event_data, network_info->user_data);
+                       __net_trigger_event_callback(network_info, event_data);
 
                        break;
                }
@@ -448,8 +453,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info,
 
                        NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_CLOSE_RSP");
 
-                       if (network_info && network_info->event_callback)
-                               network_info->event_callback(event_data, network_info->user_data);
+                       __net_trigger_event_callback(network_info, event_data);
 
                        break;
                }
@@ -464,8 +468,7 @@ static int __net_handle_service_state_changed(network_info_t *network_info,
 
                NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_CLOSE_IND");
 
-               if (network_info && network_info->event_callback)
-                       network_info->event_callback(event_data, network_info->user_data);
+               __net_trigger_event_callback(network_info, event_data);
 
                break;
        }
@@ -556,7 +559,7 @@ static int __net_handle_ethernet_cable_state_rsp(GVariant *param,
        event_data->Datalength = 0;
        event_data->Data = NULL;
 
-       network_info->event_callback(event_data, network_info->user_data);
+       __net_trigger_event_callback(network_info, event_data);
        g_free(event_data);
 
        return NET_ERR_NONE;
@@ -656,7 +659,7 @@ static int __net_handle_network_config_changed_event(GVariant *param,
 
                                NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_NETWORK_TYPE_CHANGED");
 
-                               network_info->event_callback(event_data, network_info->user_data);
+                               __net_trigger_event_callback(network_info, event_data);
                                g_free(event_data);
                        }
                } else if (g_strcmp0(key, "IPv4Address") == 0) {
@@ -676,7 +679,7 @@ static int __net_handle_network_config_changed_event(GVariant *param,
 
                                NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_IPV4_ADDRESS_CHANGED");
 
-                               network_info->event_callback(event_data, network_info->user_data);
+                               __net_trigger_event_callback(network_info, event_data);
                                g_free(event_data->Data);
                                g_free(event_data);
                        }
@@ -697,7 +700,7 @@ static int __net_handle_network_config_changed_event(GVariant *param,
 
                                NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_IPV6_ADDRESS_CHANGED");
 
-                               network_info->event_callback(event_data, network_info->user_data);
+                               __net_trigger_event_callback(network_info, event_data);
                                g_free(event_data->Data);
                                g_free(event_data);
                        }
@@ -718,7 +721,7 @@ static int __net_handle_network_config_changed_event(GVariant *param,
 
                                NETWORK_LOG(NETWORK_LOW, "Sending NET_EVENT_PROXY_ADDRESS_CHANGED");
 
-                               network_info->event_callback(event_data, network_info->user_data);
+                               __net_trigger_event_callback(network_info, event_data);
                                g_free(event_data->Data);
                                g_free(event_data);
                        }
@@ -810,7 +813,7 @@ static int __net_handle_wifi_connect_fail_event(GVariant *param, network_info_t
                return NET_ERR_NONE;
        }
 
-       network_info->event_callback(event_data, network_info->user_data);
+       __net_trigger_event_callback(network_info, event_data);
        g_free(event_data);
 
        __NETWORK_FUNC_EXIT__;