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 */
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;
}
}
-// 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;
}
}
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;
}