Update SMACK, Fix a crash of terminating sequence, etc, ...
[apps/livebox/data-provider-master.git] / src / setting.c
index e7e5379..47c41c8 100644 (file)
@@ -30,6 +30,8 @@
 #include <Ecore.h>
 #include <Eina.h>
 
+#include <livebox-service.h>
+
 #include "client_life.h"
 #include "setting.h"
 #include "util.h"
@@ -38,6 +40,8 @@
 #include "critical_log.h"
 #include "xmonitor.h"
 #include "conf.h"
+#include "package.h"
+#include "instance.h"
 
 int errno;
 
@@ -80,8 +84,8 @@ static void power_off_cb(keynode_t *node, void *user_data)
                        ErrPrint("stop.provider [%s]\n", strerror(errno));
 
                vconf_set_bool(VCONFKEY_MASTER_STARTED, 0);
-               exit(0);
-               //ecore_main_loop_quit();
+               //exit(0);
+               ecore_main_loop_quit();
        } else {
                ErrPrint("Unknown power state: %d\n", val);
        }
@@ -112,7 +116,7 @@ static void region_changed_cb(keynode_t *node, void *user_data)
        if (r == NULL)
                ErrPrint("Failed to change region\n");
 
-       free(region);
+       DbgFree(region);
 }
 
 static void lang_changed_cb(keynode_t *node, void *user_data)
@@ -132,7 +136,70 @@ static void lang_changed_cb(keynode_t *node, void *user_data)
                ErrPrint("Failed to change locale\n");
 
        DbgPrint("Locale: %s\n", setlocale(LC_ALL, NULL));
-       free(lang);
+       DbgFree(lang);
+}
+
+static void ail_info_cb(keynode_t *node, void *user_data)
+{
+       Eina_List *inst_list;
+       Eina_List *pkg_list;
+       struct inst_info *inst;
+       Eina_List *l;
+       Eina_List *n;
+       Eina_List *j;
+       struct pkg_info *info;
+       char *event;
+       char *appid;
+       char *pkgname;
+       int len;
+       int enabled;
+
+       event = vconf_get_str(VCONFKEY_AIL_INFO_STATE);
+       if (!event)
+               return;
+
+       len = strlen("update:");
+       if (!strncasecmp(event, "update:", len))
+               goto out;
+
+       appid = event + len;
+       DbgPrint("AppId: [%s]\n", appid);
+
+       enabled = package_is_enabled(appid);
+
+       DbgPrint("AppId: %s, %d\n", appid, enabled);
+       if (enabled != 0) {
+               /*
+                * \note
+                * reload?
+                */
+               goto out;
+       }
+
+       len = strlen(appid);
+
+       pkg_list = (Eina_List *)package_list();
+       EINA_LIST_FOREACH(pkg_list, l, info) {
+               inst_list = NULL;
+               pkgname = livebox_service_mainappid(package_name(info));
+               if (!pkgname)
+                       continue;
+
+               if (strcmp(appid, pkgname)) {
+                       DbgFree(pkgname);
+                       continue;
+               }
+               DbgPrint("Package disabled: %s (%s)\n", pkgname, appid);
+               DbgFree(pkgname);
+
+               inst_list = package_instance_list(info);
+               EINA_LIST_FOREACH_SAFE(inst_list, j, n, inst) {
+                       instance_destroy(inst);
+               }
+       }
+
+out:
+       DbgFree(event);
 }
 
 HAPI int setting_init(void)
@@ -155,6 +222,10 @@ HAPI int setting_init(void)
        if (ret < 0)
                ErrPrint("Failed to add vconf for region change: %d\n", ret);
 
+       ret = vconf_notify_key_changed(VCONFKEY_AIL_INFO_STATE, ail_info_cb, NULL);
+       if (ret < 0)
+               ErrPrint("Failed to add vconf for ail info state: %d\n", ret);
+
        lang_changed_cb(NULL, NULL);
        region_changed_cb(NULL, NULL);
        return ret;
@@ -180,6 +251,10 @@ HAPI int setting_fini(void)
        if (ret < 0)
                ErrPrint("Failed to ignore vconf key (%d)\n", ret);
 
+       ret = vconf_ignore_key_changed(VCONFKEY_AIL_INFO_STATE, ail_info_cb);
+       if (ret < 0)
+               ErrPrint("Failed to ignore vconf key (%d)\n", ret);
+
        return ret;
 }