From 2cccd8b2fb5c386152e1f4d4c206046e13768929 Mon Sep 17 00:00:00 2001 From: Sung-jae Park Date: Mon, 11 Nov 2013 17:10:25 +0900 Subject: [PATCH] Close the PD when the instance is deleted. Change-Id: I0b148449378a2171ee1478571194c3bfb9af9c83 --- include/lb.h | 4 +- packaging/com.samsung.data-provider-slave.spec | 2 +- src/client.c | 8 ++-- src/lb.c | 62 ++++++++++++++++++-------- 4 files changed, 51 insertions(+), 25 deletions(-) diff --git a/include/lb.h b/include/lb.h index 34bab45..1579457 100644 --- a/include/lb.h +++ b/include/lb.h @@ -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); diff --git a/packaging/com.samsung.data-provider-slave.spec b/packaging/com.samsung.data-provider-slave.spec index 26ec6b9..52dcb34 100644 --- a/packaging/com.samsung.data-provider-slave.spec +++ b/packaging/com.samsung.data-provider-slave.spec @@ -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 diff --git a/src/client.c b/src/client.c index 0348f64..9e31c30 100644 --- a/src/client.c +++ b/src/client.c @@ -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; } diff --git a/src/lb.c b/src/lb.c index ac457a8..1d52bff 100644 --- 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); -- 2.7.4