Remove device only when not being used by any service
authorAbhay agarwal <ay.agarwal@samsung.com>
Thu, 22 Aug 2019 12:00:52 +0000 (17:30 +0530)
committersaerome.kim <saerome.kim@samsung.com>
Mon, 26 Aug 2019 13:54:57 +0000 (22:54 +0900)
Change-Id: I3fc7bfc47acc7fa82d29c5ca57d064d6728b1be1
Signed-off-by: Abhay agarwal <ay.agarwal@samsung.com>
ua-daemon/include/ua-manager-database.h
ua-daemon/src/ua-manager-core.c
ua-daemon/src/ua-manager-device-service-db.c
ua-daemon/src/ua-manager-service-db.c

index a1a527d..a90aa37 100644 (file)
@@ -163,6 +163,8 @@ int _ua_device_service_db_deinitialize(void);
 GSList *_uam_db_get_service(int device_number);
 GSList *_uam_db_get_device_services(
        const char *device_id, int tech_type, const char *address);
+int _uam_db_get_device_services_count(const char *device_id, int tech_type,
+       const char *address, int *count);
 
 /* delete operations */
 int _ua_device_service_db_clear(void);
index b4dcc60..a2b94d5 100644 (file)
@@ -487,20 +487,20 @@ static void __get_uam_db_dev_list_to_uam_dev_list(
 static void __uam_core_copy_addr(uam_device_info_s *device, uam_db_address_info_t *addr)
 {
        switch (addr->addr_type) {
-               case UAM_ADDR_TYPE_BLE:
-               case UAM_ADDR_TYPE_BT:
-               case UAM_ADDR_TYPE_P2P:
-               case UAM_ADDR_TYPE_WIFI:
-                       g_strlcpy(device->mac, addr->address,
-                                       UAM_MAC_ADDRESS_STRING_LEN);
-                       break;
-               case UAM_ADDR_TYPE_IPv4:
-                       g_strlcpy(device->ipv4_addr,
-                                       addr->address,
-                                       UAM_IP_ADDRESS_MAX_STRING_LEN);
-                       break;
-               default:
-                       UAM_WARN("Unknown address type %d", addr->addr_type);
+       case UAM_ADDR_TYPE_BLE:
+       case UAM_ADDR_TYPE_BT:
+       case UAM_ADDR_TYPE_P2P:
+       case UAM_ADDR_TYPE_WIFI:
+               g_strlcpy(device->mac, addr->address,
+                               UAM_MAC_ADDRESS_STRING_LEN);
+               break;
+       case UAM_ADDR_TYPE_IPv4:
+               g_strlcpy(device->ipv4_addr,
+                               addr->address,
+                               UAM_IP_ADDRESS_MAX_STRING_LEN);
+               break;
+       default:
+               UAM_WARN("Unknown address type %d", addr->addr_type);
        }
 }
 
@@ -912,6 +912,22 @@ static int __uam_remove_device(int user_id, uam_db_device_info_t *device,
 {
        int ret;
        GSList *l;
+       int count = 0;
+
+       ret = _uam_db_get_device_services_count(dev_info->device_id,
+                               dev_info->type, dev_info->mac, &count);
+       if (UAM_ERROR_NONE != ret) {
+               UAM_ERR("_uam_db_get_device_services_count failed with %s",
+                               _uam_manager_error_to_str(ret));
+               return ret;
+       }
+
+       if (0 != count) {
+               ret = UAM_ERROR_NOW_IN_PROGRESS;
+               UAM_ERR("__uam_remove_device failed with %s",
+                               _uam_manager_error_to_str(ret));
+               return ret;
+       }
 
        ret = _uam_pm_unregister_device(user_id, dev_info);
        if (UAM_ERROR_NONE != ret) {
index e6f06b8..cb37d04 100644 (file)
@@ -28,6 +28,9 @@
        "FROM device_services as D JOIN services as S USING(service_number) " \
        "where D.device_number = ?"
 
+#define SELECT_DEVICE_SERVICES_COUNT "SELECT count(*) " \
+       "FROM device_services where device_number = ?"
+
 #define INSERT_DEVICE_SERVICE "insert into device_services " \
        "(device_number, service_number) values (?, ?)"
 
@@ -46,6 +49,7 @@ static sqlite3_stmt *delete_device_service;
 
 /* SELECT statements */
 static sqlite3_stmt *select_service;
+static sqlite3_stmt *select_device_services_count;
 
 /* UPDATE statements */
 //TO-DO
@@ -70,6 +74,7 @@ static void __ua_device_service_finalize_select(void)
        FUNC_ENTRY;
 
        FINALIZE(select_service);
+       FINALIZE(select_device_services_count);
 
        FUNC_EXIT;
 }
@@ -129,6 +134,8 @@ static int __ua_device_service_prepare_select(sqlite3 *db)
 
        PREPARE_QUERY(rc, db, select_service,
                SELECT_SERVICE, __ua_device_service_finalize_select);
+       PREPARE_QUERY(rc, db, select_device_services_count,
+               SELECT_DEVICE_SERVICES_COUNT, __ua_device_service_finalize_select);
 
        initialized = 1;
        FUNC_EXIT;
@@ -481,3 +488,46 @@ handle_error:
        FUNC_EXIT;
        return service_list;
 }
+int _uam_db_get_device_services_count(const char *device_id, int tech_type,
+       const char *address, int *svc_count)
+{
+       FUNC_ENTRY;
+       int rc;
+       int error_code = UAM_ERROR_NONE;
+       sqlite3_stmt *stmt = select_device_services_count;
+       int device_number = 0;
+
+       retv_if(NULL == device_id, UAM_ERROR_INVALID_PARAMETER);
+       retv_if(NULL == address, UAM_ERROR_INVALID_PARAMETER);
+       UAM_INFO("%s-%d-%s", device_id, tech_type, address);
+
+       error_code = _uam_db_get_device_number(device_id, tech_type, address, &device_number);
+       if (UAM_ERROR_NONE != error_code)
+               goto handle_error;
+
+       DB_ACTION(sqlite3_bind_int(stmt, 1, device_number),
+               error_code, handle_error);
+
+       do {
+               rc = sqlite3_step(stmt);
+
+               switch (rc) {
+               case SQLITE_DONE:
+                       break;
+               case SQLITE_ROW:
+                       UAM_DBG("Device services count info found");
+                       *svc_count = sqlite3_column_int(stmt, 0);
+                       UAM_INFO("device services count %d", *svc_count);
+                       break;
+               case SQLITE_ERROR:
+               default:
+                       UAM_ERR("Failed to enumerate device info: %s",
+                                       sqlite3_errmsg(__ua_device_service_db_get_database()));
+               }
+       } while (rc == SQLITE_ROW);
+
+handle_error:
+       sqlite3_reset(stmt);
+       FUNC_EXIT;
+       return error_code;
+}
index eae9ce0..ce32a4a 100644 (file)
@@ -321,6 +321,12 @@ int _uam_db_delete_service_info(const char *service_name)
 
        UAM_INFO("Service name: %s", service_name);
 
+       error_code = _uam_db_delete_device_service(service_name);
+       if (UAM_ERROR_NONE != error_code) {
+               UAM_ERR("_uam_db_delete_device_service failed");
+               return error_code;
+       }
+
        DB_ACTION(sqlite3_bind_text(stmt, 1, service_name, -1, SQLITE_STATIC),
                error_code, handle_error);