Fixed start/stop active scan functionality 90/207490/1 accepted/tizen/unified/20190606.220036 submit/tizen/20190605.084841
authorAtul Rai <a.rai@samsung.com>
Tue, 4 Jun 2019 09:34:38 +0000 (15:04 +0530)
committersaerome kim <saerome.kim@samsung.com>
Wed, 5 Jun 2019 08:41:57 +0000 (17:41 +0900)
This patch adds support to handle start/stop active scan from multiple
applications simultaneously.

Change-Id: Ief32d9b9b743fc9d76731aee1829baf9b9536452
Signed-off-by: Atul Rai <a.rai@samsung.com>
ua-api/src/ua-request-sender.c
ua-daemon/include/ua-manager-core.h
ua-daemon/include/ua-plugin-manager.h
ua-daemon/src/pm/ua-plugin-manager.c
ua-daemon/src/ua-manager-core.c
ua-daemon/src/ua-manager-request-handler.c

index 312accf..dfe52da 100644 (file)
@@ -297,9 +297,8 @@ static void __uam_async_request_cb(
        }
 
 done:
-       if (out_param) {
+       if (out_param)
                g_array_free(out_param, TRUE);
-       }
 
        if (req_info) {
                pending_requests = g_slist_remove(
index 2d64e66..f56506a 100644 (file)
@@ -155,9 +155,9 @@ void _uam_core_handle_detection_started(unsigned int sensor);
 
 void _uam_core_handle_detection_stopped(unsigned int sensor);
 
-int _uam_core_start_search_active_devices(char *sender, unsigned int sensors, int detection_period);
+int _uam_core_start_active_device_scan(char *sender, unsigned int sensors, int detection_period);
 
-int _uam_core_stop_search_active_devices(char *sender, unsigned int sensors);
+int _uam_core_stop_active_device_scan(char *sender, unsigned int sensors);
 
 void _uam_core_handle_active_device(uam_active_scan_event_e event, unsigned int sensor, const uam_device_info_t *dev_info);
 
index b26d354..94b5080 100644 (file)
@@ -58,9 +58,9 @@ int _uam_pm_set_detection_params(unsigned int sensor, int detection_cycle,
 int _uam_pm_set_detection_threshold(unsigned int sensor,
                int presence_threshold, int absence_threshold);
 
-int _uam_pm_start_search_active_devices(unsigned int* bitmask, int detection_period);
+int _uam_pm_start_active_device_scan(unsigned int* bitmask, int detection_period);
 
-int _uam_pm_stop_search_active_devices(unsigned int bitmask);
+int _uam_pm_stop_active_device_scan(unsigned int bitmask);
 
 #ifdef __cplusplus
 }
index a338bb3..16da30d 100644 (file)
@@ -669,7 +669,7 @@ int _uam_pm_set_detection_threshold(unsigned int sensor,
        return UAM_ERROR_NONE;
 }
 
-int _uam_pm_start_search_active_devices(unsigned int* bitmask, int detection_period)
+int _uam_pm_start_active_device_scan(unsigned int* bitmask, int detection_period)
 {
        FUNC_ENTRY;
        int id;
@@ -706,7 +706,7 @@ int _uam_pm_start_search_active_devices(unsigned int* bitmask, int detection_per
        return ret;
 }
 
-int _uam_pm_stop_search_active_devices(unsigned int bitmask)
+int _uam_pm_stop_active_device_scan(unsigned int bitmask)
 {
        FUNC_ENTRY;
        int id;
index be48631..355eb7e 100644 (file)
@@ -38,6 +38,12 @@ typedef struct {
        uam_pm_detection_mode_e mode;
 } uam_monitor_info_t;
 
+typedef struct {
+       char *name;
+       unsigned int sensors;
+       guint timer;
+} uam_scanner_info_t;
+
 GSList *monitors; /* List of monitoring apps - uam_monitor_info_t */
 GSList *users; /* List of users - uam_db_user_info_t */
 GSList *devices; /* List of devices - uam_db_device_info_t */
@@ -2001,15 +2007,14 @@ void _uam_core_handle_detection_stopped(unsigned int sensor)
        FUNC_EXIT;
 }
 
-static uam_monitor_info_t *__uam_find_scanner(const char *name)
+static uam_scanner_info_t *__uam_find_scanner(const char *name)
 {
-//     FUNC_ENTRY;
        GSList *l;
 
        retv_if(NULL == name, NULL);
 
        for (l = scanners; NULL != l; l = g_slist_next(l)) {
-               uam_monitor_info_t *scanner = l->data;
+               uam_scanner_info_t *scanner = l->data;
 
                if (!scanner || !scanner->name)
                        continue;
@@ -2020,75 +2025,105 @@ static uam_monitor_info_t *__uam_find_scanner(const char *name)
                }
        }
 
-//     FUNC_EXIT;
        return NULL;
 }
 
-int _uam_core_start_search_active_devices(char *sender, unsigned int sensors, int detection_period)
+static gboolean __scan_completed_cb(gpointer data)
+{
+       FUNC_ENTRY;
+       uam_scanner_info_t *scanner = data;
+
+       retv_if(NULL == scanner, FALSE);
+
+       if (UAM_ERROR_NONE != _uam_manager_send_event(
+                               scanner->name, UAM_EVENT_SCAN_COMPLETED, NULL))
+               UAM_ERR("Failed to send UAM_EVENT_SCAN_COMPLETED");
+       else
+               UAM_INFO_C("Sent UAM_EVENT_SCAN_COMPLETED to [%s]", scanner->name);
+
+       /* Free scanner */
+       scanners = g_slist_remove(scanners, scanner);
+       g_free(scanner->name);
+       g_free(scanner);
+
+       FUNC_EXIT;
+       return FALSE;
+}
+
+int _uam_core_start_active_device_scan(char *sender, unsigned int sensors, int detection_period)
 {
        FUNC_ENTRY;
        int ret;
-       uam_monitor_info_t *scanner;
-       GSList *l;
+       uam_scanner_info_t *scanner;
 
        retv_if(NULL == sender, UAM_ERROR_INVALID_PARAM);
+       retv_if(0 == sensors, UAM_ERROR_INVALID_PARAM);
 
        scanner = __uam_find_scanner(sender);
-       if (scanner) {
-               ret = UAM_ERROR_NOW_IN_PROGRESS;
-               UAM_ERR("Failed with error: %s (0x%4.4X)",
-                               _uam_manager_error_to_str(ret), ret);
-               return ret;
-       }
+       retv_if(NULL != scanner, UAM_ERROR_NOW_IN_PROGRESS);
 
-       for (l = scanners; NULL != l; l = g_slist_next(l)) {
-               uam_monitor_info_t *scanner_data = l->data;
-
-               if (!scanner_data || !scanner_data->name)
-                       continue;
-               sensors &= ~(scanner_data->sensors);
-       }
-
-       ret = _uam_pm_start_search_active_devices(&sensors, detection_period);
+       ret = _uam_pm_start_active_device_scan(&sensors, detection_period);
        if (UAM_ERROR_NONE != ret) {
                UAM_ERR("Failed with error: %s (0x%4.4X)",
                                _uam_manager_error_to_str(ret), ret);
                return ret;
        }
 
-       scanner = g_malloc0(sizeof(uam_monitor_info_t));
+       scanner = g_malloc0(sizeof(uam_scanner_info_t));
        scanner->name = g_strdup(sender);
        scanner->sensors |= sensors;
+       scanner->timer = g_timeout_add_seconds(detection_period,
+                       __scan_completed_cb, scanner);
        scanners = g_slist_append(scanners, scanner);
+       UAM_DBG("sensors = 0x%8.8X - 0x%8.8X", scanner->sensors, sensors);
 
        FUNC_EXIT;
        return UAM_ERROR_NONE;
 }
 
-int _uam_core_stop_search_active_devices(char *sender, unsigned int sensors)
+int _uam_core_stop_active_device_scan(char *sender, unsigned int sensors)
 {
        FUNC_ENTRY;
        int ret;
-
+       uam_scanner_info_t *scanner;
        GSList *l;
+
        retv_if(NULL == sender, UAM_ERROR_INVALID_PARAM);
+       retv_if(0 == sensors, UAM_ERROR_INVALID_PARAM);
+
+       scanner = __uam_find_scanner(sender);
+       retv_if(NULL == scanner, UAM_ERROR_NOT_IN_OPERATION);
+
+       /* Trim sensors to a subset of active sensors for the scanner */
+       sensors &= scanner->sensors;
+
+       /*
+        * modify scanner's active sensors and if active sensors are NULL
+        * remove scanner from scanners list
+        */
+       scanner->sensors &= ~sensors;
+       if (0 == scanner->sensors) {
+               scanners = g_slist_remove(scanners, scanner);
+               g_source_remove(scanner->timer);
+               g_free(scanner->name);
+               g_free(scanner);
+       }
 
        for (l = scanners; NULL != l; l = g_slist_next(l)) {
-               uam_monitor_info_t *scanner = l->data;
+               uam_scanner_info_t *scanner_data = l->data;
 
-               if (!scanner || !scanner->name)
+               if (!scanner_data || !scanner_data->name)
                        continue;
 
-               if (scanner->sensors & sensors) {
-                       ret = _uam_pm_stop_search_active_devices(sensors);
-                       if (UAM_ERROR_NONE != ret) {
-                               UAM_ERR("Failed with error: %s (0x%4.4X)",
+               sensors &= ~(scanner_data->sensors);
+       }
+
+       if (0 != sensors) {
+               ret = _uam_pm_stop_active_device_scan(sensors);
+               if (UAM_ERROR_NONE != ret) {
+                       UAM_ERR("Failed with error: %s (0x%4.4X)",
                                        _uam_manager_error_to_str(ret), ret);
-                               return ret;
-                       }
-                       scanners = g_slist_remove(scanners, scanner);
-                       g_free(scanner->name);
-                       g_free(scanner);
+                       return ret;
                }
        }
 
@@ -2096,57 +2131,64 @@ int _uam_core_stop_search_active_devices(char *sender, unsigned int sensors)
        return UAM_ERROR_NONE;
 }
 
-void _uam_core_handle_active_device(uam_active_scan_event_e event, unsigned int sensor, const uam_device_info_t *dev_info)
+void _uam_core_handle_active_device(uam_active_scan_event_e event,
+               unsigned int sensor, const uam_device_info_t *dev_info)
 {
        FUNC_ENTRY;
-
-       GVariant *param = NULL;
        GSList *l;
-       int done = 0;
-       char *name = NULL;
 
-       for (l = scanners; NULL != l; l = g_slist_next(l)) {
-               uam_monitor_info_t *scanner = (uam_monitor_info_t *)l->data;
+       ret_if((UAM_ACTIVE_SCAN_COMPLETED != event) && (NULL == dev_info));
 
-               if (!scanner || !scanner->name)
+       for (l = scanners; NULL != l;) {
+               uam_scanner_info_t *scanner = l->data;
+
+               if (!scanner || !scanner->name) {
+                       l = g_slist_next(l);
                        continue;
+               }
 
-               if (scanner->sensors & sensor) {
-                       name = g_strdup(scanner->name);
-                       if (event == UAM_ACTIVE_SCAN_COMPLETED) {
-                               scanner->sensors &= ~(sensor);
-                               if (scanner->sensors == 0) {
-                                       done = 1;
-                                       scanners = g_slist_remove(scanners, scanner);
-                                       g_free(scanner->name);
-                                       g_free(scanner);
-                               }
+               if (0 == (scanner->sensors & sensor)) {
+                       l = g_slist_next(l);
+                       continue;
+               }
+
+               if (event == UAM_ACTIVE_SCAN_COMPLETED) {
+                       scanner->sensors &= ~(sensor);
+                       UAM_DBG("sensors = 0x%8.8X", scanner->sensors);
+                       if (0 != scanner->sensors) {
+                               l = g_slist_next(l);
+                               continue;
                        }
-                       break;
+
+                       if (UAM_ERROR_NONE != _uam_manager_send_event(
+                                               scanner->name, UAM_EVENT_SCAN_COMPLETED, NULL))
+                               UAM_ERR("Failed to send UAM_EVENT_SCAN_COMPLETED");
+                       else
+                               UAM_INFO_C("Sent UAM_EVENT_SCAN_COMPLETED to [%s]", scanner->name);
+
+                       /* Free scanner */
+                       l = g_slist_next(l);
+                       scanners = g_slist_remove(scanners, scanner);
+                       g_source_remove(scanner->timer);
+                       g_free(scanner->name);
+                       g_free(scanner);
+               } else {
+                       GVariant *param = g_variant_new("(iiisss)",
+                                       UAM_ERROR_NONE,
+                                       dev_info->operating_system,
+                                       dev_info->type,
+                                       dev_info->mac,
+                                       dev_info->ipv4_addr,
+                                       dev_info->device_id);
+                       if (UAM_ERROR_NONE != _uam_manager_send_event(
+                                               scanner->name, UAM_EVENT_DEVICE_FOUND, param))
+                               UAM_ERR("Failed to send %s", _uam_manager_event_to_str(event));
+                       else
+                               UAM_INFO_C("Sent UAM_EVENT_DEVICE_FOUND to [%s]", scanner->name);
+
+                       l = g_slist_next(l);
                }
        }
 
-       if (event == UAM_ACTIVE_DEVICE_FOUND) {
-               param = g_variant_new("(iiisss)",
-                               UAM_ERROR_NONE,
-                               dev_info->operating_system,
-                               dev_info->type,
-                               dev_info->mac,
-                               dev_info->ipv4_addr,
-                               dev_info->device_id);
-               UAM_INFO_C("Send %s to applications", _uam_manager_event_to_str(UAM_EVENT_DEVICE_FOUND));
-               /* Send device event to application */
-               if (UAM_ERROR_NONE != _uam_manager_send_event(name, UAM_EVENT_DEVICE_FOUND, param))
-                       UAM_ERR("Failed to send %s", _uam_manager_event_to_str(event));
-       } else if (done == 1 && event == UAM_ACTIVE_SCAN_COMPLETED) {
-               UAM_INFO_C("Send %s to applications", _uam_manager_event_to_str(UAM_EVENT_SCAN_COMPLETED));
-               /* Send device event to application */
-               if (UAM_ERROR_NONE != _uam_manager_send_event(name, UAM_EVENT_SCAN_COMPLETED, param))
-                       UAM_ERR("Failed to send %s", _uam_manager_event_to_str(event));
-       }
-
-       if (name != NULL)
-               g_free(name);
-
        FUNC_EXIT;
 }
index 9d515e9..5f2fed3 100644 (file)
@@ -400,7 +400,7 @@ static int __uam_manager_sync_request_handler(
                __uam_manager_copy_params(in_param2,
                                &detection_period, sizeof(int));
 
-               result = _uam_core_start_search_active_devices(sender, sensors, detection_period);
+               result = _uam_core_start_active_device_scan(sender, sensors, detection_period);
                break;
        }
        case UAM_REQUEST_STOP_SEARCH_ACTIVE_DEVICES: {
@@ -409,7 +409,7 @@ static int __uam_manager_sync_request_handler(
                __uam_manager_copy_params(in_param1,
                                &sensors, sizeof(unsigned int));
 
-               result = _uam_core_stop_search_active_devices(sender, sensors);
+               result = _uam_core_stop_active_device_scan(sender, sensors);
                break;
        }
        case UAM_REQUEST_REGISTER_APP: {