implement unset event cb 60/64460/4 accepted/tizen/common/20160407.132222 accepted/tizen/ivi/20160407.110323 accepted/tizen/mobile/20160407.110238 accepted/tizen/tv/20160407.110250 accepted/tizen/wearable/20160407.110307 submit/tizen/20160407.000614
authorJunghyun Yeon <jungh.yeon@samsung.com>
Fri, 1 Apr 2016 08:48:00 +0000 (17:48 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Wed, 6 Apr 2016 05:37:06 +0000 (22:37 -0700)
Change-Id: I81fb79d9ef288c1f8075dcde886912c47e0a45f8
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
src/package_manager.c

index 8063adc..40f0849 100644 (file)
@@ -45,6 +45,7 @@ struct package_manager_s {
        event_info *head;
        package_manager_event_cb event_cb;
        package_manager_global_event_cb global_event_cb;
+       void *global_user_data;
        void *user_data;
 };
 
@@ -176,14 +177,15 @@ API int package_manager_request_set_event_cb(package_manager_request_h request,
 
 API int package_manager_request_unset_event_cb(package_manager_request_h request)
 {
-       /* TODO: Please implement this function. */
        if (package_manager_client_validate_handle(request))
                return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
 
+       request->event_cb = NULL;
+       request->user_data = NULL;
+
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
-
 API int package_manager_request_set_type(package_manager_request_h request,
                                     const char *pkg_type)
 {
@@ -789,7 +791,7 @@ static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_ty
                        manager->global_event_cb(target_uid, pkg_type, pkg_name,
                                          event_type,
                                          PACKAGE_MANAGER_EVENT_STATE_STARTED,
-                                         0, PACKAGE_MANAGER_ERROR_NONE, manager->user_data);
+                                         0, PACKAGE_MANAGER_ERROR_NONE, manager->global_user_data);
 
        } else if (strcasecmp(key, "install_percent") == 0
                   || strcasecmp(key, "progress_percent") == 0) {
@@ -812,7 +814,7 @@ static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_ty
                                                  PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
                                                  atoi(val),
                                                  PACKAGE_MANAGER_ERROR_NONE,
-                                                 manager->user_data);
+                                                 manager->global_user_data);
                }
 
        } else if (strcasecmp(key, "error") == 0) {
@@ -838,7 +840,7 @@ static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_ty
                                                  PACKAGE_MANAGER_EVENT_STATE_FAILED,
                                                  0,
                                                  PACKAGE_MANAGER_ERROR_NONE,
-                                                 manager->user_data);
+                                                 manager->global_user_data);
                }
        } else if (strcasecmp(key, "end") == 0) {
                if (__find_event
@@ -858,7 +860,7 @@ static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_ty
                                                          PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
                                                          100,
                                                          PACKAGE_MANAGER_ERROR_NONE,
-                                                         manager->user_data);
+                                                         manager->global_user_data);
                        }
                } else {
                        if (strcasecmp(key, "ok") != 0) {
@@ -875,7 +877,7 @@ static int global_event_handler(uid_t target_uid, int req_id, const char *pkg_ty
                                                          PACKAGE_MANAGER_EVENT_STATE_FAILED,
                                                          0,
                                                          PACKAGE_MANAGER_ERROR_NONE,
-                                                         manager->user_data);
+                                                         manager->global_user_data);
                        }
                }
        }
@@ -932,7 +934,24 @@ API int package_manager_unset_event_cb(package_manager_h manager)
                     NULL);
        }
 
-       /* TODO: Please implement this function. */
+       int retval;
+       manager->event_cb = NULL;
+       manager->user_data = NULL;
+
+       if (manager->global_event_cb == NULL) {
+               retval = pkgmgr_client_remove_listen_status(manager->pc);
+               if (retval == PKGMGR_R_EINVAL)
+                       return
+                                package_manager_error
+                                (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
+                                 NULL);
+               else if (retval == PKGMGR_R_ERROR)
+                       return
+                                package_manager_error
+                                (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
+                                 NULL);
+       }
+
        return PACKAGE_MANAGER_ERROR_NONE;
 }
 
@@ -959,7 +978,7 @@ API int package_manager_set_global_event_cb(package_manager_h manager,
        }
 
        manager->global_event_cb = callback;
-       manager->user_data = user_data;
+       manager->global_user_data = user_data;
 
        pkgmgr_client_listen_status(manager->pc, global_event_handler, manager);
 
@@ -968,6 +987,8 @@ API int package_manager_set_global_event_cb(package_manager_h manager,
 
 API int package_manager_unset_global_event_cb(package_manager_h manager)
 {
+       int retval;
+
        if (manager == NULL) {
                return
                    package_manager_error
@@ -975,7 +996,23 @@ API int package_manager_unset_global_event_cb(package_manager_h manager)
                     NULL);
        }
 
-       /* TODO: Please implement this function. */
+       manager->global_event_cb = NULL;
+       manager->global_user_data = NULL;
+
+       if (manager->event_cb == NULL) {
+               retval = pkgmgr_client_remove_listen_status(manager->pc);
+               if (retval == PKGMGR_R_EINVAL)
+                       return
+                                package_manager_error
+                                (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
+                                 NULL);
+               else if (retval == PKGMGR_R_ERROR)
+                       return
+                                package_manager_error
+                                (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
+                                 NULL);
+       }
+
        return PACKAGE_MANAGER_ERROR_NONE;
 }