Handle service device mapping and filter detected devices
authorAbhay Agarwal <ay.agarwal@samsung.com>
Wed, 2 Oct 2019 10:30:24 +0000 (19:30 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Fri, 4 Oct 2019 11:21:04 +0000 (20:21 +0900)
This commit handles the service specific device discriminant and filters
the detected devices from plugins based on this discriminant.

Change-Id: I5c2194f455a51403161a6011665d606c0677a4ed
Signed-off-by: Abhay Agarwal <ay.agarwal@samsung.com>
ua-daemon/include/ua-manager-core.h
ua-daemon/src/ua-manager-core.c

index ddcd204..bf5909f 100644 (file)
@@ -55,6 +55,13 @@ typedef struct {
 } uam_db_service_info_t;
 
 typedef struct {
+       char *device_id;
+       uam_tech_type_e tech_type;
+       char *service;
+       int discriminant;
+} uam_svc_dev_info_t;
+
+typedef struct {
        uam_addr_type_e addr_type;
        char *address;
 } uam_db_address_info_t;
index c197c09..1f8d677 100644 (file)
@@ -47,6 +47,7 @@ typedef struct {
 static GSList *users; /* List of users - uam_db_user_info_t */
 static GSList *devices; /* List of devices - uam_db_device_info_t */
 static GSList *services; /* List of services -  uam_db_service_info_t */
+static GSList *svc_devs; /* List of service device mapping -  uam_svc_dev_info_t */
 
 static GSList *monitors; /* List of monitoring apps - uam_monitor_info_t */
 static GSList *scanners; /* List of scanning apps -  uam_scanner_info_t */
@@ -1408,6 +1409,60 @@ gboolean _uam_core_is_sensor_ready(unsigned int sensor)
        return is_ready;
 }
 
+uam_svc_dev_info_t *_uam_core_find_svc_dev_info(const char *device_id, uam_tech_type_e tech_type,
+       const char *svc_name)
+{
+       FUNC_ENTRY;
+       uam_svc_dev_info_t *svc_dev = NULL;
+       GSList *l;
+
+       for (l = svc_devs; NULL != l; l = g_slist_next(l)) {
+               svc_dev = l->data;
+
+               if (!svc_dev || !svc_dev->device_id || !svc_dev->service)
+                       continue;
+
+               if ((0 == g_strcmp0(svc_dev->device_id, device_id)) &&
+                               (0 == g_strcmp0(svc_dev->service, svc_name)) &&
+                               (svc_dev->tech_type == tech_type)) {
+                       UAM_DBG("Service device found in list");
+                       return svc_dev;
+               }
+       }
+
+       FUNC_EXIT;
+       return NULL;
+}
+
+int _uam_core_update_svc_dev_info(const char *device_id, uam_tech_type_e tech_type,
+       const char *svc_name, gboolean discriminant)
+{
+       FUNC_ENTRY;
+       uam_svc_dev_info_t *svc = NULL;
+
+       retv_if(NULL == device_id, UAM_ERROR_INVALID_PARAMETER);
+       retv_if(UAM_TECH_TYPE_NONE >= tech_type, UAM_ERROR_INVALID_PARAMETER);
+       retv_if(UAM_TECH_TYPE_MAX <= tech_type, UAM_ERROR_INVALID_PARAMETER);
+       retv_if(NULL == svc_name, UAM_ERROR_INVALID_PARAMETER);
+
+       svc = _uam_core_find_svc_dev_info(device_id, tech_type, svc_name);
+       if (!svc) {
+               svc = g_new0(uam_svc_dev_info_t, 1);
+               svc->device_id = g_strdup(device_id);
+               svc->tech_type = tech_type;
+               svc->service = g_strdup(svc_name);
+               svc_devs = g_slist_append(svc_devs, svc);
+       }
+
+       svc->discriminant = discriminant;
+
+       UAM_DBG("Service [%s] device [%s] tech_type [%d] discriminant [%d]",
+               svc->service, svc->device_id, svc->tech_type, svc->discriminant);
+
+       FUNC_EXIT;
+       return UAM_ERROR_NONE;
+}
+
 int _uam_core_service_add_user(const char *svc_name, const char *account)
 {
        FUNC_ENTRY;
@@ -1428,15 +1483,6 @@ int _uam_core_service_add_user(const char *svc_name, const char *account)
        l = g_slist_find_custom(services, svc_name, __compare_svc_name);
        retv_if(NULL == l, UAM_ERROR_INVALID_PARAMETER);
        service = l->data;
-/*
-       if (NULL == l) {
-               service = g_new0(uam_db_service_info_t, 1);
-               service->name = g_strdup(svc_name);
-               service->cycle = UAM_DETECTION_CYCLE_DEFAULT;
-               services = g_slist_append(services, service);
-       } else
-               service = l->data;
-*/
 
        for (l = user->devices; NULL != l; l = g_slist_next(l)) {
                uam_db_device_info_t *device = l->data;
@@ -1466,6 +1512,9 @@ int _uam_core_service_add_user(const char *svc_name, const char *account)
                                                tech->tech_type, mac, service->name, service->cycle,
                                                device->discriminant))
                                UAM_WARN("Device service addition to persistent DB failed");
+                       if (UAM_ERROR_NONE != _uam_core_update_svc_dev_info(device->device_id,
+                                               tech->tech_type, service->name, device->discriminant))
+                               UAM_WARN("Device service addition to service device mapping failed");
                }
        }
 
@@ -1610,6 +1659,9 @@ int _uam_core_service_add_device(const char *svc_name, const char *device_id, in
        if (UAM_ERROR_NONE != _uam_db_insert_device_service_info(device_id,
                                tech_type, mac, service->name, service->cycle, tech_info->discriminant))
                UAM_WARN("Device service addition to persistent DB failed");
+       if (UAM_ERROR_NONE != _uam_core_update_svc_dev_info(device_id,
+                               tech_type, service->name, tech_info->discriminant))
+               UAM_WARN("Device service addition to svc dev mapping failed");
 
        FUNC_EXIT;
        return UAM_ERROR_NONE;
@@ -1677,6 +1729,9 @@ int _uam_core_service_set_device_discriminant(const char *svc_name,
        if (UAM_ERROR_NONE != _uam_db_update_device_service_info(device_id,
                                tech_type, mac, service->name, discriminant))
                UAM_WARN("Device service discriminant update to persistent DB failed");
+       if (UAM_ERROR_NONE != _uam_core_update_svc_dev_info(device_id,
+                               tech_type, service->name, discriminant))
+               UAM_WARN("Device service discriminant mapping update failed");
 
        FUNC_EXIT;
        return UAM_ERROR_NONE;
@@ -2062,6 +2117,7 @@ int _uam_core_init(void)
        GSList *db_devices;
        GSList *db_svc_list;
        GSList *db_adv_list;
+       GSList *db_svc_dev_list;
        GSList *l;
 
        /* Init database */
@@ -2349,6 +2405,11 @@ void _uam_core_handle_device_added(int status,
                                        dev_info->discriminant))
                        UAM_WARN("Device service addition to persistent DB failed");
 
+               if (UAM_ERROR_NONE != _uam_core_update_svc_dev_info(
+                                       dev_info->device_id, dev_info->type,
+                                       UAM_SERVICE_DEFAULT, dev_info->discriminant))
+                       UAM_WARN("Device service addition to persistent DB failed");
+
                /* Send device added event to application */
                __send_device_event(UAM_EVENT_DEVICE_ADDED, dev_info);
 
@@ -2500,6 +2561,7 @@ void __send_user_presence_event(uam_db_tech_info_t *tech, unsigned int sensor,
        FUNC_ENTRY;
        uam_db_user_info_t *user;
        GSList *l;
+       uam_svc_dev_info_t *svc_dev = NULL;
 
        ret_if(NULL == tech);
        ret_if(NULL == tech->svc_list);
@@ -2518,6 +2580,12 @@ void __send_user_presence_event(uam_db_tech_info_t *tech, unsigned int sensor,
                if (!(svc->remaining_time == svc->cycle))
                        continue;
 
+               UAM_DBG("Check service device discriminant");
+               svc_dev = _uam_core_find_svc_dev_info(device_id, tech->tech_type, svc->name);
+               if (!svc_dev || !svc_dev->discriminant)
+                       continue;
+
+               UAM_DBG("Send event");
                for (l1 = svc->monitors; NULL != l1; l1 = g_slist_next(l1)) {
                        uam_monitor_info_t *mon = l1->data;