Modify service-user based API's 59/259059/3
authorrohit singh <rohit.singh@samsung.com>
Thu, 27 May 2021 05:16:12 +0000 (10:46 +0530)
committerrohit singh <rohit.singh@samsung.com>
Tue, 1 Jun 2021 06:28:00 +0000 (11:58 +0530)
This patch modifies:
1) ua_service_remove_user
2) adds the app_num attribute support to the
service-user hierarchy based API's.

Change-Id: I6d080b0356b9fb8a3632c0c09e8f057698673faa
Signed-off-by: rohit.singh <rohit.singh@samsung.com>
ua-daemon/include/ua-manager-core.h
ua-daemon/src/ua-manager-core.c

index a9904f6..d94526e 100644 (file)
@@ -109,6 +109,7 @@ typedef struct uam_db_device_info {
 typedef struct uam_svc_user_info {
        char* account; /**< Account */
        char* svc_name; /**< Service name */
+       int app_num; /**< Identity of respective app */
 } uam_svc_user_info_t;
 
 typedef struct uam_db_user_info {
index ea17f9f..e85edd7 100755 (executable)
@@ -199,20 +199,26 @@ static gint __compare_svc_user(gconstpointer data, gconstpointer user_data)
        retv_if(NULL == tmp_svc_user->account, -1);
 
        if (g_strcmp0(svc_user->svc_name, tmp_svc_user->svc_name) == 0)
-               return g_strcmp0(svc_user->account, tmp_svc_user->account);
+               if (g_strcmp0(svc_user->account, tmp_svc_user->account) == 0)
+                       return svc_user->app_num ==  tmp_svc_user->app_num ? 0 : -1;
+               else
+                       return -1;
        else
-               return g_strcmp0(svc_user->svc_name, tmp_svc_user->svc_name);
+               return -1;
 }
 
 static gint __compare_svc_user_account(gconstpointer data, gconstpointer user_data)
 {
        const uam_svc_user_info_t *svc_user = data;
-       const char *account = user_data;
+       const uam_db_user_info_t *user = user_data;
 
        retv_if(NULL == svc_user, -1);
-       retv_if(NULL == account, -1);
+       retv_if(NULL == user, -1);
 
-       return g_strcmp0(svc_user->account, account);
+       if (g_strcmp0(svc_user->account, user->account) == 0)
+               return svc_user->app_num == user->app_num ? 0 : -1;
+       else
+               return -1;
 }
 
 static gint __compare_payload(gconstpointer data, gconstpointer user_data)
@@ -596,6 +602,26 @@ GSList* __search_user(const char *account, int app_num)
        return l;
 }
 
+GSList* __search_svc_user(const char* svc_name, const char* account, int app_num)
+{
+       GSList* l;
+
+       uam_svc_user_info_t *svc_user;
+
+       svc_user = g_new0(uam_svc_user_info_t, 1);
+       svc_user->svc_name = g_strdup(svc_name);
+       svc_user->account = g_strdup(account);
+       svc_user->app_num = app_num;
+
+       l = g_slist_find_custom(svc_users, svc_user, __compare_svc_user);
+
+       free_n_null(&(svc_user->svc_name));
+       free_n_null(&(svc_user->account));
+       free_n_null(&svc_user);
+
+       return l;
+}
+
 GSList* __search_device(const char *device_id, int app_num)
 {
        /* Search device in existing device list */
@@ -1005,18 +1031,15 @@ static void __init_svc_user_mapping()
                if (!user_info)
                        continue;
 
-               uam_svc_user_info_t *svc_user = g_new0(uam_svc_user_info_t, 1);
+               tmp = __search_svc_user(svc_dev->service, user_info->account, svc_dev->app_num);
+               if (!tmp) {
 
-               svc_user->svc_name = g_strdup(svc_dev->service);
-               svc_user->account = g_strdup(user_info->account);
+                       uam_svc_user_info_t *svc_user = g_new0(uam_svc_user_info_t, 1);
+                       svc_user->svc_name = g_strdup(svc_dev->service);
+                       svc_user->account = g_strdup(user_info->account);
+                       svc_user->app_num = svc_dev->app_num;
 
-               tmp = g_slist_find_custom(svc_users, svc_user, __compare_svc_user);
-               if (!tmp)
                        svc_users = g_slist_prepend(svc_users, svc_user);
-               else {
-                       free_n_null(&(svc_user->svc_name));
-                       free_n_null(&(svc_user->account));
-                       free_n_null(&svc_user);
                }
        }
 }
@@ -2328,19 +2351,22 @@ int _uam_core_service_add_user(const char *svc_name, const char *account, const
                }
        }
 
+       __uam_db_end_transaction(1);
+
        /* Add service to user mapping */
-       uam_svc_user_info_t *svc_user = g_new0(uam_svc_user_info_t, 1);
-       svc_user->svc_name = g_strdup(svc_name);
-       svc_user->account = g_strdup(account);
+       l = __search_svc_user(svc_name, account, app_num);
+
+       if (!l) {
+               uam_svc_user_info_t *svc_user = g_new0(uam_svc_user_info_t, 1);
+               svc_user->svc_name = g_strdup(svc_name);
+               svc_user->account = g_strdup(account);
+               svc_user->app_num = app_num;
 
-       l = g_slist_find_custom(svc_users, svc_user, __compare_svc_user);
-       if (!l)
                svc_users = g_slist_prepend(svc_users, svc_user);
+       }
        else
                UAM_INFO("USER SERVICE MAPPING ALLREADY PRESENT.");
 
-       __uam_db_end_transaction(1);
-
        FUNC_EXIT;
        return ret;
 }
@@ -2402,8 +2428,21 @@ int _uam_core_service_remove_user(const char *svc_name, const char *account, con
                        }
                }
        }
+
        __uam_db_end_transaction(1);
 
+       /* Removne service-user mapping from svc_users */
+
+       l = __search_svc_user(svc_name, account, app_num);
+       retv_if(NULL == l, UAM_ERROR_INVALID_PARAMETER);
+
+       uam_svc_user_info_t *svc_user = l->data;
+       svc_users = g_slist_remove_all(svc_users, svc_user);
+
+       g_free(svc_user->svc_name);
+       g_free(svc_user->account);
+       g_free(svc_user);
+
        FUNC_EXIT;
        return UAM_ERROR_NONE;
 }
@@ -3247,18 +3286,18 @@ void _uam_core_deinit(void)
        svc_devs = NULL;
 
        /* Release allocated memory for service users */
-        for (l = svc_users; NULL != l; l = g_slist_next(l)) {
-                uam_svc_user_info_t *svc_user = l->data;
+       for (l = svc_users; NULL != l; l = g_slist_next(l)) {
+               uam_svc_user_info_t *svc_user = l->data;
 
-                if (!svc_user)
-                        continue;
+               if (!svc_user)
+                       continue;
 
-                g_free(svc_user->svc_name);
-                g_free(svc_user->account);
-                g_free(svc_user);
-        }
-        g_slist_free(svc_users);
-        svc_users = NULL;
+               g_free(svc_user->svc_name);
+               g_free(svc_user->account);
+               g_free(svc_user);
+       }
+       g_slist_free(svc_users);
+       svc_users = NULL;
 
        /* Release allocated memory for payloads */
        for (l = payloads; NULL != l; l = g_slist_next(l)) {
@@ -3447,7 +3486,7 @@ int _uam_core_handle_device_added(int status,
        /* Add device to user mapped service */
        uam_svc_user_info_t* svc_user = NULL;
 
-       l = g_slist_find_custom(svc_users, user->account, __compare_svc_user_account);
+       l = g_slist_find_custom(svc_users, user, __compare_svc_user_account);
        if (!l)
                UAM_WARN("User service mapping not found.");
        else