summaryrefslogtreecommitdiff
path: root/src/instance.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/instance.c')
-rw-r--r--src/instance.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/instance.c b/src/instance.c
index 32d18cc..1005fdc 100644
--- a/src/instance.c
+++ b/src/instance.c
@@ -83,6 +83,11 @@ struct event_item {
void *data;
};
+struct tag_item {
+ char *tag;
+ void *data;
+};
+
struct inst_info {
struct pkg_info *info;
@@ -144,6 +149,8 @@ struct inst_info {
Ecore_Timer *update_timer; /*!< Only used for secured livebox */
Eina_List *delete_event_list;
+
+ Eina_List *data_list;
};
#define CLIENT_SEND_EVENT(instance, packet) ((instance)->client ? client_rpc_async_request((instance)->client, (packet)) : client_broadcast((instance), (packet)))
@@ -595,6 +602,7 @@ static inline void destroy_instance(struct inst_info *inst)
enum pd_type pd_type;
struct slave_node *slave;
struct event_item *item;
+ struct tag_item *tag_item;
invoke_delete_callbacks(inst);
@@ -633,6 +641,12 @@ static inline void destroy_instance(struct inst_info *inst)
if (inst->update_timer)
ecore_timer_del(inst->update_timer);
+ EINA_LIST_FREE(inst->data_list, tag_item) {
+ DbgPrint("Tagged item[%s] %p\n", tag_item->tag, tag_item->data);
+ free(tag_item->tag);
+ free(tag_item);
+ }
+
/*!
* \note
*
@@ -1301,6 +1315,9 @@ static int pd_buffer_close_cb(struct client_node *client, void *inst)
ret = instance_slave_close_pd(inst, client);
DbgPrint("Forcely close the PD ret: %d\n", ret);
+
+ instance_unref(inst);
+
return -1; /* Delete this callback */
}
@@ -1315,6 +1332,8 @@ static int pd_script_close_cb(struct client_node *client, void *inst)
ret = instance_slave_close_pd(inst, client);
DbgPrint("Forcely close the PD ret: %d\n", ret);
+ instance_unref(inst);
+
return -1; /* Delete this callback */
}
@@ -3038,4 +3057,78 @@ HAPI void instance_fini(void)
{
}
+static inline struct tag_item *find_tag_item(struct inst_info *inst, const char *tag)
+{
+ struct tag_item *item;
+ Eina_List *l;
+
+ EINA_LIST_FOREACH(inst->data_list, l, item) {
+ if (!strcmp(item->tag, tag))
+ return item;
+ }
+
+ return NULL;
+}
+
+HAPI int instance_set_data(struct inst_info *inst, const char *tag, void *data)
+{
+ struct tag_item *item;
+
+ item = find_tag_item(inst, tag);
+ if (!item) {
+ item = malloc(sizeof(*item));
+ if (!item) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return LB_STATUS_ERROR_MEMORY;
+ }
+
+ item->tag = strdup(tag);
+ if (!item->tag) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(item);
+ return LB_STATUS_ERROR_MEMORY;
+ }
+
+ inst->data_list = eina_list_append(inst->data_list, item);
+ }
+
+ if (!data) {
+ inst->data_list = eina_list_remove(inst->data_list, item);
+ free(item->tag);
+ free(item);
+ } else {
+ item->data = data;
+ }
+
+ return LB_STATUS_SUCCESS;
+}
+
+HAPI void *instance_del_data(struct inst_info *inst, const char *tag)
+{
+ struct tag_item *item;
+ void *data;
+
+ item = find_tag_item(inst, tag);
+ if (!item)
+ return NULL;
+
+ inst->data_list = eina_list_remove(inst->data_list, item);
+ data = item->data;
+ free(item->tag);
+ free(item);
+
+ return data;
+}
+
+HAPI void *instance_get_data(struct inst_info *inst, const char *tag)
+{
+ struct tag_item *item;
+
+ item = find_tag_item(inst, tag);
+ if (!item)
+ return NULL;
+
+ return item->data;
+}
+
/* End of a file */