fixed N_SE_12778
[apps/core/preloaded/settings.git] / src / setting-plugin.c
index faa8608..5784285 100755 (executable)
@@ -42,11 +42,12 @@ static Setting_GenGroupItem_Data *g_list_item;      /*TEST*/
  */
 Eina_List *_g_drawer_list = NULL;
 
+#if 0
 /**
  * @return Evas_Object * obj
  */
 static void* navigationbar_func(void *data, xmlNode *xmlObj);
-
+#endif
 
 /*
  * @return void
@@ -122,12 +123,11 @@ static void __drawer_add(const char *type, drawer_fp draw)
 static drawer_fp __drawer_find(char* type)
 {
        SETTING_TRACE_BEGIN;
+       SETTING_TRACE("node type:%s", type);
        Eina_List *check_list = _g_drawer_list;
        Object_Drawer *list_item = NULL;
 
        while (check_list) {
-
-               list_item = NULL;
                list_item = (Object_Drawer *) eina_list_data_get(check_list);
                if (NULL == list_item)
                        continue;
@@ -137,8 +137,9 @@ static drawer_fp __drawer_find(char* type)
                        //SETTING_TRACE("list_item->type:%s", list_item->type);
                        break;
                }
-
+               //if not matched,to check next node.
                check_list = eina_list_next(check_list);
+               list_item = NULL;
        }
        //SETTING_TRACE("list_item:%p", list_item);
        return list_item ? list_item->draw : NULL;
@@ -146,7 +147,9 @@ static drawer_fp __drawer_find(char* type)
 void setting_drawer_list_init()
 {
        SETTING_TRACE_BEGIN;
+#if 0
        /* <navigationbar> */__drawer_add("navigationbar", navigationbar_func);
+#endif
        /* <bool>          */__drawer_add("bool", checkbox_func);
        /* <string>        */__drawer_add("string", editbox_func);
        /* <group>         */__drawer_add("group", group_func);
@@ -188,8 +191,13 @@ void setting_drawer_list_fini()
 #define MAX_LOCAL_BUFSIZE 128
 #define DBUS_PATH "/setting/dbus_handler"
 #define DBUS_SIGNAL_INTERFACE "org.tizen.setting.signal"
-#define DBUS_SIGNAL "test"
 
+#define APPID_LENGTH 10
+#define APPID_POS_FROM_PATH 10
+
+static char* s_pkg_name;
+
+#if 0
 static char* substring(const char* str, size_t begin, size_t len)
 {
   if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
@@ -197,6 +205,21 @@ static char* substring(const char* str, size_t begin, size_t len)
 
   return strndup(str + begin, len);
 }
+#endif
+
+/**
+ * package ID
+ *
+ * ncbyusjryr.AppSetting --> package ID is ncbyusjryr
+ * "Update_" "ncbyusjryr"
+ */
+static char* get_app_string(char* path)
+{
+       SETTING_TRACE_BEGIN;
+       char* temp = substring(path, APPID_POS_FROM_PATH, APPID_LENGTH/*string size*/);
+       SETTING_TRACE("package ID : >>> %s ",temp );
+       return temp;
+}
 
 //------------------------------------------------------
 // for client - bus
@@ -214,7 +237,25 @@ static DBusHandlerResult __signal_filter(DBusConnection* conn, DBusMessage* mess
 
        setting_main_appdata *ad = user_data;
 
-    if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, DBUS_SIGNAL))
+       char* pkg_name = get_app_string(ad->plugin_path);
+
+       char str_buf[MAX_COMMON_BUFFER_LEN];
+       snprintf(str_buf, MAX_COMMON_BUFFER_LEN, "Update_%s", pkg_name);
+       s_pkg_name = strdup(str_buf);
+
+       if (pkg_name)
+       {
+               free(pkg_name);
+               pkg_name = NULL;
+       }
+
+       if (s_pkg_name == NULL)
+       {
+               SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+       }
+       SETTING_TRACE("s_pkg_name : %s ", s_pkg_name);
+    if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, s_pkg_name))
     {
         if (dbus_message_get_args(message, &error,
                 DBUS_TYPE_UINT32, &sender_pid,
@@ -277,12 +318,19 @@ static DBusHandlerResult __signal_filter(DBusConnection* conn, DBusMessage* mess
 static int __send_msg(char* key, char* value)
 {
        DBusMessage* message;
+
        int sender_pid = getpid();
 
        if (bus == NULL)
                return -1;
 
-       message = dbus_message_new_signal(DBUS_PATH, DBUS_SIGNAL_INTERFACE, DBUS_SIGNAL);
+       if (s_pkg_name == NULL)
+       {
+               SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
+               return -1;
+       }
+
+       message = dbus_message_new_signal(DBUS_PATH, DBUS_SIGNAL_INTERFACE, s_pkg_name);
 
        SETTING_TRACE("Sending message[%s:%s] via dbus", key ,value);
        if (dbus_message_append_args(message,
@@ -339,60 +387,74 @@ static void __send_string_msg(xmlNode* xmlObj, char *string)
 int setting_dbus_handler_init(void* user_data)
 {
        SETTING_TRACE_BEGIN;
-    DBusError error;
-    char rule[MAX_LOCAL_BUFSIZE];
-
-    dbus_error_init(&error);
-    bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
-    if (!bus)
-    {
-        SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
-        dbus_error_free(&error);
-        return -1;
-    }
+       if (bus)
+       {
+               SETTING_TRACE("already get a bus, need release first.");
+               setting_dbus_handler_fini();
+       }
+       DBusError error;
+       memset(&error, 0, sizeof(DBusError));
+       char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
+       dbus_error_init(&error);
+       bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
+       if (!bus)
+       {
+               SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
+               dbus_error_free(&error);
+               return -1;
+       }
 
-    dbus_connection_setup_with_g_main(bus, NULL);
-    snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+       dbus_connection_setup_with_g_main(bus, NULL);
+       snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
 
-    dbus_bus_add_match(bus, rule, &error);
-    if (dbus_error_is_set(&error))
-    {
-        SETTING_TRACE("Fail to rule set; %s", error.message);
-        dbus_error_free(&error);
-        return -1;
-    }
-
-    if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
-    {
-        return -1;
-    }
+       dbus_bus_add_match(bus, rule, &error);
+       if (dbus_error_is_set(&error))
+       {
+               SETTING_TRACE("Fail to rule set; %s", error.message);
+               dbus_bus_remove_match(bus, rule, &error);
+               dbus_error_free(&error);
+               dbus_connection_close(bus);
+               bus = NULL;
+               return -1;
+       }
 
-    SETTING_TRACE("app signal initialized");
+       if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
+       {
+               dbus_bus_remove_match(bus, rule, &error);
+               dbus_error_free(&error);
+               dbus_connection_close(bus);
+               bus = NULL;
+               return -1;
+       }
 
-    return 0;
+       SETTING_TRACE("app signal initialized");
+       return 0;
 }
 
-
 int setting_dbus_handler_fini(void)
 {
-    DBusError error;
-    char rule[MAX_LOCAL_BUFSIZE];
-
-    dbus_error_init(&error);
-    dbus_connection_remove_filter(bus, __signal_filter, NULL);
-    snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
-    dbus_bus_remove_match(bus, rule, &error);
-
-    if (dbus_error_is_set(&error))
-    {
-        SETTING_TRACE("Fail to rule unset: %s", error.message);
-        dbus_error_free(&error);
-        return -1;
-    }
+       //do safty checking first.
+       setting_retvm_if(!bus, 0, "!bus");
+       DBusError error;
+       memset(&error, 0, sizeof(DBusError));
+       char rule[MAX_LOCAL_BUFSIZE + 1] = {0, };
+
+       dbus_error_init(&error);
+       //dbus_connection_remove_filter(bus, __signal_filter, NULL);
+       snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+       dbus_bus_remove_match(bus, rule, &error);
+
+       if (dbus_error_is_set(&error))
+       {
+               SETTING_TRACE("Fail to rule unset: %s", error.message);
+               dbus_error_free(&error);
+               //return -1;
+       }
 
-    dbus_connection_close(bus);
-    SETTING_TRACE("app signal finalized");
-    return 0;
+       dbus_connection_close(bus);
+       bus = NULL;
+       SETTING_TRACE("app signal finalized");
+       return 0;
 }
 
 /////////////////////////////
@@ -434,11 +496,14 @@ static void ___click_softkey_back_cb(void *data, Evas_Object *obj,
 
        setting_plugin_destroy(node);
 
-//     pd->scroller = NULL;
-//     pd->navi_bar = NULL;
-//     pd->cfg_file = NULL;
+       pd->scroller = NULL;
+       pd->navi_bar = NULL;
+       pd->cfg_file = NULL;
+
 
-//     pd->root = NULL;
+
+
+       pd->root = NULL;
 }
 
 
@@ -666,16 +731,17 @@ static void* slider_func(void *data, xmlNode *xmlObj)
        return (void*)list_item;
 };
 
+#if 0
 /*
   elm_object_item_data_set(item_to_update->item, item_to_update);
   elm_genlist_item_update(item_to_update->item);
 */
 static void* navigationbar_func(void *data, xmlNode *xmlObj)
 {
+#if 1
        SETTING_TRACE_BEGIN;
        ret_if(!data || !xmlObj);
 
-       //Draw_Data *pd = node->pd;
        PluginNode* node = (PluginNode*)data;
        Draw_Data *pd = node->pd;
 
@@ -692,7 +758,10 @@ static void* navigationbar_func(void *data, xmlNode *xmlObj)
                {
                        if (!xmlStrcmp(cur->name, (const xmlChar*)"button")) {
                                btn[i] = xmlGetProp(cur, "title");
-                               SETTING_TRACE("------>>> node type : Element, name=%s id=%s / btn[%d] = %s ", cur->name,xmlGetProp(cur, "id"), i, btn[i]);
+                               SETTING_TRACE("------>>> node type : Element, name=%s id=%s / btn[%d] = %s ",
+                                                               cur->name,xmlGetProp(cur, "id"),
+                                                               i,
+                                                               btn[i]);
                                i++;
                        }
                        cur = cur->next;
@@ -708,9 +777,10 @@ static void* navigationbar_func(void *data, xmlNode *xmlObj)
                                                   ___click_softkey_back_cb, data, &pd->scroller,
                                                   &(pd->navi_bar));
 
+#endif
        return NULL;
 };
-
+#endif
 
 static void __check_mouse_up_cb(void *data, Evas_Object *obj,
                                             void *event_info)
@@ -892,14 +962,44 @@ static void* editbox_func(void *data, xmlNode *xmlObj)
        const char *title = (char*)xmlGetProp(xmlObj, "title");
        const char *key_str= (char*)xmlGetProp(xmlObj, "value");
 
-       // TODO: minlength
-       // TODO: maxlength
-       Setting_GenGroupItem_Data *list_item =
-           setting_create_Gendial_field_def(pd->scroller, &(itc_1icon),
-                                            __editbox_list_cb,
-                                            pd, SWALLOW_Type_LAYOUT_ENTRY,
-                                            NULL, NULL, 0, title, key_str,
-                                            __editbox_changed_cb);
+       const char *minlength= (char*)xmlGetProp(xmlObj, "minlength");
+       const char *maxlength= (char*)xmlGetProp(xmlObj, "maxlength");
+
+       int max_len = -1;
+       if (maxlength)
+       {
+               max_len = atoi(maxlength);
+               SETTING_TRACE(" >> MAXLENGTH FILTER IS AVAILABLE !!!! maxlength = %d", max_len);
+       }
+
+       Setting_GenGroupItem_Data *list_item = NULL;
+
+       if (max_len == -1)
+       {
+               // without maxlength filter
+               list_item = setting_create_Gendial_field_def(pd->scroller, &(itc_1icon),
+                                                                __editbox_list_cb,
+                                                        pd, SWALLOW_Type_LAYOUT_ENTRY,
+                                                        NULL, NULL, 0, title, key_str,
+                                                        __editbox_changed_cb);
+
+       } else {
+               // add max length filter
+               list_item = setting_create_Gendial_field_entry(
+                                                                       pd->scroller,
+                                                                       &(itc_1icon),
+                                                                       __editbox_list_cb,
+                                                                       pd,
+                                                                       SWALLOW_Type_LAYOUT_ENTRY,
+                                                                       NULL, NULL, 0, title, key_str, __editbox_changed_cb,
+                                                                       ELM_INPUT_PANEL_LAYOUT_NORMAL,
+                                                                       false,
+                                                                       false,
+                                                                       max_len,
+                                                                       0,
+                                                                       NULL, NULL);
+
+       }
        if (list_item) {
                list_item->userdata = xmlObj;
                list_item->stop_change_cb = __entry_unfocus_cb;
@@ -1029,44 +1129,86 @@ static void* settings_func(void *data, xmlNode *xmlObj)
        return NULL;
 }
 
+
+static Evas_Object *setting_create_win_layout2(Evas_Object *win_layout, Evas_Object *win_obj)
+{
+
+    Evas_Object *layout = NULL;
+    Evas_Object *conform = elm_conformant_add(win_obj);
+    //setting_main_appdata *ad = (setting_main_appdata *) data;
+
+    /*  Base Layout */
+    layout = elm_layout_add(conform);
+    evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    setting_retvm_if(layout == NULL, FALSE, "layout == NULL");
+
+    elm_layout_theme_set(layout, "layout", "application", "default");
+    evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL);
+    elm_win_resize_object_add(win_obj, conform);
+    elm_object_content_set(conform, layout);
+
+    Evas_Object *bg = setting_create_bg(layout, win_obj, "group_list");
+    elm_object_part_content_set(layout, "elm.swallow.bg", bg);
+    evas_object_show(layout);
+    evas_object_show(conform);
+
+    //ad->conformant = conform;
+    return layout;
+}
+
+
+Evas_Object *setting_create_layout_navi_bar2(Evas_Object *win_layout, Evas_Object *win_obj, char *title_str, char *lbutton_str, char *rbutton_str, char *mbutton_str, setting_call_back_func lbutton_click_cb, setting_call_back_func rbutton_click_cb, setting_call_back_func mbutton_click_cb, void *cb_data, Evas_Object *eo_view,  /*any container obj constructed on any evas obj */
+                                           Evas_Object **navi_bar,
+                                           Evas_Object **titleobj)
+{
+
+       Evas_Object *layout = setting_create_win_layout2(win_layout, win_obj);
+       *navi_bar = setting_create_navi_bar(layout);
+
+       setting_create_navi_bar_buttons(title_str,
+                                       lbutton_str, rbutton_str, mbutton_str,
+                                       lbutton_click_cb, rbutton_click_cb,
+                                       mbutton_click_cb, cb_data, eo_view /*content */ ,
+                                       *navi_bar, NULL);
+       return layout;
+}
+
 // <setting>
 static void* setting_func(void *data, xmlNode *xmlObj)
 {
-#if 0/*{{{*/
-       // DO NOTHING
-       //----------------------------------------------------------------
+       SETTING_TRACE_BEGIN;
+       ret_if(!data || !xmlObj);
+
+#if 1
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
+
        // [DATA] title, btn[0], btn[1]
-       Draw_Data *pd = data;
        const char *title = (char*)xmlGetProp(xmlObj, "title");
-       char *btn[2] = {0, };
+       char *btn[2] = {/* 0 */"OK", /* 1 */"NO"};
+
+       SETTING_TRACE("before setting_create_layout_navi_bar_genlist");
 
-       // find child nodes named 'elements'
-#if 0
-       if (xmlObj->children) {
-               xmlNode* cur = xmlObj->children;
-               int i =0;
-               while (cur != NULL)
-               {
-                       if (!xmlStrcmp(cur->name, (const xmlChar*)"button")) {
-                               btn[i] = xmlGetProp(cur, "title");
-                               SETTING_TRACE("------>>> node type : Element, name=%s id=%s / btn[%d] = %s ", cur->name,xmlGetProp(cur, "id"), i, btn[i]);
-                               i++;
-                       }
-                       cur = cur->next;
-               }
-       }
-#endif
-       //----------------------------------------------------------------
        // [UI] with DATA
-       pd->ly_main = setting_create_layout_navi_bar_genlist(pd->win_get,
-                                                  pd->win_get,
-                                                  _(title),
-                                                  _("NO"), _("YES"),
-                                                  ___click_softkey_back_cb,
-                                                  ___click_softkey_back_cb, pd, &pd->scroller,
-                                                  &(pd->navi_bar));
-#endif/*}}}*/
+       pd->scroller = elm_genlist_add(pd->win_get);
+       retvm_if(pd->scroller == NULL, NULL,
+                "Cannot set scroller object  as contento of layout");
+       elm_object_style_set(pd->scroller, "dialogue");
+       elm_genlist_clear(pd->scroller);        /* first to clear list */
+
+
+       SETTING_TRACE("_(title):%s", _(title));
+       pd->ly_main = setting_create_layout_navi_bar2(pd->win_get, pd->win_get,
+                                          _(title),
+                                          _("IDS_COM_BODY_BACK"), NULL, NULL,
+                                          ___click_softkey_back_cb,
+                                          NULL, NULL,
+                                          data, pd->scroller,
+                                          &(pd->navi_bar), NULL);
+       SETTING_TRACE("after setting_create_layout_navi_bar_genlist");
 
+#endif
        return NULL;
 }
 
@@ -1115,8 +1257,7 @@ static int __node_walker(PluginNode* context, xmlNode* cur)
        xmlNode *cur_node = NULL;
        for (cur_node = cur; cur_node;cur_node = cur_node->next) {
                if (cur_node->type == XML_ELEMENT_NODE) {
-                       SETTING_TRACE("node type : Element, name=%s id=%s", cur_node->name,xmlGetProp(cur_node, "id"));
-
+                       // SETTING_TRACE("node type : %s id= %s", cur_node->name,xmlGetProp(cur_node, "id"));
                        drawer_fp  fp = __drawer_find(cur_node->name);
                        if (fp)
                        {
@@ -1382,6 +1523,9 @@ void setting_plugin_update(PluginNode* context)
 }
 
 
+/**
+ * set modifiable
+ */
 bool setting_plugin_load(PluginNode* context, const char *cfg_file)
 {
        SETTING_TRACE("cfg_file:%s", cfg_file)