#include <eina_list.h>
#include <glib.h>
-#include <libxml/xmlmemory.h>
-#include <libxml/parser.h>
#include <setting-debug.h>
#include <setting-common-general-func.h>
#include <setting-plugin.h>
+
+
+static Setting_GenGroupItem_Data *g_list_item; /*TEST*/
+
+
+
/*
* UI draw handler table : _g_draw_list
* - contains Object_Drawer typed object.
*/
Eina_List *_g_drawer_list = NULL;
-typedef void (*drawer_fp)(void *data, xmlNode *xmlObj);
-static void group_func(void *data, xmlNode *xmlObj);
-static void link_func(void *data, xmlNode *xmlObj);
-static void slider_func(void *data, xmlNode *xmlObj);
-static void navigationbar_func(void *data, xmlNode *xmlObj);
-static void checkbox_func(void *data, xmlNode *xmlObj);
-static void editbox_func(void *data, xmlNode *xmlObj);
-static void expanditem_func(void *data, xmlNode *xmlObj);
-static void expandlist_func(void *data, xmlNode *xmlObj);
-static void settings_func(void *data, xmlNode *xmlObj);
-static void setting_func(void *data, xmlNode *xmlObj);
-
-// draw handler
-typedef struct
-{
- const char* type; // ui type
- drawer_fp draw;
-} Object_Drawer;
+/**
+ * @return Evas_Object * obj
+ */
+static void* navigationbar_func(void *data, xmlNode *xmlObj);
+
+
+/*
+ * @return void
+ */
+static void* group_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* link_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* slider_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* label_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* checkbox_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* editbox_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* expandlist_func(void *data, xmlNode *xmlObj);
+
+/**
+ * @return nothing
+ */
+static void* expanditem_func(void *data, xmlNode *xmlObj);
+
+/**
+ * do nothing
+ */
+static void* settings_func(void *data, xmlNode *xmlObj);
+
+
+static void* launch_func(void *data, xmlNode *xmlObj);
+
+/**
+ * do nothing
+ */
+static void* setting_func(void *data, xmlNode *xmlObj);
+
+static int __node_walker(PluginNode* context, xmlNode* cur);
+
+static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end);
+
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;
//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;
}
void setting_drawer_list_init()
-{SETTING_TRACE_BEGIN;
+{
+ 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);
/* <integer> */__drawer_add("integer", slider_func);
- /* <link */__drawer_add("link", link_func);
+ /* <label> */__drawer_add("label", label_func);
+ /* <link> */__drawer_add("link", link_func);
+ /* <launch> */__drawer_add("launch", launch_func);
/* <extendlist> */__drawer_add("expandlist", expandlist_func);
/* <extenditem> */__drawer_add("expanditem", expanditem_func);
/* <settings> */__drawer_add("settings", settings_func);
node = (Object_Drawer *) eina_list_data_get(li);
if (node)
{
- SETTING_TRACE("Deregister %s", node->type);
+ //SETTING_TRACE("Deregister %s", node->type);
FREE(node);
}
li = eina_list_next(li);
#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;
+
+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))
+ return 0;
+
+ return strndup(str + begin, len);
+}
+
+/**
+ * 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
DBusError error;
dbus_error_init(&error);
- if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, DBUS_SIGNAL))
+ setting_main_appdata *ad = user_data;
+
+ 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,
if (sender_pid != 0 && my_pid != sender_pid)
{
SETTING_TRACE("received key : %s , value : %s", key, value);
+ //-------------------------------------------------------------
+ // received key : checkbox1|N/A , value : INT|1
+ //-------------------------------------------------------------
+ //char* key = "checkbox1|N/A";
+ char* ptr = strchr(key, '|');
+
+ xmlDocPtr doc = NULL;
+ if (ptr && key)
+ {
+ //parsing for : checkbox1|N/A -> checkbox1
+ char* key_name = substring(key, 0, strlen(key)-strlen(ptr));
+ char* val_name = strchr(value, '|');
+ val_name++;
+
+ // ad->plugin_path
+ // access xml file
+ doc = xmlParseFile(ad->plugin_path);
+ // generate xml tree
+ xmlNode *root = xmlDocGetRootElement(doc);
+ // find a node
+ bool is_end = false;
+ __node_finder((PluginNode*)ad->plugin_node, root, key_name ,val_name, &is_end);
+ }
+ // update the node
+ GError *error = NULL;
+
+#if 0
+ if(doc != NULL)
+ {
+ xmlSaveFormatFile(ad->plugin_path, doc, 1);
+ // TODO: make sure this is right
+ xmlFreeDoc(doc);
+ doc = NULL;
+ SETTING_TRACE("__cfg_file_write successful");
+ }
+#endif
+
+ // update UI
}
return DBUS_HANDLER_RESULT_HANDLED;
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,
}
-int setting_dbus_handler_init(void)
+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;
- }
-
- dbus_connection_setup_with_g_main(bus, NULL);
- snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+ 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_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;
- }
+ dbus_connection_setup_with_g_main(bus, NULL);
+ snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
- if (dbus_connection_add_filter(bus, __signal_filter, NULL, 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;
}
/////////////////////////////
Elm_Genlist_Item_Class itc_layout;
-// draw handler
-typedef struct
-{
- xmlDocPtr doc;
- xmlNode *root;
-
- const char *cfg_file;
- Evas_Object *win_get;
- Evas_Object *ly_main;
- Evas_Object *scroller;
- Evas_Object *navi_bar;
-} Draw_Data;
-
-
// write -> update
static int __cfg_file_write(Draw_Data *pd)
{
if(pd->doc != NULL)
{
xmlSaveFormatFile(pd->cfg_file, pd->doc, 1);
- // TODO: make sure this is right
//xmlFreeDoc(pd->doc);
//pd->doc = NULL;
SETTING_TRACE("__cfg_file_write successful");
{
SETTING_TRACE_BEGIN;
ret_if(!data);
- Draw_Data *pd = data;
+
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
if (pd->ly_main) {
evas_object_del(pd->ly_main);
pd->ly_main = NULL;
}
+ setting_plugin_destroy(node);
+
pd->scroller = NULL;
pd->navi_bar = NULL;
pd->cfg_file = NULL;
}
-static void group_func(void *data, xmlNode *xmlObj)
+static void* group_func(void *data, xmlNode *xmlObj)
{
SETTING_TRACE_BEGIN;
ret_if(!data || !xmlObj);
- Draw_Data *pd = data;
+
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
// original code is non-recursive
#if 0
SETTING_TRACE (" >>> GROUP NAME : %s \n", title);
(void)setting_create_Gendial_field_titleItem(pd->scroller, &(itc_group_item), title, NULL);
#endif
+
+ return NULL;
};
-static void __link_list_cb(void *data, Evas_Object *obj, void *event_info)
+static void* __link_list_cb(void *data, Evas_Object *obj, void *event_info)
{
+ SETTING_TRACE_BEGIN;
ret_if(data == NULL);
retm_if(event_info == NULL, "Invalid argument: event info is NULL");
Elm_Object_Item *item = (Elm_Object_Item *) event_info;
snprintf(file, sizeof(file), "%s/%s", PLUGIN_CFG_DIR, link_file);
SETTING_TRACE("file:%s", file);
- setting_plugin_load(file);
+ PluginNode* plugin_node = setting_plugin_create();
+ setting_plugin_load(plugin_node, (const char *)file);
+
+ //setting_plugin_load(NULL, file);
+
+ return NULL;
+}
+
+static void* __launch_list_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ SETTING_TRACE_BEGIN;
+ ret_if(data == NULL);
+ retm_if(event_info == NULL, "Invalid argument: event info is NULL");
+ Elm_Object_Item *item = (Elm_Object_Item *) event_info;
+ elm_genlist_item_selected_set(item, 0);
+ Setting_GenGroupItem_Data *list_item =
+ (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
+
+ xmlNode* xmlObj = data;
+ ret_if(!xmlObj);
+ const char *key_str = (char*)xmlGetProp(xmlObj, "id");
+ const char *title_str = (char*)xmlGetProp(xmlObj, "title");
+ const char *appid_str = (char*)xmlGetProp(xmlObj, "appid");
+ const char *operation_str = (char*)xmlGetProp(xmlObj, "operation");
+
+
+ service_h svc = NULL;
+ service_create(&svc);
+ service_set_app_id(svc, appid_str); // xml property – appid
+ service_set_operation(svc, operation_str); // property : operation
+ service_send_launch_request(svc, NULL, NULL);
+ service_destroy(svc);
+
+ return NULL;
}
+static void* label_func(void *data, xmlNode *xmlObj)
+{
+ SETTING_TRACE_BEGIN;
+ ret_if(!data || !xmlObj);
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
+
+ const char *title = (char*)xmlGetProp(xmlObj, "title");
-static void link_func(void *data, xmlNode *xmlObj)
+ Setting_GenGroupItem_Data *obj =
+ setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
+ NULL,
+ xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
+ 0, title, NULL, NULL);
+
+ return obj;
+}
+
+static void* link_func(void *data, xmlNode *xmlObj)
{
SETTING_TRACE_BEGIN;
ret_if(!data || !xmlObj);
- Draw_Data *pd = data;
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
+
const char *key_str = (char*)xmlGetProp(xmlObj, "id");
+ Setting_GenGroupItem_Data * obj =
+ setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
+ __link_list_cb,
+ xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
+ 0, key_str, NULL, NULL);
- setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
- __link_list_cb,
- xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
- 0, key_str, NULL, NULL);
+ return (void*)obj;
};
+static void* launch_func(void *data, xmlNode *xmlObj)
+{
+ SETTING_TRACE_BEGIN;
+ ret_if(!data || !xmlObj);
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
+
+ const char *title_str = (char*)xmlGetProp(xmlObj, "title");
+
+ Setting_GenGroupItem_Data * obj =
+ setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
+ __launch_list_cb,
+ xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
+ 0, title_str, NULL, NULL);
+
+ return (void*)obj;
+};
static void __slider_stop_cb(void *data, Evas_Object *obj,
void *event_info)
}
-static void slider_func(void *data, xmlNode *xmlObj)
+static void* slider_func(void *data, xmlNode *xmlObj)
{
SETTING_TRACE_BEGIN;
ret_if(!data || !xmlObj);
- Draw_Data *pd = data;
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
// type casting
const char *title = (char*)xmlGetProp(xmlObj, "title");
list_item->stop_change_cb = __slider_stop_cb;
list_item->belongs_to = (int)pd;
}
-};
+ g_list_item = list_item;
+
+ return (void*)list_item;
+};
-static void navigationbar_func(void *data, xmlNode *xmlObj)
+/*
+ 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 = data;
+
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
//----------------------------------------------------------------
// [DATA] title, btn[0], btn[1]
{
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;
_(title),
_(btn[1]), _(btn[0]),
___click_softkey_back_cb,
- ___click_softkey_back_cb, pd, &pd->scroller,
+ ___click_softkey_back_cb, data, &pd->scroller,
&(pd->navi_bar));
+
+#endif
+ return NULL;
};
const char *id = (char*)xmlGetProp(xmlObj, "id");
const char *title = (char*)xmlGetProp(xmlObj, "title");
- SETTING_TRACE(" >>>> id:%s , title:%s", id, title);
+ //SETTING_TRACE(" >>>> id:%s , title:%s", id, title);
__send_int_msg(xmlObj, list_item->chk_status);
__cfg_file_write((Draw_Data *)list_item->belongs_to);
return;
}
-static void checkbox_func(void *data, xmlNode *xmlObj)
+static void* checkbox_func(void *data, xmlNode *xmlObj)
{
SETTING_TRACE_BEGIN;
ret_if(!data || !xmlObj);
- Draw_Data *pd = data;
+
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
// [DATA] title, value
const char *title = (char*)xmlGetProp(xmlObj, "title");
list_item->belongs_to = (int) pd;
SETTING_TRACE("pd:%p,list_item->belongs_to:%d", pd, list_item->belongs_to);
}
-};
+
+ return list_item;
+}
static void __entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
xmlNode* xmlObj = list_item->userdata;
ret_if(!xmlObj);
xmlAttrPtr newattr;
- const char *title = (char*)xmlSetProp(xmlObj, "string",entry_str_utf8);
+ const char *title = (char*)xmlSetProp(xmlObj, "value",entry_str_utf8);
__send_string_msg(xmlObj, entry_str_utf8);
__cfg_file_write((Draw_Data *)list_item->belongs_to);
}
-static void editbox_func(void *data, xmlNode *xmlObj)
+static void* editbox_func(void *data, xmlNode *xmlObj)
{
SETTING_TRACE_BEGIN;
ret_if(!data || !xmlObj);
- Draw_Data *pd = data;
+
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
const char *title = (char*)xmlGetProp(xmlObj, "title");
- const char *key_str= (char*)xmlGetProp(xmlObj, "string");
+ 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,
list_item->stop_change_cb = __entry_unfocus_cb;
list_item->belongs_to = (int)pd;
}
+
+ return list_item;
};
ret_if(!xmlObj);
xmlAttrPtr newattr;
- newattr = xmlSetProp(xmlObj, "string", data_parentItem->sub_desc);
+ //newattr = xmlSetProp(xmlObj, "string", data_parentItem->sub_desc);
+ newattr = xmlSetProp(xmlObj, "value", data_parentItem->sub_desc);
__send_string_msg(xmlObj, data_parentItem->sub_desc);
__cfg_file_write((Draw_Data *)data_parentItem->belongs_to);
{
ret_if(NULL == data || NULL == event_info);
SETTING_TRACE_BEGIN;
- Draw_Data *pd = data;
+
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
+
Elm_Object_Item *parentItem = event_info; /* parent item */
Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
Evas_Object *scroller = elm_object_item_widget_get(parentItem);
+
xmlNode *xmlObj = data_parentItem->userdata;
- char *value = (char*)xmlGetProp(xmlObj, "string");
+ //char *value = (char*)xmlGetProp(xmlObj, "string");
+ char *value = (char*)xmlGetProp(xmlObj, "value");
+ SETTING_TRACE(">>> value = %s", value);
int i=0;
Evas_Object *rgd = NULL;
type = (char*)xmlGetProp(cur, "type");
if (0 == safeStrCmp(type, "radio")) {
subitem_title = (char*)xmlGetProp(cur, "title");
- setting_create_Gendial_exp_sub_field(scroller,
- &(itc_1icon_1text_sub),
- __expanditem_func_sel_cb, NULL, parentItem,
- SWALLOW_Type_1RADIO, rgd,
- subitem_index,
- subitem_title, NULL);
+ Setting_GenGroupItem_Data *list_item =
+ setting_create_Gendial_exp_sub_field(scroller,
+ &(itc_1icon_1text_sub),
+ __expanditem_func_sel_cb, NULL, parentItem,
+ SWALLOW_Type_1RADIO, rgd,
+ subitem_index,
+ subitem_title, NULL);
+
+ // SETTING_TRACE(">>> value = %s, subitem_title = %s ", value, subitem_title);
+
if (0 == safeStrCmp(value, subitem_title)) {
sel_idx = subitem_index;
+ SETTING_TRACE("%d is selected in Radio Group", sel_idx);
}
+ data_parentItem->childs = eina_list_append(data_parentItem->childs, list_item);
subitem_index++;
+
} else {
SETTING_TRACE("invalid type[:%s]", type);
}
}
-static void settings_func(void *data, xmlNode *xmlObj)
+static void* settings_func(void *data, xmlNode *xmlObj)
{
- // DO NOTHING
+ return NULL;
}
// <setting>
-static void setting_func(void *data, xmlNode *xmlObj)
+static void* setting_func(void *data, xmlNode *xmlObj)
{
- // DO NOTHING
+ SETTING_TRACE_BEGIN;
+ ret_if(!data || !xmlObj);
+
+#if 1/*{{{*/
+ //Draw_Data *pd = node->pd;
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
+
+ //----------------------------------------------------------------
+ // [DATA] title, btn[0], btn[1]
+ const char *title = (char*)xmlGetProp(xmlObj, "title");
+ char *btn[2] = {/* 0 */"OK", /* 1 */"NO"};
+
+ // 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
+ //----------------------------------------------------------------
+ SETTING_TRACE("before setting_create_layout_navi_bar_genlist");
+ // [UI] with DATA
+ 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 */
+
+ /* Enabling illume notification property for window */
+ elm_win_conformant_set(pd->win_get, 1);
+ Evas_Object *conformant = elm_conformant_add(pd->win_get);
+ elm_object_style_set(conformant, "internal_layout"); /* By Kollus. 2011-01-04 */
+ evas_object_show(conformant);
+ elm_object_content_set(conformant, pd->scroller);
+
+ SETTING_TRACE("_(title):%s", _(title));
+ pd->ly_main =
+ setting_create_layout_navi_bar(pd->win_get, pd->win_get,
+ _(title),
+ _("IDS_COM_BODY_BACK"), NULL, NULL,
+ ___click_softkey_back_cb,
+ NULL, NULL,
+ data, conformant,
+ &(pd->navi_bar), NULL);
+ SETTING_TRACE("after setting_create_layout_navi_bar_genlist");
+
+#endif/*}}}*/
+ return NULL;
}
-static void expanditem_func(void *data, xmlNode *xmlObj)
+static void* expanditem_func(void *data, xmlNode *xmlObj)
{
// DO NOTHING - expandlist draws this area
-};
-
+ return NULL;
+}
-static void expandlist_func(void *data, xmlNode *xmlObj)
+static void* expandlist_func(void *data, xmlNode *xmlObj)
{
SETTING_TRACE_BEGIN;
ret_if(!data || !xmlObj);
- Draw_Data *pd = data;
+
+ PluginNode* node = (PluginNode*)data;
+ Draw_Data *pd = node->pd;
+
const char *key_str = (char*)xmlGetProp(xmlObj, "title");
const char *value = (char*)xmlGetProp(xmlObj, "value"); // string -> value
- setting_enable_expandable_genlist(pd->scroller, pd, __expanditem_func_exp_cb, __expanditem_func_smart_cb);
+ setting_enable_expandable_genlist(pd->scroller, data, __expanditem_func_exp_cb, __expanditem_func_smart_cb);
Setting_GenGroupItem_Data *list_item =
setting_create_Gendial_exp_parent_field(pd->scroller,
&(itc_2text_3_parent),
list_item->userdata = xmlObj;
list_item->belongs_to = (int)pd;
}
-};
+
+ return list_item;
+}
+
-/////////////
-static int __node_walker(Draw_Data *pd, xmlNode* cur)
+static int __node_walker(PluginNode* context, xmlNode* cur)
{
//SETTING_TRACE_BEGIN;
+ Draw_Data *pd = context->pd;
+
retv_if(!pd, -1);
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)
- fp(pd, cur_node); // draw it
+ {
+ // type check
+ void* vret = fp(context, cur_node); // draw it
+
+ if (vret)
+ {
+ Setting_GenGroupItem_Data* genlist_node = (Setting_GenGroupItem_Data* )vret;
+ //SETTING_TRACE("add node to Eina List name : %s, id : ", cur_node->name, xmlGetProp(cur_node, "id"));
+ // add it to the hash table create before.
+ // id, object
+ // add list
+ char* key_name = xmlGetProp(cur_node, "id");
+ eina_hash_add(context->ui_list, strdup(key_name),(void*)genlist_node);
+ }
+ }
+ }
+ __node_walker(context, cur_node->children); /* RECURSIVE */
+ }
+ return 0;
+}
+
+/**
+ * @param id_str [in] "id"
+ * @param value [in] value to be udpated
+ * @see __expanditem_func_sel_cb
+ */
+static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end)
+{
+ SETTING_TRACE_BEGIN;
+ xmlNode *cur_node = NULL;
+
+ if (*is_end == true) return 0;
+
+ for (cur_node = cur; cur_node;cur_node = cur_node->next) {
+ if (cur_node->type == XML_ELEMENT_NODE) {
+
+ char* id_name = (char*)xmlGetProp(cur_node, "id");
+ if ( id_name && 0 == strcmp(id_str, id_name))
+ {
+ SETTING_TRACE("FOUND >>>> %s", id_name);
+ // cur_node - update xml code
+ xmlAttrPtr newattr = xmlSetProp(cur_node, "value", value);
+
+ //-----------------------------------------------------------
+ // UI UPDATE
+ // case : slider
+ if ( 0 == strcmp (cur_node->name, "integer"))
+ {
+ SETTING_TRACE(">>>>> UPDATE SLIDER CONTROL %x --- %s ",context->ui_list, id_name);
+ Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
+ if (item_to_update)
+ {
+ item_to_update->chk_status = atoi(value);
+ SETTING_TRACE(">>> o-------------0 SLIDER VALUE = %d ", item_to_update->chk_status);
+
+ elm_object_item_data_set(item_to_update->item, item_to_update);
+ elm_genlist_item_update(item_to_update->item);
+ } else {
+ SETTING_TRACE("item_to_update is NULL");
+ }
+ }
+ // case : toggle
+ if ( 0 == strcmp (cur_node->name, "bool"))
+ {
+ SETTING_TRACE(">>>>> UPDATE TOGGLE CONTROL %x --- %s ",context->ui_list, id_name);
+ Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
+ if (item_to_update)
+ {
+ item_to_update->chk_status = atoi(value);
+ SETTING_TRACE(">>> o-------------0 TOGGLE VALUE = %d ", item_to_update->chk_status);
+
+ elm_object_item_data_set(item_to_update->item, item_to_update);
+ elm_genlist_item_update(item_to_update->item);
+ } else {
+ SETTING_TRACE("item_to_update is NULL");
+ }
+ }
+ // case : edit control
+ if ( 0 == strcmp (cur_node->name, "string"))
+ {
+ SETTING_TRACE(">>>>> UPDATE EDIT CONTROL CONTROL %x --- %s ",context->ui_list, id_name);
+ Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
+ if (item_to_update)
+ {
+ char* old_string = item_to_update->sub_desc;
+ item_to_update->sub_desc = strdup(value);
+ SETTING_TRACE(">>> o-------------0 STRING VALUE = %s ", value);
+
+ // free old string
+
+ elm_object_item_data_set(item_to_update->item, item_to_update);
+ elm_genlist_item_update(item_to_update->item);
+
+ } else {
+ SETTING_TRACE("item_to_update is NULL");
+ }
+ }
+ // case : expand list
+ // parent
+ // child1
+ // child2
+ // child3
+ // child4
+ //-----------------------------------------------------------
+ if ( 0 == strcmp (cur_node->name, "expandlist"))
+ {
+ SETTING_TRACE(">>>>> UPDATE EXPAND LIST CONTROL %x --- %s ",context->ui_list, id_name);
+ Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
+ if (item_to_update)
+ {
+ char* old_string = item_to_update->sub_desc;
+ item_to_update->sub_desc = strdup(value);
+ SETTING_TRACE(">>> o-------------0 EXPAND LIST VALUE = %s ", value);
+
+ // free old string
+ // string update
+ elm_object_item_data_set(item_to_update->item, item_to_update);
+ elm_genlist_item_update(item_to_update->item);
+
+ // TODO: need to update child elements
+ // item_to_update->childs ---> expanded list
+ if (item_to_update->childs)
+ {
+ Eina_List *li = item_to_update->childs;
+ int radio_index = 0;
+ while(li)
+ {
+ Setting_GenGroupItem_Data* node = eina_list_data_get(li);
+ // do something more
+ // SETTING_TRACE(">>> RADIO LIST STRING VALUE = %s ", node->keyStr);
+ // set position of radio button
+ if (strcmp(node->keyStr, value) == 0)
+ {
+ elm_radio_value_set(node->rgd, radio_index);
+ }
+ elm_object_item_data_set(item_to_update->item, item_to_update);
+ elm_genlist_item_update(item_to_update->item);
+
+ // go next
+ li = eina_list_next(li);
+ radio_index++;
+ }
+
+ }
+ } else {
+ SETTING_TRACE("item_to_update is NULL");
+ }
+ }
+
+ *is_end = true;
+ }
}
- __node_walker(pd, cur_node->children); /* RECURSIVE */
+ __node_finder(context, cur_node->children, id_str, value, is_end); /* RECURSIVE */
}
return 0;
}
+static unsigned int _plugin_string_key_length(const char*key)
+{
+ if (!key)
+ return 0;
+
+ return (int)strlen(key) + 1;
+}
+
+static int _plugin_string_key_cmp(const char* key1, int key1_length,
+ const char* key2, int key2_length)
+{
+ return strcmp(key1, key2);
+}
+
+static void _plugin_entry_free_cb(void* data)
+{
+ Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
+ if (node->childs)
+ {
+ eina_list_free(node->childs);
+ node->childs = NULL;
+ }
+}
+
+//static PluginNode* g_context;
+
+PluginNode* setting_plugin_create()
+{
+ PluginNode *node = calloc(1, sizeof(PluginNode));
+
+ Draw_Data *pd = calloc(1, sizeof(Draw_Data));
+ setting_retvm_if(!pd, -1, "Create Draw_Data obj failed");
+ //eina_init();
+
+ node->pd = pd;
+ node->ui_list = eina_hash_new(EINA_KEY_LENGTH(_plugin_string_key_length),
+ EINA_KEY_CMP(_plugin_string_key_cmp),
+ EINA_KEY_HASH(eina_hash_superfast),
+ _plugin_entry_free_cb,
+ 5); // 2^5
+
+ return node;
+}
+
+void setting_plugin_destroy(PluginNode* node)
+{
+ SETTING_TRACE_BEGIN;
+ if (node) {
+ SETTING_TRACE("node is NOT NULL")
+ if (node->pd) {
+ SETTING_TRACE("node->pd is NOT NULL")
+ if(node->pd->doc != NULL) {
+ xmlSaveFormatFile(node->plugin_path, node->pd->doc, 1);
+ xmlFreeDoc(node->pd->doc);
+ node->pd->doc = NULL;
+ SETTING_TRACE("__cfg_file_write successful");
+ }
+
+ free(node->pd);
+ node->pd = NULL;
+ }
+
+ if (node->ui_list) {
+ eina_hash_free(node->ui_list);
+ node->ui_list = NULL;
+ }
+ free(node);
+ node = NULL;
+ }
+}
+
+
+static Eina_Bool _plugin_foreach_cb(const Eina_Hash *hash, const void*key, void* data, void* fdata)
+{
+ Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
+ SETTING_TRACE("%s --- %s ", (char*)key, node->keyStr);
+ return EINA_TRUE;
+}
+
+
+void setting_plugin_debug(PluginNode* context)
+{
+// SETTING_TRACE("HASH TABLE -------------------------------------");
+ eina_hash_foreach(context->ui_list,_plugin_foreach_cb, NULL);
+// SETTING_TRACE("HASH TABLE -------------------------------------");
+
+}
+
+void setting_plugin_update(PluginNode* context)
+{
+ Eina_List *li = context->ui_list;
+
+ while (li) {
+ Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) eina_list_data_get(li);
+ if (node) {
+ // SETTING_TRACE(" ---> keyStr : %s , swallow type : %d ", node->keyStr, node->swallow_type);
+ Setting_GenGroupItem_Data* item_to_update = NULL;
+ item_to_update = node;
+ elm_object_item_data_set(item_to_update->item, item_to_update);
+ elm_genlist_item_update(item_to_update->item);
+ }
+ li = eina_list_next(li);
+ }
+}
+
-bool setting_plugin_load(const char *cfg_file)
+bool setting_plugin_load(PluginNode* context, const char *cfg_file)
{
SETTING_TRACE("cfg_file:%s", cfg_file)
if (isEmptyStr(cfg_file) || 0 != access(cfg_file, R_OK|W_OK|F_OK ))
SETTING_TRACE_ERROR(" error occured : access \n");
return FALSE;
}
+ context->pd->cfg_file = cfg_file;
+ context->pd->win_get = (Evas_Object *) ug_get_window();
- Draw_Data *pd = calloc(1, sizeof(Draw_Data));
- setting_retvm_if(!pd, -1, "Create Draw_Data obj failed");
-
- pd->cfg_file = cfg_file;
- pd->win_get = (Evas_Object *) ug_get_window();
GError *error = NULL;
- pd->doc = xmlParseFile(cfg_file);
- pd->root = xmlDocGetRootElement(pd->doc);
+ context->pd->doc = xmlParseFile(cfg_file);
+ context->pd->root = xmlDocGetRootElement(context->pd->doc);
+
// TODO: error handler here
- __node_walker(pd, pd->root);
+ __node_walker(context, context->pd->root);
- return TRUE;
+ // debug message
+ setting_plugin_debug(context);
+ return true;
}