2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <string.h> /* strcmp */
20 #include <stdlib.h> /* free */
24 #include <Ecore_Evas.h>
32 #include "slave_life.h"
33 #include "slave_rpc.h"
34 #include "client_life.h"
36 #include "fault_manager.h"
38 #include "script_handler.h"
43 #include "ctx_client.h"
55 * pkg_info describes the loaded package.
71 /*!< Reserved for future use */
75 /*!< Reserved for future use */
79 /*!< Reserved for future use */
83 unsigned int size_list;
98 /*!< Reserved for future use */
102 /*!< Reserved for future use */
114 char *script; /* script type: edje, ... */
119 struct fault_info *fault_info;
121 struct slave_node *slave;
124 Eina_List *inst_list;
136 static int slave_activated_cb(struct slave_node *slave, void *data)
138 struct pkg_info *info = data;
139 struct inst_info *inst;
145 if (!slave_need_to_reactivate_instances(slave)) {
146 DbgPrint("Do not need to reactivate instances\n");
151 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
152 ret = instance_recover_state(inst);
156 instance_thaw_updator(inst);
160 DbgPrint("Recover state for %d instances of %s\n", cnt, package_name(info));
164 static int slave_fault_cb(struct slave_node *slave, void *data)
168 struct inst_info *inst;
169 struct pkg_info *info = (struct pkg_info *)data;
171 DbgPrint("Slave %s has critical fault. destroy all instances\n", slave_name(slave));
172 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
173 DbgPrint("Destroy instance %p\n", inst);
174 instance_destroyed(inst);
180 static int slave_deactivated_cb(struct slave_node *slave, void *data)
182 struct pkg_info *info = data;
183 struct inst_info *inst;
188 if (info->fault_info) {
189 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
190 instance_destroyed(inst);
193 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
194 cnt += instance_need_slave(inst);
196 * instance_deactivated will call the slave_unload_instance.
197 * if the loaded instance counter meets 0,
198 * the slave will be deactivated.
199 * so we should not call the instance activate function
202 * activate slave when the slave is reactivated
207 return cnt ? SLAVE_NEED_TO_REACTIVATE : 0;
210 static int xmonitor_paused_cb(void *data)
212 struct pkg_info *info = (struct pkg_info *)data;
213 struct inst_info *inst;
216 if (slave_state(info->slave) != SLAVE_TERMINATED) {
217 DbgPrint("Skip this\n");
221 EINA_LIST_FOREACH(info->inst_list, l, inst) {
222 instance_freeze_updator(inst);
228 static int xmonitor_resumed_cb(void *data)
230 struct pkg_info *info = data;
231 struct inst_info *inst;
234 if (slave_state(info->slave) != SLAVE_TERMINATED) {
235 DbgPrint("Skip this\n");
239 EINA_LIST_FOREACH(info->inst_list, l, inst) {
240 instance_thaw_updator(inst);
246 static int slave_paused_cb(struct slave_node *slave, void *data)
248 struct pkg_info *info = (struct pkg_info *)data;
249 struct inst_info *inst;
252 EINA_LIST_FOREACH(info->inst_list, l, inst) {
253 instance_freeze_updator(inst);
259 static int slave_resumed_cb(struct slave_node *slave, void *data)
261 struct pkg_info *info = (struct pkg_info *)data;
262 struct inst_info *inst;
265 EINA_LIST_FOREACH(info->inst_list, l, inst) {
266 instance_thaw_updator(inst);
272 static inline void destroy_package(struct pkg_info *info)
274 struct context_info *ctx_info;
276 EINA_LIST_FREE(info->ctx_list, ctx_info) {
277 ctx_disable_event_handler(ctx_info);
280 group_del_livebox(info->pkgname);
281 package_clear_fault(info);
283 s_info.pkg_list = eina_list_remove(s_info.pkg_list, info);
285 if (info->lb.type == LB_TYPE_SCRIPT) {
286 DbgFree(info->lb.info.script.path);
287 DbgFree(info->lb.info.script.group);
290 if (info->pd.type == PD_TYPE_SCRIPT) {
291 DbgFree(info->pd.info.script.path);
292 DbgFree(info->pd.info.script.group);
295 DbgFree(info->script);
297 DbgFree(info->pkgname);
298 DbgFree(info->libexec);
303 static inline int load_conf(struct pkg_info *info)
305 struct parser *parser;
309 parser = parser_load(info->pkgname);
311 info->lb.size_list = 0x01; /* Default */
313 info->script = strdup(DEFAULT_SCRIPT);
315 ErrPrint("Heap: %s\n", strerror(errno));
319 info->abi = strdup(DEFAULT_ABI);
321 ErrPrint("Heap: %s\n", strerror(errno));
322 DbgFree(info->script);
327 info->pd.width = g_conf.width;
328 info->pd.height = g_conf.height >> 2;
333 info->lb.type = LB_TYPE_FILE;
334 if (parser_text_lb(parser)) {
335 info->lb.type = LB_TYPE_TEXT;
336 } else if (parser_buffer_lb(parser)) {
337 info->lb.type = LB_TYPE_BUFFER;
339 str = parser_lb_path(parser);
341 info->lb.type = LB_TYPE_SCRIPT;
343 info->lb.info.script.path = strdup(str);
344 if (!info->lb.info.script.path) {
345 ErrPrint("Heap: %s\n", strerror(errno));
346 parser_unload(parser);
350 str = parser_lb_group(parser);
352 info->lb.info.script.group = strdup(str);
353 if (!info->lb.info.script.group) {
354 ErrPrint("Heap: %s\n", strerror(errno));
355 DbgFree(info->lb.info.script.path);
356 parser_unload(parser);
363 if (parser_text_pd(parser)) {
364 info->pd.type = PD_TYPE_TEXT;
365 } else if (parser_buffer_pd(parser)) {
366 info->pd.type = PD_TYPE_BUFFER;
368 str = parser_pd_path(parser);
370 info->pd.type = PD_TYPE_SCRIPT;
371 info->pd.info.script.path = strdup(str);
372 if (!info->pd.info.script.path) {
373 ErrPrint("Heap: %s\n", strerror(errno));
374 if (info->lb.type == LB_TYPE_SCRIPT) {
375 DbgFree(info->lb.info.script.path);
376 DbgFree(info->lb.info.script.group);
378 parser_unload(parser);
382 str = parser_pd_group(parser);
384 info->pd.info.script.group = strdup(str);
385 if (!info->pd.info.script.group) {
386 ErrPrint("Heap: %s\n", strerror(errno));
387 DbgFree(info->pd.info.script.path);
388 if (info->lb.type == LB_TYPE_SCRIPT) {
389 DbgFree(info->lb.info.script.path);
390 DbgFree(info->lb.info.script.group);
392 parser_unload(parser);
399 str = parser_script(parser);
400 str = str ? str : DEFAULT_SCRIPT;
401 info->script = strdup(str);
403 ErrPrint("Heap: %s\n", strerror(errno));
404 if (info->pd.type == PD_TYPE_SCRIPT) {
405 DbgFree(info->pd.info.script.path);
406 DbgFree(info->pd.info.script.group);
409 if (info->lb.type == LB_TYPE_SCRIPT) {
410 DbgFree(info->lb.info.script.path);
411 DbgFree(info->lb.info.script.group);
414 parser_unload(parser);
418 str = parser_abi(parser);
419 str = str ? str : DEFAULT_ABI;
420 info->abi = strdup(str);
422 ErrPrint("Heap: %s\n", strerror(errno));
423 DbgFree(info->script);
424 if (info->pd.type == PD_TYPE_SCRIPT) {
425 DbgFree(info->pd.info.script.path);
426 DbgFree(info->pd.info.script.group);
429 if (info->lb.type == LB_TYPE_SCRIPT) {
430 DbgFree(info->lb.info.script.path);
431 DbgFree(info->lb.info.script.group);
433 parser_unload(parser);
437 info->timeout = parser_timeout(parser);
438 info->network = parser_network(parser);
440 info->period = parser_period(parser);
441 if (info->period < 0.0f)
443 else if (info->period > 0.0f && info->period < MINIMUM_PERIOD)
444 info->period = MINIMUM_PERIOD;
446 info->lb.size_list = parser_size(parser);
447 info->lb.auto_launch = parser_auto_launch(parser);
448 info->secured = parser_secured(parser);
449 info->lb.pinup = parser_pinup(parser);
451 parser_get_pdsize(parser, &info->pd.width, &info->pd.height);
453 group = parser_group_str(parser);
454 if (group && group_add_livebox(group, info->pkgname) < 0)
455 ErrPrint("Failed to build cluster tree for %s{%s}\n", info->pkgname, group);
457 parser_unload(parser);
461 HAPI struct pkg_info *package_create(const char *pkgname)
463 struct pkg_info *pkginfo;
465 struct context_info *ctx_info;
467 pkginfo = calloc(1, sizeof(*pkginfo));
469 ErrPrint("Heap: %s\n", strerror(errno));
473 pkginfo->pkgname = io_livebox_pkgname(pkgname);
474 if (!pkginfo->pkgname) {
475 ErrPrint("Failed to get pkgname, fallback to fs checker\n");
476 if (util_validate_livebox_package(pkgname) < 0) {
477 ErrPrint("Invalid package name: %s\n", pkgname);
482 pkginfo->pkgname = strdup(pkgname);
483 if (!pkginfo->pkgname) {
484 ErrPrint("Heap: %s\n", strerror(errno));
490 if (io_load_package_db(pkginfo) < 0) {
491 ErrPrint("Failed to load DB, fall back to conf file loader\n");
492 if (load_conf(pkginfo) < 0) {
493 ErrPrint("Failed to initiate the conf file loader\n");
494 DbgFree(pkginfo->pkgname);
500 package_ref(pkginfo);
502 s_info.pkg_list = eina_list_append(s_info.pkg_list, pkginfo);
504 EINA_LIST_FOREACH(pkginfo->ctx_list, l, ctx_info) {
505 ctx_enable_event_handler(ctx_info);
511 HAPI int package_destroy(struct pkg_info *info)
517 HAPI Eina_List *package_ctx_info(struct pkg_info *pkginfo)
519 return pkginfo->ctx_list;
522 HAPI void package_add_ctx_info(struct pkg_info *pkginfo, struct context_info *info)
524 pkginfo->ctx_list = eina_list_append(pkginfo->ctx_list, info);
527 HAPI char *package_lb_pkgname(const char *pkgname)
531 lb_pkgname = io_livebox_pkgname(pkgname);
533 if (util_validate_livebox_package(pkgname) < 0)
536 lb_pkgname = strdup(pkgname);
538 ErrPrint("Heap: %s\n", strerror(errno));
546 HAPI int package_is_lb_pkgname(const char *pkgname)
551 lb_pkgname = package_lb_pkgname(pkgname);
558 HAPI struct pkg_info *package_find(const char *pkgname)
561 struct pkg_info *info;
566 EINA_LIST_FOREACH(s_info.pkg_list, l, info) {
567 if (!strcmp(info->pkgname, pkgname))
574 HAPI struct inst_info *package_find_instance_by_id(const char *pkgname, const char *id)
577 struct inst_info *inst;
578 struct pkg_info *info;
580 info = package_find(pkgname);
582 ErrPrint("Package %s is not exists\n", pkgname);
586 EINA_LIST_FOREACH(info->inst_list, l, inst) {
587 if (!strcmp(instance_id(inst), id))
594 HAPI struct inst_info *package_find_instance_by_timestamp(const char *pkgname, double timestamp)
597 struct inst_info *inst;
598 struct pkg_info *info;
600 info = package_find(pkgname);
602 ErrPrint("Package %s is not exists\n", pkgname);
606 EINA_LIST_FOREACH(info->inst_list, l, inst) {
607 if (instance_timestamp(inst) == timestamp)
614 HAPI int package_dump_fault_info(struct pkg_info *info)
616 if (!info->fault_info)
619 ErrPrint("=============\n");
620 ErrPrint("faulted at %lf\n", info->fault_info->timestamp);
621 ErrPrint("Package: %s\n", info->pkgname);
622 ErrPrint("Function: %s\n", info->fault_info->function);
623 ErrPrint("InstanceID: %s\n", info->fault_info->filename);
627 HAPI int package_get_fault_info(struct pkg_info *info, double *timestamp, const char **filename, const char **function)
629 if (!info->fault_info)
632 *timestamp = info->fault_info->timestamp;
633 *filename = info->fault_info->filename;
634 *function = info->fault_info->function;
638 HAPI int package_set_fault_info(struct pkg_info *info, double timestamp, const char *filename, const char *function)
640 struct fault_info *fault;
642 package_clear_fault(info);
644 fault = calloc(1, sizeof(*fault));
646 ErrPrint("Heap: %s\n", strerror(errno));
650 fault->timestamp = timestamp;
652 filename = "unknown";
654 function = "unknown";
656 fault->filename = strdup(filename);
657 if (!fault->filename) {
658 ErrPrint("Heap: %s\n", strerror(errno));
663 fault->function = strdup(function);
664 if (!fault->function) {
665 ErrPrint("Heap: %s\n", strerror(errno));
666 DbgFree(fault->filename);
671 info->fault_info = fault;
676 HAPI int package_clear_fault(struct pkg_info *info)
678 if (!info->fault_info)
681 package_dump_fault_info(info);
683 DbgFree(info->fault_info->function);
684 DbgFree(info->fault_info->filename);
685 DbgFree(info->fault_info);
686 info->fault_info = NULL;
690 HAPI const int const package_is_fault(const struct pkg_info *info)
692 return !!info->fault_info;
695 HAPI struct slave_node * const package_slave(const struct pkg_info *info)
700 HAPI const int const package_timeout(const struct pkg_info *info)
702 return info->timeout;
705 HAPI void package_set_timeout(struct pkg_info *info, int timeout)
707 info->timeout = timeout;
710 HAPI const double const package_period(const struct pkg_info *info)
715 HAPI void package_set_period(struct pkg_info *info, double period)
717 info->period = period;
720 HAPI const int const package_secured(const struct pkg_info *info)
722 return info->secured;
725 HAPI void package_set_secured(struct pkg_info *info, int secured)
727 info->secured = secured;
730 HAPI const char * const package_script(const struct pkg_info *info)
735 HAPI int package_set_script(struct pkg_info *info, const char *script)
739 tmp = strdup(script);
741 ErrPrint("Heap: %s\n", strerror(errno));
745 DbgFree(info->script);
750 HAPI const char * const package_abi(const struct pkg_info *info)
755 HAPI int package_set_abi(struct pkg_info *info, const char *abi)
760 ErrPrint("Heap: %s\n", strerror(errno));
769 HAPI const char * const package_lb_path(const struct pkg_info *info)
771 if (info->lb.type != LB_TYPE_SCRIPT)
774 return info->lb.info.script.path;
777 HAPI int package_set_lb_path(struct pkg_info *info, const char *path)
781 if (info->lb.type != LB_TYPE_SCRIPT)
786 ErrPrint("Heap: %s\n", strerror(errno));
790 DbgFree(info->lb.info.script.path);
791 info->lb.info.script.path = tmp;
795 HAPI const char * const package_lb_group(const struct pkg_info *info)
797 if (info->lb.type != LB_TYPE_SCRIPT)
800 return info->lb.info.script.group;
803 HAPI int package_set_lb_group(struct pkg_info *info, const char *group)
807 if (info->lb.type != LB_TYPE_SCRIPT)
812 ErrPrint("Heap: %s\n", strerror(errno));
816 DbgFree(info->lb.info.script.group);
817 info->lb.info.script.group = tmp;
821 HAPI const char * const package_pd_path(const struct pkg_info *info)
823 if (info->pd.type != PD_TYPE_SCRIPT)
826 return info->pd.info.script.path;
829 HAPI int package_set_pd_path(struct pkg_info *info, const char *path)
833 if (info->pd.type != PD_TYPE_SCRIPT)
838 ErrPrint("Heap: %s\n", strerror(errno));
842 DbgFree(info->pd.info.script.path);
843 info->pd.info.script.path = tmp;
847 HAPI const char * const package_pd_group(const struct pkg_info *info)
849 if (info->pd.type != PD_TYPE_SCRIPT)
852 return info->pd.info.script.group;
855 HAPI int package_set_pd_group(struct pkg_info *info, const char *group)
859 if (info->pd.type != PD_TYPE_SCRIPT)
864 ErrPrint("Heap: %s\n", strerror(errno));
868 DbgFree(info->pd.info.script.group);
869 info->pd.info.script.group = tmp;
873 HAPI const int const package_pinup(const struct pkg_info *info)
875 return info->lb.pinup;
878 HAPI void package_set_pinup(struct pkg_info *info, int pinup)
880 info->lb.pinup = pinup;
883 HAPI const int const package_auto_launch(const struct pkg_info *info)
885 return info->lb.auto_launch;
888 HAPI void package_set_auto_launch(struct pkg_info *info, int auto_launch)
890 info->lb.auto_launch = auto_launch;
893 HAPI const unsigned int const package_size_list(const struct pkg_info *info)
895 return info->lb.size_list;
898 HAPI void package_set_size_list(struct pkg_info *info, unsigned int size_list)
900 info->lb.size_list = size_list;
903 HAPI const int const package_pd_width(const struct pkg_info *info)
905 return info->pd.width;
908 HAPI void package_set_pd_width(struct pkg_info *info, int width)
910 info->pd.width = width;
913 HAPI const int const package_pd_height(const struct pkg_info *info)
915 return info->pd.height;
918 HAPI void package_set_pd_height(struct pkg_info *info, int height)
920 info->pd.height = height;
923 HAPI struct pkg_info * const package_ref(struct pkg_info *info)
929 HAPI struct pkg_info * const package_unref(struct pkg_info *info)
931 if (info->refcnt == 0) {
932 ErrPrint("Invalid request\n");
937 if (info->refcnt == 0) {
938 destroy_package(info);
945 HAPI const int const package_refcnt(const struct pkg_info *info)
950 HAPI const enum lb_type package_lb_type(const struct pkg_info *info)
952 return info->lb.type;
955 HAPI void package_set_lb_type(struct pkg_info *info, enum lb_type type)
957 info->lb.type = type;
960 HAPI const char * const package_libexec(struct pkg_info *info)
962 return info->libexec;
965 HAPI int package_set_libexec(struct pkg_info *info, const char *libexec)
969 tmp = strdup(libexec);
971 ErrPrint("Heap: %s\n", strerror(errno));
975 DbgFree(info->libexec);
980 HAPI int package_network(struct pkg_info *info)
982 return info->network;
985 HAPI void package_set_network(struct pkg_info *info, int network)
987 info->network = network;
990 HAPI const enum pd_type const package_pd_type(const struct pkg_info *info)
992 return info->pd.type;
995 HAPI void package_set_pd_type(struct pkg_info *info, enum pd_type type)
997 info->pd.type = type;
1002 * Add the instance to the package info.
1003 * If a package has no slave, assign a new slave.
1005 static inline int assign_new_slave(struct pkg_info *info)
1011 s_name = util_slavename();
1013 ErrPrint("Failed to get a new slave name\n");
1017 tmp = abi_find_slave(info->abi);
1020 ErrPrint("Failed to find a proper pkgname of a slave\n");
1024 DbgPrint("Slave package: \"%s\" (abi: %s)\n", tmp, info->abi);
1025 s_pkgname = util_replace_string(tmp, REPLACE_TAG_APPID, info->pkgname);
1027 s_pkgname = strdup(tmp);
1029 ErrPrint("Heap: %s\n", strerror(errno));
1033 } else if (!info->secured) {
1034 DbgPrint("Slave package name is specified but the livebox is not secured\n");
1035 DbgPrint("Forcely set secured flag for livebox %s\n", info->pkgname);
1039 DbgPrint("New slave name is %s, it is assigned for livebox %s (using %s)\n", s_name, info->pkgname, s_pkgname);
1040 info->slave = slave_create(s_name, info->secured, info->abi, s_pkgname);
1048 * package_destroy will try to remove "info" from the pkg_list.
1049 * but we didn't add this to it yet.
1050 * If the list method couldn't find an "info" from the list,
1051 * it just do nothing so I'll leave this.
1057 * Slave is not activated yet.
1062 HAPI int package_add_instance(struct pkg_info *info, struct inst_info *inst)
1064 if (!info->inst_list) {
1065 info->slave = slave_find_available(info->abi, info->secured);
1070 ret = assign_new_slave(info);
1074 DbgPrint("Slave %s is assigned for %s\n", slave_name(info->slave), info->pkgname);
1077 slave_ref(info->slave);
1078 slave_load_package(info->slave);
1079 slave_event_callback_add(info->slave, SLAVE_EVENT_DEACTIVATE, slave_deactivated_cb, info);
1080 slave_event_callback_add(info->slave, SLAVE_EVENT_ACTIVATE, slave_activated_cb, info);
1081 slave_event_callback_add(info->slave, SLAVE_EVENT_FAULT, slave_fault_cb, info);
1083 if (info->secured) {
1084 slave_event_callback_add(info->slave, SLAVE_EVENT_PAUSE, slave_paused_cb, info);
1085 slave_event_callback_add(info->slave, SLAVE_EVENT_RESUME, slave_resumed_cb, info);
1089 * In case of the slave is terminated because of expired TTL timer,
1090 * Master should freeze the all update time.
1091 * But the callback should check the slave's state to prevent from duplicated freezing.
1093 * This callback will freeze the timer only if a slave doesn't running.
1095 xmonitor_add_event_callback(XMONITOR_PAUSED, xmonitor_paused_cb, info);
1096 xmonitor_add_event_callback(XMONITOR_RESUMED, xmonitor_resumed_cb, info);
1100 info->inst_list = eina_list_append(info->inst_list, inst);
1104 HAPI int package_del_instance(struct pkg_info *info, struct inst_info *inst)
1106 info->inst_list = eina_list_remove(info->inst_list, inst);
1108 if (info->inst_list)
1112 slave_unload_package(info->slave);
1114 slave_event_callback_del(info->slave, SLAVE_EVENT_FAULT, slave_fault_cb, info);
1115 slave_event_callback_del(info->slave, SLAVE_EVENT_DEACTIVATE, slave_deactivated_cb, info);
1116 slave_event_callback_del(info->slave, SLAVE_EVENT_ACTIVATE, slave_activated_cb, info);
1118 if (info->secured) {
1119 slave_event_callback_del(info->slave, SLAVE_EVENT_PAUSE, slave_paused_cb, info);
1120 slave_event_callback_del(info->slave, SLAVE_EVENT_RESUME, slave_resumed_cb, info);
1122 xmonitor_del_event_callback(XMONITOR_PAUSED, xmonitor_paused_cb, info);
1123 xmonitor_del_event_callback(XMONITOR_RESUMED, xmonitor_resumed_cb, info);
1126 slave_unref(info->slave);
1130 if (info->is_uninstalled)
1131 package_destroy(info);
1136 HAPI Eina_List *package_instance_list(struct pkg_info *info)
1138 return info->inst_list;
1141 static int client_created_cb(struct client_node *client, void *data)
1143 struct pkg_info *info;
1146 struct inst_info *inst;
1149 EINA_LIST_FOREACH(s_info.pkg_list, l, info) {
1150 if (info->fault_info) {
1151 fault_unicast_info(client, info->pkgname, info->fault_info->filename, info->fault_info->function);
1155 EINA_LIST_FOREACH(info->inst_list, i_l, inst) {
1156 switch (instance_state(inst)) {
1158 /* Will be send a created event after the instance gets created event */
1160 case INST_ACTIVATED: /*!< This instance is actiavted, and used */
1161 case INST_REQUEST_TO_REACTIVATE: /*!< This instance will be reactivated soon */
1162 case INST_REQUEST_TO_DESTROY: /*!< This instance will be destroy soon */
1163 if (instance_client(inst) == client) {
1164 instance_unicast_created_event(inst, client);
1165 } else if (instance_client(inst) == NULL) {
1168 * Instances are lives in the system cluster/sub-cluster
1170 if (client_is_subscribed(client, instance_cluster(inst), instance_category(inst))) {
1171 instance_unicast_created_event(inst, client);
1172 DbgPrint("(Subscribed) Created package: %s\n", info->pkgname);
1178 DbgPrint("%s(%s) is not activated (%d)\n",
1179 package_name(info), instance_id(inst), instance_state(inst));
1188 static int io_uninstall_cb(const char *pkgname, int prime, void *data)
1190 struct pkg_info *info;
1193 struct inst_info *inst;
1195 DbgPrint("Livebox package %s is uninstalled\n", pkgname);
1196 info = package_find(pkgname);
1198 DbgPrint("%s is not yet loaded\n", pkgname);
1202 info->is_uninstalled = 1;
1206 * Don't delete an item from the inst_list.
1207 * destroy callback will use this list again.
1208 * So, Don't touch it from here.
1210 if (info->inst_list) {
1211 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
1212 instance_destroy(inst);
1215 package_destroy(info);
1221 static inline void reload_package_info(struct pkg_info *info)
1223 struct context_info *ctx_info;
1226 struct inst_info *inst;
1228 DbgPrint("Already exists, try to update it\n");
1229 EINA_LIST_FREE(info->ctx_list, ctx_info) {
1230 ctx_disable_event_handler(ctx_info);
1235 * Without "is_uninstalled", the package will be kept
1237 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
1238 instance_destroy(inst);
1241 group_del_livebox(info->pkgname);
1242 package_clear_fault(info);
1248 io_load_package_db(info);
1250 EINA_LIST_FOREACH(info->ctx_list, l, ctx_info) {
1251 ctx_enable_event_handler(ctx_info);
1255 static int io_install_cb(const char *pkgname, int prime, void *data)
1257 struct pkg_info *info;
1259 DbgPrint("Livebox package %s is installed\n", pkgname);
1260 info = package_find(pkgname);
1262 reload_package_info(info);
1264 info = package_create(pkgname);
1265 DbgPrint("Package %s is%sbuilt\n", pkgname, info ? " " : " not ");
1271 static int install_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
1275 if (status != PKGMGR_STATUS_END)
1278 ret = io_update_livebox_package(pkgname, io_install_cb, NULL);
1279 DbgPrint("Processed %d packages\n", ret);
1283 static int uninstall_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
1287 if (status == PKGMGR_STATUS_START) {
1288 ret = io_update_livebox_package(pkgname, io_uninstall_cb, NULL);
1289 DbgPrint("Processed %d packages\n", ret);
1291 /*! for keeping the old style */
1292 (void)io_uninstall_cb(pkgname, -1, NULL);
1299 static int io_update_cb(const char *pkgname, int prime, void *data)
1301 struct pkg_info *info;
1303 DbgPrint("Livebox package %s is updated\n", pkgname);
1304 info = package_find(pkgname);
1308 reload_package_info(info);
1312 static int update_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
1315 if (status != PKGMGR_STATUS_END)
1318 ret = io_update_livebox_package(pkgname, io_update_cb, NULL);
1319 DbgPrint("Processed %d packages\n", ret);
1323 static int crawling_liveboxes(const char *pkgname, int prime, void *data)
1325 if (package_find(pkgname)) {
1326 ErrPrint("Information of %s is already built\n", pkgname);
1328 struct pkg_info *info;
1329 info = package_create(pkgname);
1331 DbgPrint("[%s] information is built prime(%d)\n", pkgname, prime);
1337 HAPI int package_init(void)
1339 client_global_event_handler_add(CLIENT_GLOBAL_EVENT_CREATE, client_created_cb, NULL);
1342 pkgmgr_add_event_callback(PKGMGR_EVENT_INSTALL, install_cb, NULL);
1343 pkgmgr_add_event_callback(PKGMGR_EVENT_UNINSTALL, uninstall_cb, NULL);
1344 pkgmgr_add_event_callback(PKGMGR_EVENT_UPDATE, update_cb, NULL);
1346 io_crawling_liveboxes(crawling_liveboxes, NULL);
1350 HAPI int package_fini(void)
1352 pkgmgr_del_event_callback(PKGMGR_EVENT_INSTALL, install_cb, NULL);
1353 pkgmgr_del_event_callback(PKGMGR_EVENT_UNINSTALL, uninstall_cb, NULL);
1354 pkgmgr_del_event_callback(PKGMGR_EVENT_UPDATE, update_cb, NULL);
1356 client_global_event_handler_del(CLIENT_GLOBAL_EVENT_CREATE, client_created_cb, NULL);
1360 HAPI const char *package_find_by_secured_slave(struct slave_node *slave)
1363 struct pkg_info *info;
1365 if (!slave_is_secured(slave))
1368 EINA_LIST_FOREACH(s_info.pkg_list, l, info) {
1369 if (info->slave == slave)
1370 return info->pkgname;
1376 HAPI const char * const package_name(const struct pkg_info *info)
1378 return info->pkgname;
1382 * del_or_creat : 1 == create, 0 == delete
1384 HAPI int package_alter_instances_to_client(struct client_node *client, enum alter_type alter)
1386 struct pkg_info *info;
1389 struct inst_info *inst;
1392 EINA_LIST_FOREACH(s_info.pkg_list, l, info) {
1393 EINA_LIST_FOREACH(info->inst_list, i_l, inst) {
1394 if (instance_client(inst))
1397 if (!client_is_subscribed(client, instance_cluster(inst), instance_category(inst)))
1400 switch (instance_state(inst)) {
1402 case INST_REQUEST_TO_ACTIVATE:
1403 /* Will be send a created event after the instance gets created event */
1406 if (!instance_has_client(inst, client)) {
1407 instance_add_client(inst, client);
1411 if (instance_has_client(inst, client)) {
1412 instance_del_client(inst, client);
1419 case INST_ACTIVATED: /*!< This instance is actiavted, and used */
1420 case INST_REQUEST_TO_REACTIVATE: /*!< This instance will be reactivated soon */
1421 case INST_REQUEST_TO_DESTROY: /*!< This instance will be destroy soon */
1424 * Instances are lives in the system cluster/sub-cluster
1428 if (!instance_has_client(inst, client)) {
1429 instance_unicast_created_event(inst, client);
1430 instance_add_client(inst, client);
1431 DbgPrint("(Subscribed) Created package: %s\n", info->pkgname);
1435 if (instance_has_client(inst, client)) {
1436 instance_unicast_deleted_event(inst, client);
1437 instance_del_client(inst, client);
1446 DbgPrint("%s(%s) is not activated (%d)\n",
1447 package_name(info), instance_id(inst), instance_state(inst));
1456 HAPI const Eina_List *package_list(void)
1458 return s_info.pkg_list;
1461 HAPI int const package_fault_count(struct pkg_info *info)
1463 return info ? info->fault_count : 0;