Close the PD when the instance is deleted.
authorSung-jae Park <nicesj.park@samsung.com>
Mon, 11 Nov 2013 08:10:25 +0000 (17:10 +0900)
committerSung-jae Park <nicesj.park@samsung.com>
Mon, 11 Nov 2013 08:10:25 +0000 (17:10 +0900)
Change-Id: I0b148449378a2171ee1478571194c3bfb9af9c83

include/lb.h
packaging/com.samsung.data-provider-slave.spec
src/client.c
src/lb.c

index 34bab45..1579457 100644 (file)
@@ -35,8 +35,8 @@ extern char *lb_pinup(const char *pkgname, const char *id, int pinup);
 extern int lb_system_event(const char *pkgname, const char *id, int event);
 extern int lb_system_event_all(int event);
 
-extern int lb_open_pd(const char *pkgname);
-extern int lb_close_pd(const char *pkgname);
+extern int lb_open_pd(const char *pkgname, const char *id);
+extern int lb_close_pd(const char *pkgname, const char *id);
 
 extern int lb_pause(const char *pkgname, const char *id);
 extern int lb_resume(const char *pkgname, const char *id);
index 26ec6b9..52dcb34 100644 (file)
@@ -2,7 +2,7 @@
 
 Name: com.samsung.data-provider-slave
 Summary: Plugin type livebox service provider
-Version: 0.12.16
+Version: 0.12.17
 Release: 1
 Group: HomeTF/Livebox
 License: Flora License
index 0348f64..9e31c30 100644 (file)
@@ -324,8 +324,8 @@ static int method_pd_created(struct event_arg *arg, void *data)
 {
        int ret;
 
-       ret = lb_open_pd(arg->pkgname);
-       DbgPrint("%s Open PD: %d\n", arg->pkgname, ret);
+       ret = lb_open_pd(arg->pkgname, arg->id);
+       DbgPrint("%s Open PD: %d\n", arg->id, ret);
 
        return LB_STATUS_SUCCESS;
 }
@@ -334,8 +334,8 @@ static int method_pd_destroyed(struct event_arg *arg, void *data)
 {
        int ret;
 
-       ret = lb_close_pd(arg->pkgname);
-       DbgPrint("%s Close PD: %d\n", arg->pkgname, ret);
+       ret = lb_close_pd(arg->pkgname, arg->id);
+       DbgPrint("%s Close PD: %d\n", arg->id, ret);
 
        return LB_STATUS_SUCCESS;
 }
index ac457a8..1d52bff 100644 (file)
--- a/src/lb.c
+++ b/src/lb.c
@@ -122,11 +122,11 @@ static inline int pd_is_opened(const char *pkgname)
 {
        int i;
        Eina_List *l;
-       char *tmp;
+       struct instance *inst;
 
        i = 0;
-       EINA_LIST_FOREACH(s_info.pd_list, l, tmp) {
-               if (pkgname && !strcmp(pkgname, tmp)) {
+       EINA_LIST_FOREACH(s_info.pd_list, l, inst) {
+               if (pkgname && !strcmp(pkgname, inst->item->pkgname)) {
                        return 1;
                }
 
@@ -918,28 +918,29 @@ int livebox_trigger_update_monitor(const char *filename, int is_pd)
        return ret;
 }
 
-HAPI int lb_open_pd(const char *pkgname)
+HAPI int lb_open_pd(const char *pkgname, const char *id)
 {
+       struct instance *inst;
+       struct instance *tmp;
        Eina_List *l;
-       char *tmp;
+
+       inst = so_find_instance(pkgname, id);
+       if (!inst) {
+               ErrPrint("Instance is not found\n");
+               return LB_STATUS_ERROR_NOT_EXIST;
+       }
 
        EINA_LIST_FOREACH(s_info.pd_list, l, tmp) {
-               if (!strcmp(pkgname, tmp)) {
+               if (tmp == inst) {
                        return 0;
                }
        }
 
-       tmp = strdup(pkgname);
-       if (!tmp) {
-               ErrPrint("Heap: %s\n", strerror(errno));
-               return LB_STATUS_ERROR_MEMORY;
-       }
-
        if (!s_info.pd_list) {
                pending_timer_freeze();
        }
 
-       s_info.pd_list = eina_list_append(s_info.pd_list, tmp);
+       s_info.pd_list = eina_list_append(s_info.pd_list, inst);
 
        /*!
         * Find all instances from the pending list.
@@ -949,20 +950,25 @@ HAPI int lb_open_pd(const char *pkgname)
        return LB_STATUS_SUCCESS;
 }
 
-HAPI int lb_close_pd(const char *pkgname)
+HAPI int lb_close_pd(const char *pkgname, const char *id)
 {
        Eina_List *l;
        Eina_List *n;
-       char *tmp;
+       struct instance *tmp;
+       struct instance *inst;
+
+       inst = so_find_instance(pkgname, id);
+       if (!inst) {
+               ErrPrint("Insatnce is not found\n");
+               return LB_STATUS_ERROR_NOT_EXIST;
+       }
 
        EINA_LIST_FOREACH_SAFE(s_info.pd_list, l, n, tmp) {
-               if (strcmp(tmp, pkgname)) {
+               if (tmp != inst) {
                        continue;
                }
 
                s_info.pd_list = eina_list_remove(s_info.pd_list, tmp);
-               free(tmp);
-
                if (!s_info.pd_list) {
                        pending_timer_thaw();
                }
@@ -1100,7 +1106,9 @@ HAPI int lb_create(const char *pkgname, const char *id, const char *content_info
 HAPI int lb_destroy(const char *pkgname, const char *id)
 {
        Eina_List *l;
+       Eina_List *n;
        struct instance *inst;
+       struct instance *tmp;
        struct item *item;
 
        inst = so_find_instance(pkgname, id);
@@ -1109,6 +1117,24 @@ HAPI int lb_destroy(const char *pkgname, const char *id)
                return LB_STATUS_ERROR_INVALID;
        }
 
+       EINA_LIST_FOREACH_SAFE(s_info.pd_list, l, n, tmp) {
+               if (tmp != inst) {
+                       continue;
+               }
+
+               s_info.pd_list = eina_list_remove(s_info.pd_list, tmp);
+               if (!s_info.pd_list) {
+                       pending_timer_thaw();
+               }
+
+               /*!
+                * Move all items in pd_open_pending_list
+                * to pending_list.
+                */
+               migrate_to_pending_list(pkgname);
+               break;
+       }
+
        l = find_item(inst);
        if (!l) {
                ErrPrint("Instance is not found (%s - %s)\n", pkgname, id);