Add service-device-payload list in device tech
authorAbhay agarwal <ay.agarwal@samsung.com>
Thu, 19 Dec 2019 12:02:50 +0000 (17:32 +0530)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Mon, 30 Dec 2019 07:29:55 +0000 (16:29 +0900)
Signed-off-by: Abhay agarwal <ay.agarwal@samsung.com>
ua-daemon/include/ua-manager-core.h
ua-daemon/include/ua-manager-database.h
ua-daemon/src/ua-manager-core.c
ua-daemon/src/ua-manager-device-service-db.c

index 295876bae1ad3df3526e99786a172591fafa5c07..fcf2c3235d746efddcb5f6005515e21797320cd8 100644 (file)
@@ -54,12 +54,21 @@ typedef struct {
        GSList *dev_techs; /**< Device list */
 } uam_db_service_info_t;
 
+typedef struct {
+       char primary_key; /** Primary key */
+       char device_icon; /** Device icon */
+       char secondary_key; /** Purpose */
+       char *device_uid; /** DEVICE_UID */
+       char *bt_mac; /** BT MAC Address */
+} uam_db_payload_info_t;
+
 typedef struct {
        char *device_id; /**< Device ID */
        uam_tech_type_e tech_type; /**< Connectivity type */
        char *service; /**< Connected service name */
        int discriminant; /**< Service dependent discriminant */
        unsigned long long last_seen; /**< Service dependent last seen time */
+       uam_db_payload_info_t *payload; /**device service specific payload info */
 } uam_svc_dev_info_t;
 
 typedef struct {
@@ -67,14 +76,6 @@ typedef struct {
        char *address; /**< Address */
 } uam_db_address_info_t;
 
-typedef struct {
-       char primary_key; /** Primary key */
-       char device_icon; /** Device icon */
-       char secondary_key; /** Purpose */
-       char *device_uid; /** DEVICE_UID */
-       char *bt_mac; /** BT MAC Address */
-} uam_db_payload_info_t;
-
 typedef struct {
        uam_tech_type_e tech_type; /**< Connectivity type */
        GSList *addresses; /**< Address list */
@@ -83,6 +84,7 @@ typedef struct {
        gboolean discriminant; /**< Decide whether to detect device or not */
        struct uam_db_device_info *device; /**< Device info which stored in the DB */
        GSList *svc_list; /**< Service list */
+       GSList *svc_dev_list; /**< Service device list */
 } uam_db_tech_info_t;
 
 typedef struct uam_db_device_info {
index 9d5375e8a9ccca6e63ba507d440773e91326d17b..66760ffb0686305f6f2f267529f8afdde9e991cd 100644 (file)
@@ -184,6 +184,7 @@ typedef struct {
        char svc[UAM_SERVICE_MAX_STRING_LEN]; /**< Service name */
        int discriminant; /**< Discriminant for each service */
        unsigned long long last_seen; /**< Last seen time for each device of each service */
+       uam_ble_payload_s payload_info; /** Payload info for this device service */
 } db_svc_dev_info_t;
 
 /* db init/deinit */
index 928340ce1a35142039b6aec2d11a8601773e7614..5da6d1a417a41b0e0836420ab6a130d96e28cb3c 100644 (file)
@@ -193,6 +193,20 @@ static void __print_service(gpointer data, gpointer user_data)
        FUNC_EXIT;
 }
 
+static void __print_svc_dev(gpointer data, gpointer user_data)
+{
+       FUNC_ENTRY;
+       uam_svc_dev_info_t *svc_dev = data;
+
+       ret_if(NULL == svc_dev);
+
+       UAM_DBG("DevId: %s, Svc: %s, payload primary key: %d",
+                       svc_dev->device_id, svc_dev->service,
+                       svc_dev->payload->primary_key);
+
+       FUNC_EXIT;
+}
+
 static void __add_service_to_dev_tech_mapping(
                uam_db_tech_info_t *tech, uam_db_service_info_t *service)
 {
@@ -658,9 +672,39 @@ static void __uam_copy_uam_payload_info(
        }
 }
 
+static GSList *_uam_core_find_svc_dev_list(uam_device_info_s *dev_info)
+{
+       FUNC_ENTRY;
+       uam_svc_dev_info_t *svc_dev = NULL;
+       GSList *l;
+       GSList *svc_dev_list = NULL;
+
+       retv_if(NULL == dev_info, NULL);
+
+       /*
+        * Iterate over the svc_devs and find each service device information
+        */
+       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, dev_info->device_id)) &&
+                               (svc_dev->tech_type == dev_info->type)) {
+                       svc_dev_list = g_slist_append(svc_dev_list, svc_dev);
+                       UAM_DBG("Service found for device in list");
+               }
+       }
+
+       FUNC_EXIT;
+       return svc_dev_list;
+}
+
 static void __uam_core_add_dev_to_list(
                uam_db_user_info_t *user, const uam_device_info_s *dev_info,
-               int presence_state, unsigned long long last_seen, GSList *svc_list)
+               int presence_state, unsigned long long last_seen, GSList *svc_list,
+               GSList *svc_dev_list)
 {
        FUNC_ENTRY;
        uam_db_tech_info_t *tech;
@@ -716,6 +760,8 @@ static void __uam_core_add_dev_to_list(
 
                service->dev_techs = g_slist_prepend(service->dev_techs, tech);
        }
+       tech->svc_dev_list = svc_dev_list;
+       g_slist_foreach(tech->svc_dev_list, __print_svc_dev, NULL);
 
        /* Add tech info to tech list */
        device->tech_list = g_slist_append(device->tech_list, tech);
@@ -1485,7 +1531,8 @@ static uam_svc_dev_info_t *_uam_core_find_svc_dev_info(const char *device_id,
 }
 
 static int _uam_core_update_svc_dev_info(const char *device_id, uam_tech_type_e tech_type,
-       const char *svc_name, gboolean discriminant, unsigned long long last_seen)
+       const char *svc_name, gboolean discriminant, unsigned long long last_seen,
+       uam_ble_payload_s *payload_info)
 {
        FUNC_ENTRY;
        uam_svc_dev_info_t *svc = NULL;
@@ -1501,14 +1548,19 @@ static int _uam_core_update_svc_dev_info(const char *device_id, uam_tech_type_e
                svc->device_id = g_strdup(device_id);
                svc->tech_type = tech_type;
                svc->service = g_strdup(svc_name);
+               svc->payload = g_new0(uam_db_payload_info_t, 1);
+               __uam_copy_uam_payload_info(svc->payload, payload_info);
                svc_devs = g_slist_append(svc_devs, svc);
        }
 
        svc->discriminant = discriminant;
        svc->last_seen = last_seen;
+       __uam_copy_uam_payload_info(svc->payload, payload_info);
 
-       UAM_DBG("Service [%s] device [%s] tech_type [%d] discriminant [%d] last_seen[%llu]",
-               svc->service, svc->device_id, svc->tech_type, svc->discriminant, svc->last_seen);
+       UAM_DBG("Service [%s] device [%s] tech_type [%d] discriminant [%d] " \
+               "last_seen [%llu] payload primary key [%d]",
+               svc->service, svc->device_id, svc->tech_type, svc->discriminant,
+               svc->last_seen, svc->payload->primary_key);
 
        FUNC_EXIT;
        return UAM_ERROR_NONE;
@@ -1597,8 +1649,8 @@ int _uam_core_service_add_user(const char *svc_name, const char *account)
                                __uam_db_end_transaction(0);
                                return ret;
                        }
-                       ret = _uam_core_update_svc_dev_info(device->device_id,
-                                       tech->tech_type, service->name, device->discriminant, 0);
+                       ret = _uam_core_update_svc_dev_info(device->device_id, tech->tech_type,
+                                               service->name, device->discriminant, 0, NULL);
                        if (UAM_ERROR_NONE != ret) {
                                UAM_WARN("Device service addition to service device mapping failed");
                                __uam_db_end_transaction(0);
@@ -1752,7 +1804,7 @@ int _uam_core_service_add_device(const char *svc_name, const char *device_id,
                return ret;
        }
        ret = _uam_core_update_svc_dev_info(device_id, tech_type, service->name,
-                       tech_info->discriminant, 0);
+                       tech_info->discriminant, 0, NULL);
        if (UAM_ERROR_NONE != ret) {
                UAM_WARN("Device service addition to svc dev mapping failed");
                return ret;
@@ -2333,6 +2385,43 @@ int _uam_core_init(void)
                }
        }
 
+       /* Fetch payload list */
+       db_payload_list = _uam_db_get_all_payloads();
+       if (!db_payload_list) {
+               UAM_INFO_C("No device payload in database");
+       } else {
+               for (l = db_payload_list; NULL != l; l = g_slist_next(l)) {
+                       db_payload_info_t *db_payload = l->data;
+                       uam_db_payload_info_t *payload = g_new0(uam_db_payload_info_t, 1);
+                       GSList *l1 = NULL;
+
+                       if (!db_payload)
+                               continue;
+
+//                     l1 = g_slist_find_custom(payloads,
+//                                     db_payload->payload_name, __compare_payload_name);
+                       if (!l1) {
+                               payload = g_new0(uam_db_payload_info_t, 1);
+                               __uam_copy_uam_payload_info(payload, &(db_payload->payload_info));
+                               payloads = g_slist_append(payloads, payload);
+                       }
+               }
+       }
+
+       /* Fetch svc dev list */
+       db_svc_dev_list = _uam_db_get_service_devices_info();
+       if (!db_svc_dev_list) {
+               UAM_INFO_C("No service devices in database");
+       } else {
+               for (l = db_svc_dev_list; NULL != l; l = g_slist_next(l)) {
+                       db_svc_dev_info_t *db_svc = l->data;
+
+                       _uam_core_update_svc_dev_info(db_svc->device_id, db_svc->type,
+                                       db_svc->svc, db_svc->discriminant, db_svc->last_seen,
+                                       &(db_svc->payload_info));
+               }
+       }
+
        /* Fetch device list */
        db_devices = _uam_device_db_get_all_devices();
        if (!db_devices) {
@@ -2343,6 +2432,7 @@ int _uam_core_init(void)
                        db_device_info_t *db_info = l->data;
                        uam_db_user_info_t *user;
                        GSList *svc_list = NULL;
+                       GSList *svc_dev_list = NULL;
                        GSList *l1;
 
                        if (!db_info)
@@ -2363,8 +2453,11 @@ int _uam_core_init(void)
                                db_info->dev_info.mac);
 
                        svc_list = __convert_db_svc_list_to_uam_svc_list(l1);
+
+                       svc_dev_list = _uam_core_find_svc_dev_list(&(db_info->dev_info));
                        __uam_core_add_dev_to_list(user, &(db_info->dev_info),
-                               db_info->presence_state, db_info->last_seen, svc_list);
+                               db_info->presence_state, db_info->last_seen,
+                               svc_list, svc_dev_list);
                }
        }
 
@@ -2379,42 +2472,6 @@ int _uam_core_init(void)
                }
        }
 
-       /* Fetch svc dev list */
-       db_svc_dev_list = _uam_db_get_service_devices_info();
-       if (!db_svc_dev_list) {
-               UAM_INFO_C("No service devices in database");
-       } else {
-               for (l = db_svc_dev_list; NULL != l; l = g_slist_next(l)) {
-                       db_svc_dev_info_t *db_svc = l->data;
-
-                       _uam_core_update_svc_dev_info(db_svc->device_id, db_svc->type,
-                                       db_svc->svc, db_svc->discriminant, db_svc->last_seen);
-               }
-       }
-
-       /* Fetch payload list */
-       db_payload_list = _uam_db_get_all_payloads();
-       if (!db_payload_list) {
-               UAM_INFO_C("No device payload in database");
-       } else {
-               for (l = db_payload_list; NULL != l; l = g_slist_next(l)) {
-                       db_payload_info_t *db_payload = l->data;
-                       uam_db_payload_info_t *payload = g_new0(uam_db_payload_info_t, 1);
-                       GSList *l1 = NULL;
-
-                       if (!db_payload)
-                               continue;
-
-//                     l1 = g_slist_find_custom(payloads,
-//                                     db_payload->payload_name, __compare_payload_name);
-                       if (!l1) {
-                               payload = g_new0(uam_db_payload_info_t, 1);
-                               __uam_copy_uam_payload_info(payload, &(db_payload->payload_info));
-                               payloads = g_slist_append(payloads, payload);
-                       }
-               }
-       }
-
        g_slist_free_full(db_devices, g_free);
        g_slist_free_full(db_users, g_free);
        g_slist_free_full(db_svc_list, g_free);
@@ -2487,6 +2544,7 @@ void _uam_core_deinit(void)
 
                g_free(svc_dev->device_id);
                g_free(svc_dev->service);
+               g_free(svc_dev->payload);
                g_free(svc_dev);
        }
        g_slist_free(svc_devs);
@@ -2531,7 +2589,9 @@ int _uam_core_handle_device_added(int status,
        GSList *l;
        int ret = UAM_ERROR_NONE;
        GSList *svc_list = NULL;
+       GSList *svc_dev_list = NULL;
        uam_db_user_info_t *user = NULL;
+       uam_svc_dev_info_t *svc_dev = NULL;
 
        UAM_INFO("[%d]", user_id);
 
@@ -2611,9 +2671,22 @@ int _uam_core_handle_device_added(int status,
                svc_list = g_slist_append(svc_list, service);
        }
 
-       __uam_core_add_dev_to_list(user, dev_info,
-                       UAM_PRESENCE_STATE_PRESENT, dev_info->last_seen, svc_list);
+       /** updates for svc dev*/
+       ret = _uam_core_update_svc_dev_info(dev_info->device_id, dev_info->type,
+                               UAM_SERVICE_DEFAULT, dev_info->discriminant, 0, NULL);
+       if (UAM_ERROR_NONE != ret) {
+               UAM_WARN("Device service mappiing update failed");
+               __send_device_event(ret, UAM_EVENT_DEVICE_ADDED, dev_info);
+               return ret;
+       }
+
+       svc_dev = _uam_core_find_svc_dev_info(dev_info->device_id,
+                       dev_info->type, UAM_SERVICE_DEFAULT);
+       svc_dev_list = g_slist_append(svc_dev_list, svc_dev);
+       __uam_core_add_dev_to_list(user, dev_info, UAM_PRESENCE_STATE_PRESENT,
+                       dev_info->last_seen, svc_list, svc_dev_list);
 
+       /** Start database transaction */
        retv_if(UAM_ERROR_NONE != __uam_db_begin_transaction(), UAM_ERROR_DB_FAILED);
 
        /* Add device to database */
@@ -2637,14 +2710,7 @@ int _uam_core_handle_device_added(int status,
                return ret;
        }
        __uam_db_end_transaction(1);
-
-       ret = _uam_core_update_svc_dev_info(dev_info->device_id, dev_info->type,
-                               UAM_SERVICE_DEFAULT, dev_info->discriminant, 0);
-       if (UAM_ERROR_NONE != ret) {
-               UAM_WARN("Device service mappiing update failed");
-               __send_device_event(ret, UAM_EVENT_DEVICE_ADDED, dev_info);
-               return ret;
-       }
+       /** End database transaction */
 
        /* Send device added event to application */
        __send_device_event(ret, UAM_EVENT_DEVICE_ADDED, dev_info);
index 024e50c31f7650937a77e0852e20863d323ab170..2ba41c18f80a1e3445d49cfd0975bcc1ee286323 100644 (file)
        "FROM device_services where device_number = ?"
 
 #define SELECT_DEVICE_SERVICES \
-       "SELECT D.device_id, D.tech_type, S.service_name, P.discriminant, P.last_seen " \
-       "FROM device_services as P JOIN services as S USING(service_number) JOIN devices as D " \
-       "USING(device_number)"
+       "SELECT D.device_id, D.tech_type, S.service_name, X.discriminant, X.last_seen, " \
+       "P.primary_key, P.secondary_key, P.device_uid, P.device_icon" \
+       "FROM device_services as X JOIN services as S USING(service_number) JOIN devices as D " \
+       "USING(device_number) JOIN payloads as P USING(payload_number)"
 
 #define INSERT_DEVICE_SERVICE "insert into device_services " \
        "(device_number, service_number, discriminant, last_seen) values (?, ?, ?, ?)"
@@ -775,6 +776,7 @@ GSList *_uam_db_get_service_devices_info()
        GSList *svc_dev_list = NULL;
        db_svc_dev_info_t *info = NULL;
        int sql_ret = SQLITE_OK;
+       char *buf = NULL;
 
        do {
                sql_ret = sqlite3_step(stmt);
@@ -792,13 +794,26 @@ GSList *_uam_db_get_service_devices_info()
                                UAM_SERVICE_MAX_STRING_LEN);
                        info->discriminant = sqlite3_column_int(stmt, 3);
                        info->last_seen = sqlite3_column_int64(stmt, 4);
-
-                       UAM_INFO("%s-%d-%s-%d-%llu",
+                       buf = (char *)sqlite3_column_text(stmt, 5);
+                       info->payload_info.primary_key = buf ? *buf : 13;
+                       buf = (char *)sqlite3_column_text(stmt, 6);
+                       info->payload_info.secondary_key = buf ? *buf : 1;
+                       buf = (char *)sqlite3_column_text(stmt, 7);
+                       if (buf)
+                               memcpy(info->payload_info.device_uid, buf,
+                                       UAM_BLE_PAYLOAD_DEVICE_UID_LEN);
+                       buf = (char *)sqlite3_column_text(stmt, 8);
+                       info->payload_info.device_icon = buf ? *buf : 1;
+
+                       UAM_INFO("device id:%s-%d-%s-%d-%llu " \
+                               "primary key: %d secondary key: %d",
                                info->device_id,
                                info->type,
                                info->svc,
                                info->discriminant,
-                               info->last_seen);
+                               info->last_seen,
+                               info->payload_info.primary_key,
+                               info->payload_info.secondary_key);
 
                        svc_dev_list = g_slist_append(svc_dev_list, info);
                        break;