Fix package event handlers 55/123455/4
authorjongmyeongko <jongmyeong.ko@samsung.com>
Wed, 5 Apr 2017 14:29:35 +0000 (23:29 +0900)
committerjongmyeongko <jongmyeong.ko@samsung.com>
Tue, 11 Apr 2017 02:24:29 +0000 (11:24 +0900)
Add release the resources of package event handlers
Refine global event handler logic as pubic signal spec
start -> something or not -> end

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

index 09fd401..33f32b8 100644 (file)
@@ -84,6 +84,21 @@ static int package_manager_new_id()
        return manager_handle_id++;
 }
 
+static void __clean_all_event_info(event_info *head)
+{
+       event_info *current = head;
+       event_info *prev;
+
+       if (current == NULL)
+               return;
+
+       while (current) {
+               prev = current;
+               current = current->next;
+               free(prev);
+       }
+}
+
 API int package_manager_request_create(package_manager_request_h *request)
 {
        struct package_manager_request_s *package_manager_request;
@@ -142,6 +157,7 @@ API int package_manager_request_destroy(package_manager_request_h request)
        pkgmgr_client_free(request->pc);
        request->pc = NULL;
        free(request->pkg_type);
+       __clean_all_event_info(request->head);
        free(request);
 
        return PACKAGE_MANAGER_ERROR_NONE;
@@ -301,7 +317,7 @@ static int __find_event_info(event_info **head, int req_id,
                return -1;
        }
 
-       _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, event_type);
+       _LOGD("tmp->req_id %d, event_type %d", tmp->req_id, *event_type);
 
        while (tmp) {
                if (tmp->req_id == req_id) {
@@ -630,6 +646,7 @@ API int package_manager_destroy(package_manager_h manager)
 
        pkgmgr_client_free(manager->pc);
        manager->pc = NULL;
+       __clean_all_event_info(manager->head);
        free(manager);
 
        return PACKAGE_MANAGER_ERROR_NONE;
@@ -639,12 +656,14 @@ static int __add_event(event_info **head, int req_id,
                            package_manager_event_type_e event_type,
                            package_manager_event_state_e event_state)
 {
-       event_info *evt_info;
+       event_info *evt_info = *head;
 
-       evt_info = (event_info *) calloc(1, sizeof(event_info));
-       if (evt_info == NULL) {
-               _LOGD("calloc failed");
-               return -1;
+       if (!evt_info) {
+               evt_info = (event_info *)calloc(1, sizeof(event_info));
+               if (evt_info == NULL) {
+                       _LOGD("calloc failed");
+                       return -1;
+               }
        }
        evt_info->req_id = req_id;
        evt_info->event_type = event_type;
@@ -660,9 +679,7 @@ static int __find_event(event_info **head, int req_id,
                             package_manager_event_type_e *event_type,
                             package_manager_event_state_e *event_state)
 {
-       event_info *tmp;
-
-       tmp = *head;
+       event_info *tmp = *head;
 
        if (tmp == NULL) {
                _LOGE("tmp is NULL");
@@ -671,6 +688,7 @@ static int __find_event(event_info **head, int req_id,
 
        *event_type = tmp->event_type;
        *event_state = tmp->event_state;
+
        return 0;
 }
 
@@ -678,26 +696,17 @@ static int __update_event(event_info **head, int req_id,
                               package_manager_event_type_e event_type,
                               package_manager_event_state_e event_state)
 {
-       package_manager_event_type_e evt_type;
-       package_manager_event_state_e evt_state;
-       event_info *tmp;
+       event_info *tmp = *head;
 
-       if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
-               __add_event_info(head, req_id, event_type, event_state);
-       else {
-               tmp = *head;
-
-               if (tmp == NULL) {
-                       _LOGE("tmp is NULL");
-                       return -1;
-               }
-
-               tmp->event_type = event_type;
-               tmp->event_state = event_state;
-               return 0;
+       if (tmp == NULL) {
+               _LOGE("tmp is NULL");
+               return -1;
        }
 
-       return -1;
+       tmp->event_type = event_type;
+       tmp->event_state = event_state;
+
+       return 0;
 }
 
 /* App Event Listening Policy:
@@ -734,7 +743,8 @@ static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_ty
        package_manager_event_state_e event_state = -1;
        uid_t uid = target_uid;
 
-       _LOGD("global_event_handler is called");
+       _LOGD("req_id(%d), pkg_name(%s), type(%s), key(%s), val(%s)",
+                       req_id, pkg_name, pkg_type, key, val);
 
        package_manager_h manager = data;
 
@@ -772,49 +782,52 @@ static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_ty
                                                  atoi(val),
                                                  PACKAGE_MANAGER_ERROR_NONE,
                                                  manager->user_data);
+               } else {
+                       _LOGE("unexpected progress event");
                }
-
        } else if (strcasecmp(key, "error") == 0) {
-               if (strcasecmp(key, "0") != 0) {
-                       if (__find_event
-                           (&(manager->head), req_id, &event_type,
-                            &event_state) == 0) {
-                               __update_event(&(manager->head), req_id,
-                                                   event_type,
-                                                   PACKAGE_MANAGER_EVENT_STATE_FAILED);
-                       }
+               if (__find_event
+                   (&(manager->head), req_id, &event_type,
+                    &event_state) == 0) {
+                       __update_event(&(manager->head), req_id,
+                                           event_type,
+                                           PACKAGE_MANAGER_EVENT_STATE_FAILED);
 
                        if (manager->event_cb && getuid() == uid)
-                               manager->event_cb(pkg_type,
-                                                 pkg_name, event_type,
-                                                 PACKAGE_MANAGER_EVENT_STATE_FAILED,
-                                                 0,
-                                                 PACKAGE_MANAGER_ERROR_NONE,
-                                                 manager->user_data);
+                       manager->event_cb(pkg_type,
+                                         pkg_name, event_type,
+                                         PACKAGE_MANAGER_EVENT_STATE_FAILED,
+                                         0,
+                                         PACKAGE_MANAGER_ERROR_NONE,
+                                         manager->user_data);
+               } else {
+                       _LOGE("unexpected error event");
                }
        } else if (strcasecmp(key, "end") == 0) {
                if (__find_event
                    (&(manager->head), req_id, &event_type,
                     &event_state) == 0) {
                        if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
-                               if (manager->event_cb && getuid() == uid)
-                                       manager->event_cb(pkg_type,
+                               if (manager->event_cb && getuid() == uid) {
+                                       if (strcasecmp(val, "ok") == 0) {
+                                               manager->event_cb(pkg_type,
                                                          pkg_name, event_type,
                                                          PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
                                                          100,
                                                          PACKAGE_MANAGER_ERROR_NONE,
                                                          manager->user_data);
-                       }
-               } else {
-                       if (strcasecmp(key, "ok") != 0) {
-                               if (manager->event_cb && getuid() == uid)
-                                       manager->event_cb(pkg_type,
+                                       } else {
+                                               manager->event_cb(pkg_type,
                                                          pkg_name, event_type,
                                                          PACKAGE_MANAGER_EVENT_STATE_FAILED,
                                                          0,
                                                          PACKAGE_MANAGER_ERROR_NONE,
                                                          manager->user_data);
+                                       }
+                               }
                        }
+               } else {
+                       _LOGE("unexpected end event");
                }
        }