summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2008-04-15 20:53:37 +0000
committerSergey Udaltsov <svu@gnome.org>2008-04-15 20:53:37 +0000
commitc2c6316f2f23e87f6f1d7335ac12dbbb16a404a2 (patch)
tree1308b2cc19c68adfea31bf87e2ab48997a619605
parent3be5407e80f5cf3994af63f2f0478c4bb46a9484 (diff)
downloadlibxklavier-c2c6316f2f23e87f6f1d7335ac12dbbb16a404a2.tar.gz
processing language lists
-rw-r--r--ChangeLog5
-rw-r--r--libxklavier/xkl_config_item.h7
-rw-r--r--libxklavier/xklavier_config.c98
-rw-r--r--tests/test_config.c6
4 files changed, 75 insertions, 41 deletions
diff --git a/ChangeLog b/ChangeLog
index eac1ee3..b6be0b8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-04-15 svu
+
+ * libxklavier/xkl_config_item.h, libxklavier/xklavier_config.c,
+ tests/test_config.c: processing the language lists
+
2008-04-14 svu
* configure.in, libxklavier/xkl_config_item.h,
diff --git a/libxklavier/xkl_config_item.h b/libxklavier/xkl_config_item.h
index 0e72579..6535b95 100644
--- a/libxklavier/xkl_config_item.h
+++ b/libxklavier/xkl_config_item.h
@@ -90,11 +90,16 @@ extern "C" {
#define XCI_PROP_VENDOR "vendor"
/**
- * Extra property for the XklConfigItem, defining the list of countryes (used for layouts/variants)
+ * Extra property for the XklConfigItem, defining the list of countries (used for layouts/variants)
*/
#define XCI_PROP_COUNTRY_LIST "countryList"
/**
+ * Extra property for the XklConfigItem, defining the list of languages (used for layouts/variants)
+ */
+#define XCI_PROP_LANGUAGE_LIST "languageList"
+
+/**
* The XklConfigItem class, derived from GObject
*/
struct _XklConfigItemClass {
diff --git a/libxklavier/xklavier_config.c b/libxklavier/xklavier_config.c
index b961f90..3620066 100644
--- a/libxklavier/xklavier_config.c
+++ b/libxklavier/xklavier_config.c
@@ -46,7 +46,9 @@ static xmlXPathCompExprPtr option_groups_xpath;
#define XML_TAG_SHORT_DESCR "shortDescription"
#define XML_TAG_VENDOR "vendor"
#define XML_TAG_COUNTRY_LIST "countryList"
+#define XML_TAG_LANGUAGE_LIST "languageList"
#define XML_TAG_ISO3166ID "iso3166Id"
+#define XML_TAG_ISO639ID "iso639Id"
// gettext domain for translations
#define XKB_DOMAIN "xkeyboard-config"
@@ -109,16 +111,61 @@ xkl_find_nonlocalized_element(xmlNodePtr ptr, const gchar * tag_name)
}
static gboolean
+xkl_item_populate_optional_array(XklConfigItem * item, xmlNodePtr ptr,
+ const gchar list_tag[],
+ const gchar element_tag[],
+ const gchar property_name[])
+{
+ xmlNodePtr top_list_element =
+ xkl_find_nonlocalized_element(ptr, list_tag), element_ptr;
+ gint n_elements, idx;
+ gchar **elements = NULL;
+
+ if (top_list_element == NULL || top_list_element->children == NULL)
+ return FALSE;
+
+ n_elements = 0;
+
+ /* First, count countries */
+ element_ptr = top_list_element->children;
+ while (NULL !=
+ (element_ptr =
+ xkl_find_nonlocalized_element(element_ptr, element_tag))) {
+ n_elements++;
+ element_ptr = element_ptr->next;
+ }
+
+ if (n_elements == 0)
+ return FALSE;
+
+ elements = g_new0(gchar *, n_elements);
+ /* Then, actually, populate the list */
+ element_ptr = top_list_element->children;
+ for (idx = 0;
+ NULL != (element_ptr =
+ xkl_find_nonlocalized_element
+ (element_ptr, element_tag));
+ element_ptr = element_ptr->next, idx++) {
+ elements[idx] =
+ g_strdup((const char *) element_ptr->
+ children->content);
+ }
+
+ g_object_set_data_full(G_OBJECT(item),
+ property_name, elements, (GDestroyNotify)
+ g_strfreev);
+ return TRUE;
+}
+
+static gboolean
xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr,
XklConfigItem * item)
{
xmlNodePtr name_element, ptr;
xmlNodePtr desc_element = NULL, short_desc_element =
- NULL, vendor_element = NULL, country_list_element =
- NULL, country_ptr = NULL;
+ NULL, vendor_element = NULL;
+
gchar *vendor = NULL;
- gchar **countries = NULL;
- gint n_countries, idx = 0;
*item->name = 0;
*item->short_description = 0;
@@ -126,6 +173,7 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr,
g_object_set_data(G_OBJECT(item), XCI_PROP_VENDOR, NULL);
g_object_set_data(G_OBJECT(item), XCI_PROP_COUNTRY_LIST, NULL);
+ g_object_set_data(G_OBJECT(item), XCI_PROP_LANGUAGE_LIST, NULL);
if (!xkl_xml_find_config_item_child(iptr, &ptr))
return FALSE;
@@ -142,8 +190,6 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr,
desc_element = xkl_find_nonlocalized_element(ptr, XML_TAG_DESCR);
vendor_element =
xkl_find_nonlocalized_element(ptr, XML_TAG_VENDOR);
- country_list_element =
- xkl_find_nonlocalized_element(ptr, XML_TAG_COUNTRY_LIST);
if (name_element != NULL && name_element->children != NULL)
strncat(item->name,
@@ -174,40 +220,12 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr,
vendor, g_free);
}
- if (country_list_element != NULL
- && country_list_element->children != NULL) {
- n_countries = 0;
-
- /* First, count countries */
- country_ptr = country_list_element->children;
- while (NULL !=
- (country_ptr =
- xkl_find_nonlocalized_element(country_ptr,
- XML_TAG_ISO3166ID)))
- {
- n_countries++;
- country_ptr = country_ptr->next;
- }
-
- if (n_countries != 0) {
- countries = g_new0(gchar *, n_countries);
- /* Then, actually, populate the list */
- country_ptr = country_list_element->children;
- for (idx = 0;
- NULL != (country_ptr =
- xkl_find_nonlocalized_element
- (country_ptr, XML_TAG_ISO3166ID));
- country_ptr = country_ptr->next, idx++) {
- countries[idx] =
- g_strdup((const char *) country_ptr->
- children->content);
- }
- g_object_set_data_full(G_OBJECT(item),
- XCI_PROP_COUNTRY_LIST,
- countries, (GDestroyNotify)
- g_strfreev);
- }
- }
+ xkl_item_populate_optional_array(item, ptr, XML_TAG_COUNTRY_LIST,
+ XML_TAG_ISO3166ID,
+ XCI_PROP_COUNTRY_LIST);
+ xkl_item_populate_optional_array(item, ptr, XML_TAG_LANGUAGE_LIST,
+ XML_TAG_ISO639ID,
+ XCI_PROP_LANGUAGE_LIST);
return TRUE;
}
diff --git a/tests/test_config.c b/tests/test_config.c
index 76bc42f..2ef07b7 100644
--- a/tests/test_config.c
+++ b/tests/test_config.c
@@ -97,6 +97,8 @@ print_xci(XklConfigRegistry * config, const XklConfigItem * item,
{
gchar **countries = (gchar **) g_object_get_data(G_OBJECT(item),
XCI_PROP_COUNTRY_LIST);
+ gchar **languages = (gchar **) g_object_get_data(G_OBJECT(item),
+ XCI_PROP_LANGUAGE_LIST);
gint i;
printf("%*s[%s][%s][%s]\n", indent, "", item->name,
item->description, item->short_description);
@@ -104,6 +106,10 @@ print_xci(XklConfigRegistry * config, const XklConfigItem * item,
for (i = 0; i < g_strv_length(countries); i++)
printf("%*s country: [%s]\n", indent, "",
countries[i]);
+ if (languages != NULL)
+ for (i = 0; i < g_strv_length(languages); i++)
+ printf("%*s language: [%s]\n", indent, "",
+ languages[i]);
}
static void