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"
54 * pkg_info describes the loaded package.
70 /*!< Reserved for future use */
74 /*!< Reserved for future use */
78 /*!< Reserved for future use */
82 unsigned int size_list;
100 /*!< Reserved for future use */
104 /*!< Reserved for future use */
114 char *script; /* script type: edje, ... */
118 struct fault_info *fault_info;
120 struct slave_node *slave;
123 Eina_List *inst_list;
135 static int slave_activated_cb(struct slave_node *slave, void *data)
137 struct pkg_info *info = data;
138 struct inst_info *inst;
144 if (!slave_need_to_reactivate_instances(slave)) {
145 DbgPrint("Do not need to reactivate instances\n");
150 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
151 ret = instance_recover_state(inst);
155 instance_thaw_updator(inst);
159 DbgPrint("Recover state for %d instances of %s\n", cnt, package_name(info));
163 static int slave_fault_cb(struct slave_node *slave, void *data)
167 struct inst_info *inst;
168 struct pkg_info *info = (struct pkg_info *)data;
170 DbgPrint("Slave %s has critical fault. destroy all instances\n", slave_name(slave));
171 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
172 DbgPrint("Destroy instance %p\n", inst);
173 instance_destroyed(inst);
179 static int slave_deactivated_cb(struct slave_node *slave, void *data)
181 struct pkg_info *info = data;
182 struct inst_info *inst;
187 if (info->fault_info) {
188 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
189 instance_destroyed(inst);
192 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
193 cnt += instance_need_slave(inst);
195 * instance_deactivated will call the slave_unload_instance.
196 * if the loaded instance counter meets 0,
197 * the slave will be deactivated.
198 * so we should not call the instance activate function
201 * activate slave when the slave is reactivated
206 return cnt ? SLAVE_NEED_TO_REACTIVATE : 0;
209 static int xmonitor_paused_cb(void *data)
211 struct pkg_info *info = (struct pkg_info *)data;
212 struct inst_info *inst;
215 if (slave_state(info->slave) != SLAVE_TERMINATED) {
216 DbgPrint("Skip this\n");
220 EINA_LIST_FOREACH(info->inst_list, l, inst) {
221 instance_freeze_updator(inst);
227 static int xmonitor_resumed_cb(void *data)
229 struct pkg_info *info = data;
230 struct inst_info *inst;
233 if (slave_state(info->slave) != SLAVE_TERMINATED) {
234 DbgPrint("Skip this\n");
238 EINA_LIST_FOREACH(info->inst_list, l, inst) {
239 instance_thaw_updator(inst);
245 static int slave_paused_cb(struct slave_node *slave, void *data)
247 struct pkg_info *info = (struct pkg_info *)data;
248 struct inst_info *inst;
251 EINA_LIST_FOREACH(info->inst_list, l, inst) {
252 instance_freeze_updator(inst);
258 static int slave_resumed_cb(struct slave_node *slave, void *data)
260 struct pkg_info *info = (struct pkg_info *)data;
261 struct inst_info *inst;
264 EINA_LIST_FOREACH(info->inst_list, l, inst) {
265 instance_thaw_updator(inst);
271 static inline void destroy_package(struct pkg_info *info)
273 group_del_livebox(info->pkgname);
274 package_clear_fault(info);
276 s_info.pkg_list = eina_list_remove(s_info.pkg_list, info);
278 if (info->lb.type == LB_TYPE_SCRIPT) {
279 DbgFree(info->lb.info.script.path);
280 DbgFree(info->lb.info.script.group);
283 if (info->pd.type == PD_TYPE_SCRIPT) {
284 DbgFree(info->pd.info.script.path);
285 DbgFree(info->pd.info.script.group);
288 DbgFree(info->script);
290 DbgFree(info->pkgname);
291 DbgFree(info->lb.libexec);
292 DbgFree(info->lb.auto_launch);
297 static inline int load_conf(struct pkg_info *info)
299 struct parser *parser;
303 parser = parser_load(info->pkgname);
305 info->lb.size_list = 0x01; /* Default */
307 info->script = strdup(DEFAULT_SCRIPT);
309 ErrPrint("Heap: %s\n", strerror(errno));
313 info->abi = strdup(DEFAULT_ABI);
315 ErrPrint("Heap: %s\n", strerror(errno));
316 DbgFree(info->script);
321 info->pd.width = g_conf.width;
322 info->pd.height = g_conf.height >> 2;
327 info->lb.type = LB_TYPE_FILE;
328 if (parser_text_lb(parser)) {
329 info->lb.type = LB_TYPE_TEXT;
330 } else if (parser_buffer_lb(parser)) {
331 info->lb.type = LB_TYPE_BUFFER;
333 str = parser_lb_path(parser);
335 info->lb.type = LB_TYPE_SCRIPT;
337 info->lb.info.script.path = strdup(str);
338 if (!info->lb.info.script.path) {
339 ErrPrint("Heap: %s\n", strerror(errno));
340 parser_unload(parser);
344 str = parser_lb_group(parser);
346 info->lb.info.script.group = strdup(str);
347 if (!info->lb.info.script.group) {
348 ErrPrint("Heap: %s\n", strerror(errno));
349 DbgFree(info->lb.info.script.path);
350 parser_unload(parser);
357 if (parser_text_pd(parser)) {
358 info->pd.type = PD_TYPE_TEXT;
359 } else if (parser_buffer_pd(parser)) {
360 info->pd.type = PD_TYPE_BUFFER;
362 str = parser_pd_path(parser);
364 info->pd.type = PD_TYPE_SCRIPT;
365 info->pd.info.script.path = strdup(str);
366 if (!info->pd.info.script.path) {
367 ErrPrint("Heap: %s\n", strerror(errno));
368 if (info->lb.type == LB_TYPE_SCRIPT) {
369 DbgFree(info->lb.info.script.path);
370 DbgFree(info->lb.info.script.group);
372 parser_unload(parser);
376 str = parser_pd_group(parser);
378 info->pd.info.script.group = strdup(str);
379 if (!info->pd.info.script.group) {
380 ErrPrint("Heap: %s\n", strerror(errno));
381 DbgFree(info->pd.info.script.path);
382 if (info->lb.type == LB_TYPE_SCRIPT) {
383 DbgFree(info->lb.info.script.path);
384 DbgFree(info->lb.info.script.group);
386 parser_unload(parser);
393 str = parser_script(parser);
394 str = str ? str : DEFAULT_SCRIPT;
395 info->script = strdup(str);
397 ErrPrint("Heap: %s\n", strerror(errno));
398 if (info->pd.type == PD_TYPE_SCRIPT) {
399 DbgFree(info->pd.info.script.path);
400 DbgFree(info->pd.info.script.group);
403 if (info->lb.type == LB_TYPE_SCRIPT) {
404 DbgFree(info->lb.info.script.path);
405 DbgFree(info->lb.info.script.group);
408 parser_unload(parser);
412 str = parser_abi(parser);
413 str = str ? str : DEFAULT_ABI;
414 info->abi = strdup(str);
416 ErrPrint("Heap: %s\n", strerror(errno));
417 DbgFree(info->script);
418 if (info->pd.type == PD_TYPE_SCRIPT) {
419 DbgFree(info->pd.info.script.path);
420 DbgFree(info->pd.info.script.group);
423 if (info->lb.type == LB_TYPE_SCRIPT) {
424 DbgFree(info->lb.info.script.path);
425 DbgFree(info->lb.info.script.group);
427 parser_unload(parser);
431 info->lb.timeout = parser_timeout(parser);
432 info->network = parser_network(parser);
434 info->lb.period = parser_period(parser);
435 if (info->lb.period < 0.0f)
436 info->lb.period = 0.0f;
437 else if (info->lb.period > 0.0f && info->lb.period < MINIMUM_PERIOD)
438 info->lb.period = MINIMUM_PERIOD;
440 info->lb.size_list = parser_size(parser);
442 str = parser_auto_launch(parser);
443 str = str ? str : "";
444 info->lb.auto_launch = strdup(str);
445 if (!info->lb.auto_launch) {
446 ErrPrint("Heap: %s\n", strerror(errno));
448 DbgFree(info->script);
449 if (info->pd.type == PD_TYPE_SCRIPT) {
450 DbgFree(info->pd.info.script.path);
451 DbgFree(info->pd.info.script.group);
454 if (info->lb.type == LB_TYPE_SCRIPT) {
455 DbgFree(info->lb.info.script.path);
456 DbgFree(info->lb.info.script.group);
458 parser_unload(parser);
462 info->secured = parser_secured(parser);
463 info->lb.pinup = parser_pinup(parser);
465 parser_get_pdsize(parser, &info->pd.width, &info->pd.height);
467 group = parser_group_str(parser);
468 if (group && group_add_livebox(group, info->pkgname) < 0)
469 ErrPrint("Failed to build cluster tree for %s{%s}\n", info->pkgname, group);
471 parser_unload(parser);
475 HAPI struct pkg_info *package_create(const char *pkgname)
477 struct pkg_info *pkginfo;
479 pkginfo = calloc(1, sizeof(*pkginfo));
481 ErrPrint("Heap: %s\n", strerror(errno));
485 pkginfo->pkgname = io_livebox_pkgname(pkgname);
486 if (!pkginfo->pkgname) {
487 ErrPrint("Failed to get pkgname, fallback to fs checker\n");
488 if (util_validate_livebox_package(pkgname) < 0) {
489 ErrPrint("Invalid package name: %s\n", pkgname);
494 pkginfo->pkgname = strdup(pkgname);
495 if (!pkginfo->pkgname) {
496 ErrPrint("Heap: %s\n", strerror(errno));
502 if (io_load_package_db(pkginfo) < 0) {
503 ErrPrint("Failed to load DB, fall back to conf file loader\n");
504 if (load_conf(pkginfo) < 0) {
505 ErrPrint("Failed to initiate the conf file loader\n");
506 DbgFree(pkginfo->pkgname);
512 package_ref(pkginfo);
514 s_info.pkg_list = eina_list_append(s_info.pkg_list, pkginfo);
519 HAPI int package_destroy(struct pkg_info *info)
525 HAPI Eina_List *package_ctx_info(struct pkg_info *pkginfo)
527 return pkginfo->ctx_list;
530 HAPI void package_add_ctx_info(struct pkg_info *pkginfo, struct context_info *info)
532 pkginfo->ctx_list = eina_list_append(pkginfo->ctx_list, info);
535 HAPI char *package_lb_pkgname(const char *pkgname)
539 lb_pkgname = io_livebox_pkgname(pkgname);
541 if (util_validate_livebox_package(pkgname) < 0)
544 lb_pkgname = strdup(pkgname);
546 ErrPrint("Heap: %s\n", strerror(errno));
554 HAPI int package_is_lb_pkgname(const char *pkgname)
559 lb_pkgname = package_lb_pkgname(pkgname);
566 HAPI struct pkg_info *package_find(const char *pkgname)
569 struct pkg_info *info;
574 EINA_LIST_FOREACH(s_info.pkg_list, l, info) {
575 if (!strcmp(info->pkgname, pkgname))
582 HAPI struct inst_info *package_find_instance_by_id(const char *pkgname, const char *id)
585 struct inst_info *inst;
586 struct pkg_info *info;
588 info = package_find(pkgname);
590 ErrPrint("Package %s is not exists\n", pkgname);
594 EINA_LIST_FOREACH(info->inst_list, l, inst) {
595 if (!strcmp(instance_id(inst), id))
602 HAPI struct inst_info *package_find_instance_by_timestamp(const char *pkgname, double timestamp)
605 struct inst_info *inst;
606 struct pkg_info *info;
608 info = package_find(pkgname);
610 ErrPrint("Package %s is not exists\n", pkgname);
614 EINA_LIST_FOREACH(info->inst_list, l, inst) {
615 if (instance_timestamp(inst) == timestamp)
622 HAPI int package_dump_fault_info(struct pkg_info *info)
624 if (!info->fault_info)
627 ErrPrint("=============\n");
628 ErrPrint("faulted at %lf\n", info->fault_info->timestamp);
629 ErrPrint("Package: %s\n", info->pkgname);
630 ErrPrint("Function: %s\n", info->fault_info->function);
631 ErrPrint("InstanceID: %s\n", info->fault_info->filename);
635 HAPI int package_get_fault_info(struct pkg_info *info, double *timestamp, const char **filename, const char **function)
637 if (!info->fault_info)
640 *timestamp = info->fault_info->timestamp;
641 *filename = info->fault_info->filename;
642 *function = info->fault_info->function;
646 HAPI int package_set_fault_info(struct pkg_info *info, double timestamp, const char *filename, const char *function)
648 struct fault_info *fault;
650 package_clear_fault(info);
652 fault = calloc(1, sizeof(*fault));
654 ErrPrint("Heap: %s\n", strerror(errno));
658 fault->timestamp = timestamp;
660 filename = "unknown";
662 function = "unknown";
664 fault->filename = strdup(filename);
665 if (!fault->filename) {
666 ErrPrint("Heap: %s\n", strerror(errno));
671 fault->function = strdup(function);
672 if (!fault->function) {
673 ErrPrint("Heap: %s\n", strerror(errno));
674 DbgFree(fault->filename);
679 info->fault_info = fault;
684 HAPI int package_clear_fault(struct pkg_info *info)
686 if (!info->fault_info)
689 package_dump_fault_info(info);
691 DbgFree(info->fault_info->function);
692 DbgFree(info->fault_info->filename);
693 DbgFree(info->fault_info);
694 info->fault_info = NULL;
698 HAPI const int const package_is_fault(const struct pkg_info *info)
700 return !!info->fault_info;
703 HAPI struct slave_node * const package_slave(const struct pkg_info *info)
708 HAPI const int const package_timeout(const struct pkg_info *info)
710 return info->lb.timeout;
713 HAPI void package_set_timeout(struct pkg_info *info, int timeout)
715 info->lb.timeout = timeout;
718 HAPI const double const package_period(const struct pkg_info *info)
720 return info->lb.period;
723 HAPI void package_set_period(struct pkg_info *info, double period)
725 info->lb.period = period;
728 HAPI const int const package_secured(const struct pkg_info *info)
730 return info->secured;
733 HAPI void package_set_secured(struct pkg_info *info, int secured)
735 info->secured = secured;
738 HAPI const char * const package_script(const struct pkg_info *info)
743 HAPI int package_set_script(struct pkg_info *info, const char *script)
747 tmp = strdup(script);
749 ErrPrint("Heap: %s\n", strerror(errno));
753 DbgFree(info->script);
758 HAPI const char * const package_abi(const struct pkg_info *info)
763 HAPI int package_set_abi(struct pkg_info *info, const char *abi)
768 ErrPrint("Heap: %s\n", strerror(errno));
777 HAPI const char * const package_lb_path(const struct pkg_info *info)
779 if (info->lb.type != LB_TYPE_SCRIPT)
782 return info->lb.info.script.path;
785 HAPI int package_set_lb_path(struct pkg_info *info, const char *path)
789 if (info->lb.type != LB_TYPE_SCRIPT)
794 ErrPrint("Heap: %s\n", strerror(errno));
798 DbgFree(info->lb.info.script.path);
799 info->lb.info.script.path = tmp;
803 HAPI const char * const package_lb_group(const struct pkg_info *info)
805 if (info->lb.type != LB_TYPE_SCRIPT)
808 return info->lb.info.script.group;
811 HAPI int package_set_lb_group(struct pkg_info *info, const char *group)
815 if (info->lb.type != LB_TYPE_SCRIPT)
820 ErrPrint("Heap: %s\n", strerror(errno));
824 DbgFree(info->lb.info.script.group);
825 info->lb.info.script.group = tmp;
829 HAPI const char * const package_pd_path(const struct pkg_info *info)
831 if (info->pd.type != PD_TYPE_SCRIPT)
834 return info->pd.info.script.path;
837 HAPI int package_set_pd_path(struct pkg_info *info, const char *path)
841 if (info->pd.type != PD_TYPE_SCRIPT)
846 ErrPrint("Heap: %s\n", strerror(errno));
850 DbgFree(info->pd.info.script.path);
851 info->pd.info.script.path = tmp;
855 HAPI const char * const package_pd_group(const struct pkg_info *info)
857 if (info->pd.type != PD_TYPE_SCRIPT)
860 return info->pd.info.script.group;
863 HAPI int package_set_pd_group(struct pkg_info *info, const char *group)
867 if (info->pd.type != PD_TYPE_SCRIPT)
872 ErrPrint("Heap: %s\n", strerror(errno));
876 DbgFree(info->pd.info.script.group);
877 info->pd.info.script.group = tmp;
881 HAPI const int const package_pinup(const struct pkg_info *info)
883 return info->lb.pinup;
886 HAPI void package_set_pinup(struct pkg_info *info, int pinup)
888 info->lb.pinup = pinup;
891 HAPI const char * const package_auto_launch(const struct pkg_info *info)
893 return info->lb.auto_launch;
896 HAPI void package_set_auto_launch(struct pkg_info *info, const char *auto_launch)
901 info->lb.auto_launch = strdup(auto_launch);
902 if (!info->lb.auto_launch) {
903 ErrPrint("Heap: %s\n", strerror(errno));
908 HAPI const unsigned int const package_size_list(const struct pkg_info *info)
910 return info->lb.size_list;
913 HAPI void package_set_size_list(struct pkg_info *info, unsigned int size_list)
915 info->lb.size_list = size_list;
918 HAPI const int const package_pd_width(const struct pkg_info *info)
920 return info->pd.width;
923 HAPI void package_set_pd_width(struct pkg_info *info, int width)
925 info->pd.width = width;
928 HAPI const int const package_pd_height(const struct pkg_info *info)
930 return info->pd.height;
933 HAPI void package_set_pd_height(struct pkg_info *info, int height)
935 info->pd.height = height;
938 HAPI struct pkg_info * const package_ref(struct pkg_info *info)
944 HAPI struct pkg_info * const package_unref(struct pkg_info *info)
946 if (info->refcnt == 0) {
947 ErrPrint("Invalid request\n");
952 if (info->refcnt == 0) {
953 destroy_package(info);
960 HAPI const int const package_refcnt(const struct pkg_info *info)
965 HAPI const enum lb_type package_lb_type(const struct pkg_info *info)
967 return info->lb.type;
970 HAPI void package_set_lb_type(struct pkg_info *info, enum lb_type type)
972 info->lb.type = type;
975 HAPI const char * const package_libexec(struct pkg_info *info)
977 return info->lb.libexec;
980 HAPI int package_set_libexec(struct pkg_info *info, const char *libexec)
984 tmp = strdup(libexec);
986 ErrPrint("Heap: %s\n", strerror(errno));
990 DbgFree(info->lb.libexec);
991 info->lb.libexec = tmp;
995 HAPI int package_network(struct pkg_info *info)
997 return info->network;
1000 HAPI void package_set_network(struct pkg_info *info, int network)
1002 info->network = network;
1005 HAPI const enum pd_type const package_pd_type(const struct pkg_info *info)
1007 return info->pd.type;
1010 HAPI void package_set_pd_type(struct pkg_info *info, enum pd_type type)
1012 info->pd.type = type;
1017 * Add the instance to the package info.
1018 * If a package has no slave, assign a new slave.
1020 static inline int assign_new_slave(struct pkg_info *info)
1026 s_name = util_slavename();
1028 ErrPrint("Failed to get a new slave name\n");
1032 tmp = abi_find_slave(info->abi);
1035 ErrPrint("Failed to find a proper pkgname of a slave\n");
1039 DbgPrint("Slave package: \"%s\" (abi: %s)\n", tmp, info->abi);
1040 s_pkgname = util_replace_string(tmp, REPLACE_TAG_APPID, info->pkgname);
1042 DbgPrint("Failed to get replaced string\n");
1043 s_pkgname = strdup(tmp);
1045 ErrPrint("Heap: %s\n", strerror(errno));
1051 DbgPrint("New slave name is %s, it is assigned for livebox %s (using %s)\n", s_name, info->pkgname, s_pkgname);
1052 info->slave = slave_create(s_name, info->secured, info->abi, s_pkgname);
1060 * package_destroy will try to remove "info" from the pkg_list.
1061 * but we didn't add this to it yet.
1062 * If the list method couldn't find an "info" from the list,
1063 * it just do nothing so I'll leave this.
1069 * Slave is not activated yet.
1074 HAPI int package_add_instance(struct pkg_info *info, struct inst_info *inst)
1076 if (!info->inst_list) {
1077 info->slave = slave_find_available(info->abi, info->secured);
1082 ret = assign_new_slave(info);
1086 DbgPrint("Slave %s is assigned for %s\n", slave_name(info->slave), info->pkgname);
1089 slave_ref(info->slave);
1090 slave_load_package(info->slave);
1091 slave_event_callback_add(info->slave, SLAVE_EVENT_DEACTIVATE, slave_deactivated_cb, info);
1092 slave_event_callback_add(info->slave, SLAVE_EVENT_ACTIVATE, slave_activated_cb, info);
1093 slave_event_callback_add(info->slave, SLAVE_EVENT_FAULT, slave_fault_cb, info);
1095 if (info->secured) {
1096 slave_event_callback_add(info->slave, SLAVE_EVENT_PAUSE, slave_paused_cb, info);
1097 slave_event_callback_add(info->slave, SLAVE_EVENT_RESUME, slave_resumed_cb, info);
1101 * In case of the slave is terminated because of expired TTL timer,
1102 * Master should freeze the all update time.
1103 * But the callback should check the slave's state to prevent from duplicated freezing.
1105 * This callback will freeze the timer only if a slave doesn't running.
1107 xmonitor_add_event_callback(XMONITOR_PAUSED, xmonitor_paused_cb, info);
1108 xmonitor_add_event_callback(XMONITOR_RESUMED, xmonitor_resumed_cb, info);
1112 info->inst_list = eina_list_append(info->inst_list, inst);
1116 HAPI int package_del_instance(struct pkg_info *info, struct inst_info *inst)
1118 info->inst_list = eina_list_remove(info->inst_list, inst);
1120 if (info->inst_list)
1124 slave_unload_package(info->slave);
1126 slave_event_callback_del(info->slave, SLAVE_EVENT_FAULT, slave_fault_cb, info);
1127 slave_event_callback_del(info->slave, SLAVE_EVENT_DEACTIVATE, slave_deactivated_cb, info);
1128 slave_event_callback_del(info->slave, SLAVE_EVENT_ACTIVATE, slave_activated_cb, info);
1130 if (info->secured) {
1131 slave_event_callback_del(info->slave, SLAVE_EVENT_PAUSE, slave_paused_cb, info);
1132 slave_event_callback_del(info->slave, SLAVE_EVENT_RESUME, slave_resumed_cb, info);
1134 xmonitor_del_event_callback(XMONITOR_PAUSED, xmonitor_paused_cb, info);
1135 xmonitor_del_event_callback(XMONITOR_RESUMED, xmonitor_resumed_cb, info);
1138 slave_unref(info->slave);
1142 if (info->is_uninstalled)
1143 package_destroy(info);
1148 HAPI Eina_List *package_instance_list(struct pkg_info *info)
1150 return info->inst_list;
1153 static int client_created_cb(struct client_node *client, void *data)
1155 struct pkg_info *info;
1158 struct inst_info *inst;
1161 EINA_LIST_FOREACH(s_info.pkg_list, l, info) {
1162 if (info->fault_info) {
1163 fault_unicast_info(client, info->pkgname, info->fault_info->filename, info->fault_info->function);
1167 EINA_LIST_FOREACH(info->inst_list, i_l, inst) {
1168 switch (instance_state(inst)) {
1170 /* Will be send a created event after the instance gets created event */
1172 case INST_ACTIVATED: /*!< This instance is actiavted, and used */
1173 case INST_REQUEST_TO_REACTIVATE: /*!< This instance will be reactivated soon */
1174 case INST_REQUEST_TO_DESTROY: /*!< This instance will be destroy soon */
1175 if (instance_client(inst) == client) {
1176 instance_unicast_created_event(inst, client);
1177 } else if (instance_client(inst) == NULL) {
1180 * Instances are lives in the system cluster/sub-cluster
1182 if (client_is_subscribed(client, instance_cluster(inst), instance_category(inst))) {
1183 instance_unicast_created_event(inst, client);
1184 DbgPrint("(Subscribed) Created package: %s\n", info->pkgname);
1190 DbgPrint("%s(%s) is not activated (%d)\n",
1191 package_name(info), instance_id(inst), instance_state(inst));
1200 static int io_uninstall_cb(const char *pkgname, int prime, void *data)
1202 struct pkg_info *info;
1205 struct inst_info *inst;
1207 DbgPrint("Livebox package %s is uninstalled\n", pkgname);
1208 info = package_find(pkgname);
1210 DbgPrint("%s is not yet loaded\n", pkgname);
1214 info->is_uninstalled = 1;
1218 * Don't delete an item from the inst_list.
1219 * destroy callback will use this list again.
1220 * So, Don't touch it from here.
1222 if (info->inst_list) {
1223 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
1224 instance_destroy(inst);
1227 package_destroy(info);
1233 static inline void reload_package_info(struct pkg_info *info)
1237 struct inst_info *inst;
1239 DbgPrint("Already exists, try to update it\n");
1242 * Without "is_uninstalled", the package will be kept
1244 EINA_LIST_FOREACH_SAFE(info->inst_list, l, n, inst) {
1245 instance_destroy(inst);
1248 group_del_livebox(info->pkgname);
1249 package_clear_fault(info);
1255 io_load_package_db(info);
1258 static int io_install_cb(const char *pkgname, int prime, void *data)
1260 struct pkg_info *info;
1262 DbgPrint("Livebox package %s is installed\n", pkgname);
1263 info = package_find(pkgname);
1265 reload_package_info(info);
1267 info = package_create(pkgname);
1268 DbgPrint("Package %s is%sbuilt\n", pkgname, info ? " " : " not ");
1274 static int install_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
1278 if (status != PKGMGR_STATUS_END)
1281 ret = io_update_livebox_package(pkgname, io_install_cb, NULL);
1282 DbgPrint("Processed %d packages\n", ret);
1286 static int uninstall_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
1290 if (status == PKGMGR_STATUS_START) {
1291 ret = io_update_livebox_package(pkgname, io_uninstall_cb, NULL);
1292 DbgPrint("Processed %d packages\n", ret);
1294 /*! for keeping the old style */
1295 (void)io_uninstall_cb(pkgname, -1, NULL);
1302 static int io_update_cb(const char *pkgname, int prime, void *data)
1304 struct pkg_info *info;
1306 DbgPrint("Livebox package %s is updated\n", pkgname);
1307 info = package_find(pkgname);
1311 reload_package_info(info);
1315 static int update_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
1318 if (status != PKGMGR_STATUS_END)
1321 ret = io_update_livebox_package(pkgname, io_update_cb, NULL);
1322 DbgPrint("Processed %d packages\n", ret);
1326 static int crawling_liveboxes(const char *pkgname, int prime, void *data)
1328 if (package_find(pkgname)) {
1329 ErrPrint("Information of %s is already built\n", pkgname);
1331 struct pkg_info *info;
1332 info = package_create(pkgname);
1334 DbgPrint("[%s] information is built prime(%d)\n", pkgname, prime);
1340 HAPI int package_init(void)
1342 client_global_event_handler_add(CLIENT_GLOBAL_EVENT_CREATE, client_created_cb, NULL);
1345 pkgmgr_add_event_callback(PKGMGR_EVENT_INSTALL, install_cb, NULL);
1346 pkgmgr_add_event_callback(PKGMGR_EVENT_UNINSTALL, uninstall_cb, NULL);
1347 pkgmgr_add_event_callback(PKGMGR_EVENT_UPDATE, update_cb, NULL);
1349 io_crawling_liveboxes(crawling_liveboxes, NULL);
1353 HAPI int package_fini(void)
1355 pkgmgr_del_event_callback(PKGMGR_EVENT_INSTALL, install_cb, NULL);
1356 pkgmgr_del_event_callback(PKGMGR_EVENT_UNINSTALL, uninstall_cb, NULL);
1357 pkgmgr_del_event_callback(PKGMGR_EVENT_UPDATE, update_cb, NULL);
1359 client_global_event_handler_del(CLIENT_GLOBAL_EVENT_CREATE, client_created_cb, NULL);
1363 HAPI const char *package_find_by_secured_slave(struct slave_node *slave)
1366 struct pkg_info *info;
1368 if (!slave_is_secured(slave))
1371 EINA_LIST_FOREACH(s_info.pkg_list, l, info) {
1372 if (info->slave == slave)
1373 return info->pkgname;
1379 HAPI const char * const package_name(const struct pkg_info *info)
1381 return info->pkgname;
1385 * del_or_creat : 1 == create, 0 == delete
1387 HAPI int package_alter_instances_to_client(struct client_node *client, enum alter_type alter)
1389 struct pkg_info *info;
1392 struct inst_info *inst;
1395 EINA_LIST_FOREACH(s_info.pkg_list, l, info) {
1396 EINA_LIST_FOREACH(info->inst_list, i_l, inst) {
1397 if (instance_client(inst))
1400 if (!client_is_subscribed(client, instance_cluster(inst), instance_category(inst)))
1403 switch (instance_state(inst)) {
1405 case INST_REQUEST_TO_ACTIVATE:
1406 /* Will be send a created event after the instance gets created event */
1409 if (!instance_has_client(inst, client)) {
1410 instance_add_client(inst, client);
1414 if (instance_has_client(inst, client)) {
1415 instance_del_client(inst, client);
1422 case INST_ACTIVATED: /*!< This instance is actiavted, and used */
1423 case INST_REQUEST_TO_REACTIVATE: /*!< This instance will be reactivated soon */
1424 case INST_REQUEST_TO_DESTROY: /*!< This instance will be destroy soon */
1427 * Instances are lives in the system cluster/sub-cluster
1431 if (!instance_has_client(inst, client)) {
1432 instance_unicast_created_event(inst, client);
1433 instance_add_client(inst, client);
1434 DbgPrint("(Subscribed) Created package: %s\n", info->pkgname);
1438 if (instance_has_client(inst, client)) {
1439 instance_unicast_deleted_event(inst, client);
1440 instance_del_client(inst, client);
1449 DbgPrint("%s(%s) is not activated (%d)\n",
1450 package_name(info), instance_id(inst), instance_state(inst));
1459 HAPI const Eina_List *package_list(void)
1461 return s_info.pkg_list;
1464 HAPI int const package_fault_count(struct pkg_info *info)
1466 return info ? info->fault_count : 0;