From: Abhay agarwal Date: Thu, 22 Aug 2019 12:00:52 +0000 (+0530) Subject: Remove device only when not being used by any service X-Git-Tag: accepted/tizen/unified/20190826.225907~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=633fe6e966842eb86c661af8ac5fa2c63881901b;p=platform%2Fcore%2Fconnectivity%2Fua-manager.git Remove device only when not being used by any service Change-Id: I3fc7bfc47acc7fa82d29c5ca57d064d6728b1be1 Signed-off-by: Abhay agarwal --- diff --git a/ua-daemon/include/ua-manager-database.h b/ua-daemon/include/ua-manager-database.h index a1a527d..a90aa37 100644 --- a/ua-daemon/include/ua-manager-database.h +++ b/ua-daemon/include/ua-manager-database.h @@ -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); diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index b4dcc60..a2b94d5 100644 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -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) { diff --git a/ua-daemon/src/ua-manager-device-service-db.c b/ua-daemon/src/ua-manager-device-service-db.c index e6f06b8..cb37d04 100644 --- a/ua-daemon/src/ua-manager-device-service-db.c +++ b/ua-daemon/src/ua-manager-device-service-db.c @@ -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; +} diff --git a/ua-daemon/src/ua-manager-service-db.c b/ua-daemon/src/ua-manager-service-db.c index eae9ce0..ce32a4a 100644 --- a/ua-daemon/src/ua-manager-service-db.c +++ b/ua-daemon/src/ua-manager-service-db.c @@ -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);