summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Lima (Etrunko) <eduardo.lima@intel.com>2014-10-23 15:31:31 -0200
committerEduardo Lima (Etrunko) <eduardo.lima@intel.com>2014-10-27 18:47:24 -0200
commite07048baac4bac3515507c6577b96671c90a7b7a (patch)
treea5c6f770eca0fe4a5be089fed957913f0d3fed93
parent506785a6d61ad0ddf43e567b35696c3012aae00f (diff)
downloadweekeyboard-e07048baac4bac3515507c6577b96671c90a7b7a.tar.gz
weekeyboard-e07048baac4bac3515507c6577b96671c90a7b7a.tar.bz2
weekeyboard-e07048baac4bac3515507c6577b96671c90a7b7a.zip
Refactor config_eet to store more than one toplevel section
Change-Id: I4e2799104d28424514d3327700fac5a6419bc933 Signed-off-by: Eduardo Lima (Etrunko) <eduardo.lima@intel.com>
-rw-r--r--src/wkb-ibus-config-eet.c185
-rw-r--r--src/wkb-ibus-config-eet.h3
2 files changed, 137 insertions, 51 deletions
diff --git a/src/wkb-ibus-config-eet.c b/src/wkb-ibus-config-eet.c
index 27c79e2..84998c7 100644
--- a/src/wkb-ibus-config-eet.c
+++ b/src/wkb-ibus-config-eet.c
@@ -49,6 +49,7 @@ struct _config_section
Eina_List *keys;
Eina_List *subsections;
Eet_Data_Descriptor *edd;
+ struct _config_section *parent;
void (*set_defaults)(struct _config_section *);
};
@@ -111,6 +112,15 @@ _config_section_find(struct _config_section *base, const char *section)
return ret;
}
+static struct _config_section *
+_config_section_toplevel(struct _config_section *base)
+{
+ while (base->parent != NULL)
+ base = base->parent;
+
+ return base;
+}
+
static struct wkb_config_key *
_config_section_find_key(struct _config_section *base, const char *section, const char *name)
{
@@ -142,18 +152,21 @@ end:
#define _config_section_init(_section, _id, _parent) \
do { \
- struct _config_section *_p = _parent; \
if (!_section) \
break; \
_section->set_defaults = _config_ ## _id ## _set_defaults; \
- if (_p) \
+ _section->parent = _parent; \
_section->edd = _ ## _id ## _edd; \
+ if (!_section->parent) \
+ _section->id = eina_stringshare_add(#_id); \
+ else \
{ \
- if (_p->id) \
- _section->id = eina_stringshare_printf("%s/" #_id, _p->id); \
- else \
+ if (!_section->parent->parent) \
+ /* do not use parent id if it is toplevel */ \
_section->id = eina_stringshare_add(#_id); \
- _p->subsections = eina_list_append(_p->subsections, _section); \
+ else \
+ _section->id = eina_stringshare_printf("%s/" #_id, _section->parent->id); \
+ _section->parent->subsections = eina_list_append(_section->parent->subsections, _section); \
} \
_config_ ## _id ## _section_init(_section); \
} while (0)
@@ -764,8 +777,8 @@ struct wkb_ibus_config_eet
{
const char *path;
Eldbus_Service_Interface *iface;
- struct _config_section *ibus_config;
-
+ Eina_List *sections;
+ Eet_File *file;
};
static void
@@ -784,31 +797,98 @@ _config_eet_value_changed(struct wkb_ibus_config_eet *config_eet, const char *se
eldbus_service_signal_send(config_eet->iface, signal);
}
+struct wkb_config_key *
+wkb_ibus_config_eet_find_key(struct wkb_ibus_config_eet *config_eet, const char *section, const char *name)
+{
+ struct wkb_config_key *key;
+ struct _config_section *sec;
+ Eina_List *node;
+
+ EINA_LIST_FOREACH(config_eet->sections, node, sec)
+ if ((key = _config_section_find_key(sec, section, name)))
+ return key;
+
+ return NULL;
+}
+
+static struct _config_section *
+wkb_ibus_config_section_find(struct wkb_ibus_config_eet *config_eet, const char *section)
+{
+ struct _config_section *sec, *s;
+ Eina_List *node;
+
+ EINA_LIST_FOREACH(config_eet->sections, node, s)
+ if((sec = _config_section_find(s, section)))
+ return sec;
+
+ return NULL;
+}
+
+static Eina_Bool
+wkb_ibus_config_section_write(struct wkb_ibus_config_eet *config_eet, struct _config_section *section)
+{
+ Eina_Bool ret = EINA_TRUE;
+
+ if (!eet_data_write(config_eet->file, section->edd, section->id, section, EINA_TRUE))
+ {
+ ERR("Error writing section '%s' to Eet file '%s'", section->id, config_eet->path);
+ ret = EINA_FALSE;
+ }
+
+ DBG("Wrote section '%s' to Eet file '%s'", section->id, config_eet->path);
+ return ret;
+}
+
+#define wkb_ibus_config_section_read(_eet, _id) \
+ do { \
+ struct _config_section *sec = NULL; \
+ if (!(sec = eet_data_read(_eet->file, _ ## _id ## _edd, #_id))) \
+ { \
+ INF("Error reading section '%s' from Eet file '%s'. Adding.", #_id , _eet->path); \
+ sec = _config_ ## _id ## _new(); \
+ _config_section_set_defaults(sec); \
+ _eet->sections = eina_list_append(_eet->sections, sec); \
+ wkb_ibus_config_section_write(_eet, sec); \
+ } \
+ else \
+ { \
+ DBG("Read section '%s' from Eet file '%s'", #_id , _eet->path); \
+ _config_section_init(sec, _id, NULL); \
+ _eet->sections = eina_list_append(_eet->sections, sec); \
+ } \
+ } while (0)
+
Eina_Bool
wkb_ibus_config_eet_set_value(struct wkb_ibus_config_eet *config_eet, const char *section, const char *name, Eldbus_Message_Iter *value)
{
Eina_Bool ret = EINA_FALSE;
struct wkb_config_key *key;
+ struct _config_section *sec, *top;
- if (!(key = _config_section_find_key(config_eet->ibus_config, section, name)))
+ if (!(sec = wkb_ibus_config_section_find(config_eet, section)))
{
- ERR("Config key with id '%s' not found", name);
+ ERR("Config section '%s' not found", section);
goto end;
}
- if ((ret = wkb_config_key_set(key, value)))
+ if (!(key = _config_section_find_key(sec, section, name)))
{
- Eet_File *ef = eet_open(config_eet->path, EET_FILE_MODE_WRITE);
- if (!ef || !eet_data_write(ef, _ibus_edd, "ibus", config_eet->ibus_config, EINA_TRUE))
- {
- // FIXME
- ERR("Error writing Eet file '%s'", config_eet->path);
- ret = EINA_FALSE;
- }
- eet_close(ef);
- _config_eet_value_changed(config_eet, section, name, value);
+ ERR("Config key '%s' not found", name);
+ goto end;
+ }
+
+ if (!(ret = wkb_config_key_set(key, value)))
+ {
+ ERR("Error setting new value for key '%s'", wkb_config_key_id(key));
+ goto end;
}
+ _config_eet_value_changed(config_eet, section, name, value);
+
+ top = _config_section_toplevel(sec);
+ ret = wkb_ibus_config_section_write(config_eet, top);
+ eet_sync(config_eet->file);
+
end:
return ret;
}
@@ -818,7 +898,7 @@ wkb_ibus_config_eet_get_value(struct wkb_ibus_config_eet *config_eet, const char
{
struct wkb_config_key *key;
- if (!(key = _config_section_find_key(config_eet->ibus_config, section, name)))
+ if (!(key = wkb_ibus_config_eet_find_key(config_eet, section, name)))
{
ERR("Config key with id '%s' not found", name);
return EINA_FALSE;
@@ -832,7 +912,7 @@ wkb_ibus_config_eet_get_value_int(struct wkb_ibus_config_eet *config_eet, const
{
struct wkb_config_key *key;
- if (!(key = _config_section_find_key(config_eet->ibus_config, section, name)))
+ if (!(key = wkb_ibus_config_eet_find_key(config_eet, section, name)))
{
ERR("Config key with id '%s' not found", name);
return -1;
@@ -848,7 +928,7 @@ wkb_ibus_config_eet_get_value_bool(struct wkb_ibus_config_eet *config_eet, const
{
struct wkb_config_key *key;
- if (!(key = _config_section_find_key(config_eet->ibus_config, section, name)))
+ if (!(key = wkb_ibus_config_eet_find_key(config_eet, section, name)))
{
ERR("Config key with id '%s' not found", name);
return EINA_FALSE;
@@ -864,7 +944,7 @@ wkb_ibus_config_eet_get_value_string(struct wkb_ibus_config_eet *config_eet, con
{
struct wkb_config_key *key;
- if (!(key = _config_section_find_key(config_eet->ibus_config, section, name)))
+ if (!(key = wkb_ibus_config_eet_find_key(config_eet, section, name)))
{
ERR("Config key with id '%s' not found", name);
return NULL;
@@ -880,7 +960,7 @@ wkb_ibus_config_eet_get_value_string_list(struct wkb_ibus_config_eet *config_eet
{
struct wkb_config_key *key;
- if (!(key = _config_section_find_key(config_eet->ibus_config, section, name)))
+ if (!(key = wkb_ibus_config_eet_find_key(config_eet, section, name)))
{
ERR("Config key with id '%s' not found", name);
return NULL;
@@ -900,7 +980,7 @@ wkb_ibus_config_eet_get_values(struct wkb_ibus_config_eet *config_eet, const cha
Eina_List *node;
Eldbus_Message_Iter *dict, *entry;
- if (!(sec = _config_section_find(config_eet->ibus_config, section)))
+ if (!(sec = wkb_ibus_config_section_find(config_eet, section)))
{
ERR("Config section with id '%s' not found", section);
goto end;
@@ -927,11 +1007,16 @@ end:
void
wkb_ibus_config_eet_set_defaults(struct wkb_ibus_config_eet *config_eet)
{
- if (config_eet->ibus_config)
- _config_section_free(config_eet->ibus_config);
+ struct _config_section *sec;
+ Eina_List *node;
- config_eet->ibus_config = _config_ibus_new();
- _config_section_set_defaults(config_eet->ibus_config);
+ EINA_LIST_FREE(config_eet->sections, sec)
+ _config_section_free(sec);
+
+ config_eet->sections = eina_list_append(config_eet->sections, _config_ibus_new());
+
+ EINA_LIST_FOREACH(config_eet->sections, node, sec)
+ _config_section_set_defaults(sec);
}
static struct wkb_ibus_config_eet *
@@ -962,43 +1047,40 @@ struct wkb_ibus_config_eet *
wkb_ibus_config_eet_new(const char *path, Eldbus_Service_Interface *iface)
{
struct wkb_ibus_config_eet *eet = _config_eet_init(path, iface);
- Eet_File *ef = NULL;
- Eet_File_Mode mode = EET_FILE_MODE_READ_WRITE;
- if (_config_eet_exists(path))
- mode = EET_FILE_MODE_READ;
-
- if (!(ef = eet_open(path, mode)))
+ if (!(eet->file = eet_open(eet->path, EET_FILE_MODE_READ_WRITE)))
{
- ERR("Error opening eet file '%s' for %s", path, mode == EET_FILE_MODE_READ ? "read" : "write");
- wkb_ibus_config_eet_free(eet);
- return NULL;
+ ERR("Error opening Eet file '%s'", eet->path);
+ return EINA_FALSE;
}
- if (mode == EET_FILE_MODE_READ)
+ if (!_config_eet_exists(path))
{
- eet->ibus_config = eet_data_read(ef, _ibus_edd, "ibus");
- _config_ibus_section_init(eet->ibus_config);
+ Eina_List *node;
+ struct _config_section *sec;
+
+ wkb_ibus_config_eet_set_defaults(eet);
+ EINA_LIST_FOREACH(eet->sections, node, sec)
+ wkb_ibus_config_section_write(eet, sec);
+
goto end;
}
- wkb_ibus_config_eet_set_defaults(eet);
- if (!eet_data_write(ef, _ibus_edd, "ibus", eet->ibus_config, EINA_TRUE))
- {
- ERR("Error creating eet file '%s'", path);
- wkb_ibus_config_eet_free(eet);
- eet = NULL;
- }
+ wkb_ibus_config_section_read(eet, ibus);
end:
- eet_close(ef);
+ eet_sync(eet->file);
return eet;
}
void
wkb_ibus_config_eet_free(struct wkb_ibus_config_eet *config_eet)
{
- _config_section_free(config_eet->ibus_config);
+ struct _config_section *sec;
+
+ EINA_LIST_FREE(config_eet->sections, sec)
+ _config_section_free(sec);
+
eina_stringshare_del(config_eet->path);
eet_data_descriptor_free(_hotkey_edd);
@@ -1015,6 +1097,7 @@ wkb_ibus_config_eet_free(struct wkb_ibus_config_eet *config_eet)
_engine_edd = NULL;
_ibus_edd = NULL;
+ eet_close(config_eet->file);
free(config_eet);
}
diff --git a/src/wkb-ibus-config-eet.h b/src/wkb-ibus-config-eet.h
index e47a138..eeb7205 100644
--- a/src/wkb-ibus-config-eet.h
+++ b/src/wkb-ibus-config-eet.h
@@ -26,6 +26,9 @@ extern "C" {
#endif
struct wkb_ibus_config_eet;
+struct wkb_config_key;
+
+struct wkb_config_key *wkb_ibus_config_eet_find_key(struct wkb_ibus_config_eet *config_eet, const char *section, const char *name);
Eina_Bool wkb_ibus_config_eet_set_value(struct wkb_ibus_config_eet *config_eet, const char *section, const char *name, Eldbus_Message_Iter *value);
Eina_Bool wkb_ibus_config_eet_get_value(struct wkb_ibus_config_eet *config_eet, const char *section, const char *name, Eldbus_Message_Iter *reply);