Modify the behavior of with-callback request 62/127962/7
authorjongmyeongko <jongmyeong.ko@samsung.com>
Tue, 2 May 2017 15:26:18 +0000 (00:26 +0900)
committerjongmyeong ko <jongmyeong.ko@samsung.com>
Mon, 8 May 2017 10:48:27 +0000 (10:48 +0000)
the user callback should be managed per each request.

Change-Id: I0441f734dfe78452a8ed160f0a69e8d2bf9fe7f7
Signed-off-by: jongmyeongko <jongmyeong.ko@samsung.com>
src/package_manager.c

index 1384320..923b910 100644 (file)
@@ -28,7 +28,6 @@
 #include "package_manager_internal.h"
 
 static GHashTable *__cb_table = NULL;
-static GHashTable *__request_cb_table = NULL;
 
 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
 typedef struct _event_info {
@@ -56,6 +55,7 @@ struct package_manager_request_s {
        pkgmgr_mode mode;
        event_info *head;
        package_manager_request_event_cb event_cb;
+       GHashTable *request_cb_table;
        void *user_data;
 };
 
@@ -109,23 +109,28 @@ static void __free_request_cb_info(gpointer data)
        _LOGD("request callback info removed, req_id(%d)", req_id);
 }
 
-static void __initialize_request_cb_table(void)
+static void __initialize_request_cb_table(package_manager_request_h request)
 {
-       __request_cb_table =
+       request->request_cb_table =
                g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, __free_request_cb_info);
 }
 
-static int __insert_request_cb_info(int req_id, package_manager_request_event_cb callback, void *user_data)
+static int __insert_request_cb_info(package_manager_request_h request, int req_id,
+               package_manager_request_event_cb callback, void *user_data)
 {
        struct package_manager_request_cb_info *cb_info;
 
+       if (request->request_cb_table == NULL)
+               return -1;
+
        cb_info = calloc(1, sizeof(struct package_manager_request_cb_info));
        if (cb_info == NULL)
                return -1;
        cb_info->req_id = req_id;
        cb_info->callback = callback;
        cb_info->user_data = user_data;
-       g_hash_table_insert(__request_cb_table, GINT_TO_POINTER(cb_info->req_id), cb_info);
+       _LOGD("insert req_id(%d)", req_id);
+       g_hash_table_insert(request->request_cb_table, GINT_TO_POINTER(cb_info->req_id), cb_info);
 
        return 0;
 }
@@ -205,9 +210,11 @@ API int package_manager_request_destroy(package_manager_request_h request)
        request->pc = NULL;
        free(request->pkg_type);
        __clean_all_event_info(request->head);
+       if (request->request_cb_table) {
+               g_hash_table_destroy(request->request_cb_table);
+               request->request_cb_table = NULL;
+       }
        free(request);
-       g_hash_table_destroy(__request_cb_table);
-       __request_cb_table = NULL;
 
        return PACKAGE_MANAGER_ERROR_NONE;
 }
@@ -536,7 +543,13 @@ static int internal_request_callback(uid_t target_uid, int req_id, const char *p
        _LOGD("request callback called, req_id[%d]", req_id);
 
        package_manager_request_h request = data;
-       cb_info = g_hash_table_lookup(__request_cb_table, GINT_TO_POINTER(req_id));
+
+       if (request->request_cb_table)
+               cb_info = g_hash_table_lookup(request->request_cb_table,
+                               GINT_TO_POINTER(req_id));
+       else
+               cb_info = NULL;
+
        if (!cb_info || (cb_info && !cb_info->callback)) {
                _LOGE("no callback info");
                return 0;
@@ -591,6 +604,11 @@ static int internal_request_callback(uid_t target_uid, int req_id, const char *p
        } else if (strcasecmp(key, "end") == 0) {
                if (__find_event_info(&request->head, req_id, &event_type,
                                &event_state) == 0) {
+                       if (request->request_cb_table) {
+                               _LOGD("remove item, req_id(%d)", req_id);
+                               g_hash_table_remove(request->request_cb_table,
+                                       GINT_TO_POINTER(req_id));
+                       }
                        if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
                                if (strcasecmp(val, "ok") == 0) {
                                        event_cb(req_id, pkg_type,
@@ -611,7 +629,6 @@ static int internal_request_callback(uid_t target_uid, int req_id, const char *p
                } else {
                        _LOGE("unexpected end event");
                }
-               g_hash_table_remove(__request_cb_table, GINT_TO_POINTER(req_id));
        }
 
        return 0;
@@ -743,13 +760,13 @@ API int package_manager_request_install_with_cb(package_manager_request_h reques
        int ret;
        int req_id = 0;
 
-       if (__request_cb_table == NULL)
-               __initialize_request_cb_table();
+       if (request->request_cb_table == NULL)
+               __initialize_request_cb_table(request);
 
        ret = __request_install(request, path, internal_request_callback, &req_id);
 
        if (req_id > 0) {
-               ret = __insert_request_cb_info(req_id, callback, user_data);
+               ret = __insert_request_cb_info(request, req_id, callback, user_data);
                if (ret < 0)
                        return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
                                        __FUNCTION__, "failed to create request cb info");
@@ -773,13 +790,13 @@ API int package_manager_request_uninstall_with_cb(package_manager_request_h requ
        int ret;
        int req_id = 0;
 
-       if (__request_cb_table == NULL)
-               __initialize_request_cb_table();
+       if (request->request_cb_table == NULL)
+               __initialize_request_cb_table(request);
 
        ret = __request_uninstall(request, name, internal_request_callback, &req_id);
 
        if (req_id > 0) {
-               ret = __insert_request_cb_info(req_id, callback, user_data);
+               ret = __insert_request_cb_info(request, req_id, callback, user_data);
                if (ret < 0)
                        return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
                                        __FUNCTION__, "failed to create request cb info");
@@ -803,13 +820,13 @@ API int package_manager_request_move_with_cb(package_manager_request_h request,
        int ret;
        int req_id = 0;
 
-       if (__request_cb_table == NULL)
-               __initialize_request_cb_table();
+       if (request->request_cb_table == NULL)
+               __initialize_request_cb_table(request);
 
        ret = __request_move(request, name, move_type, internal_request_callback, &req_id);
 
        if (req_id > 0) {
-               ret = __insert_request_cb_info(req_id, callback, user_data);
+               ret = __insert_request_cb_info(request, req_id, callback, user_data);
                if (ret < 0)
                        return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
                                        __FUNCTION__, "failed to create request cb info");