/* Adapted from yelp-toc-pager.c */ static xmlChar * xml_get_and_trim_names (xmlNodePtr node) { xmlNodePtr cur; xmlChar *keep_lang = NULL; xmlChar *value; int j, keep_pri = INT_MAX; const gchar * const * langs = g_get_language_names (); value = NULL; for (cur = node->children; cur; cur = cur->next) { if (! xmlStrcmp (cur->name, GVC_SOUND_NAME)) { xmlChar *cur_lang = NULL; int cur_pri = INT_MAX; cur_lang = xmlNodeGetLang (cur); if (cur_lang) { for (j = 0; langs[j]; j++) { if (g_str_equal (cur_lang, langs[j])) { cur_pri = j; break; } } } else { cur_pri = INT_MAX - 1; } if (cur_pri <= keep_pri) { if (keep_lang) xmlFree (keep_lang); if (value) xmlFree (value); value = xmlNodeGetContent (cur); keep_lang = cur_lang; keep_pri = cur_pri; } else { if (cur_lang) xmlFree (cur_lang); } } } /* Delete all GVC_SOUND_NAME nodes */ cur = node->children; while (cur) { xmlNodePtr this = cur; cur = cur->next; if (! xmlStrcmp (this->name, GVC_SOUND_NAME)) { xmlUnlinkNode (this); xmlFreeNode (this); } } return value; }
string Node::Language() const { const xmlChar * ch = xmlNodeGetLang(_xml); if ( ch == nullptr ) return string(); return ch; }
static gchar* mate_da_xml_get_string (const xmlNode *parent, const gchar *val_name) { const gchar * const *sys_langs; xmlChar *node_lang; xmlNode *element; gchar *ret_val = NULL; xmlChar *xml_val_name; gint len; gint i; g_return_val_if_fail (parent != NULL, ret_val); g_return_val_if_fail (parent->children != NULL, ret_val); g_return_val_if_fail (val_name != NULL, ret_val); #if GLIB_CHECK_VERSION (2, 6, 0) sys_langs = g_get_language_names (); #endif xml_val_name = xmlCharStrdup (val_name); len = xmlStrlen (xml_val_name); for (element = parent->children; element != NULL; element = element->next) { if (!xmlStrncmp (element->name, xml_val_name, len)) { node_lang = xmlNodeGetLang (element); if (node_lang == NULL) { ret_val = (gchar *) xmlNodeGetContent (element); } else { for (i = 0; sys_langs[i] != NULL; i++) { if (!strcmp (sys_langs[i], node_lang)) { ret_val = (gchar *) xmlNodeGetContent (element); /* since sys_langs is sorted from most desirable to * least desirable, exit at first match */ break; } } } xmlFree (node_lang); } } xmlFree (xml_val_name); return ret_val; }
/* * call-seq: * node.lang -> "string" * * Obtain the language set for this node, if any. * This is set in XML via the xml:lang attribute. */ static VALUE rxml_node_lang_get(VALUE self) { xmlNodePtr xnode; xmlChar *lang; VALUE result = Qnil; xnode = rxml_get_xnode(self); lang = xmlNodeGetLang(xnode); if (lang) { result = rxml_new_cstr((const char*) lang, NULL); xmlFree(lang); } return (result); }
/* * call-seq: * node.lang -> "string" * * Obtain the language set for this node, if any. * This is set in XML via the xml:lang attribute. */ static VALUE rxml_node_lang_get(VALUE self) { xmlNodePtr xnode; xmlChar *lang; VALUE result = Qnil; Data_Get_Struct(self, xmlNode, xnode); lang = xmlNodeGetLang(xnode); if (lang) { result = rxml_str_new2((const char*) lang, xnode->doc ? xnode->doc->encoding : NULL); xmlFree(lang); } return (result); }
static void mate_wp_xml_load_xml (AppearanceData *data, const gchar * filename) { xmlDoc * wplist; xmlNode * root, * list, * wpa; xmlChar * nodelang; const gchar * const * syslangs; GdkColor color1, color2; gint i; wplist = xmlParseFile (filename); if (!wplist) return; syslangs = g_get_language_names (); root = xmlDocGetRootElement (wplist); for (list = root->children; list != NULL; list = list->next) { if (!strcmp ((gchar *)list->name, "wallpaper")) { MateWPItem * wp; gchar *pcolor = NULL, *scolor = NULL; gchar *s; gboolean have_scale = FALSE, have_shade = FALSE; wp = g_new0 (MateWPItem, 1); wp->deleted = mate_wp_xml_get_bool (list, "deleted"); for (wpa = list->children; wpa != NULL; wpa = wpa->next) { if (wpa->type == XML_COMMENT_NODE) { continue; } else if (!strcmp ((gchar *)wpa->name, "filename")) { if (wpa->last != NULL && wpa->last->content != NULL) { const char * none = "(none)"; gchar *content = g_strstrip ((gchar *)wpa->last->content); if (!strcmp (content, none)) wp->filename = g_strdup (content); else if (g_utf8_validate (content, -1, NULL) && g_file_test (content, G_FILE_TEST_EXISTS)) wp->filename = g_strdup (content); else wp->filename = g_filename_from_utf8 (content, -1, NULL, NULL, NULL); } else { break; } } else if (!strcmp ((gchar *)wpa->name, "name")) { if (wpa->last != NULL && wpa->last->content != NULL) { nodelang = xmlNodeGetLang (wpa->last); if (wp->name == NULL && nodelang == NULL) { wp->name = g_strdup (g_strstrip ((gchar *)wpa->last->content)); } else { for (i = 0; syslangs[i] != NULL; i++) { if (!strcmp (syslangs[i], (gchar *)nodelang)) { g_free (wp->name); wp->name = g_strdup (g_strstrip ((gchar *)wpa->last->content)); break; } } } xmlFree (nodelang); } else { break; } } else if (!strcmp ((gchar *)wpa->name, "options")) { if (wpa->last != NULL) { wp->options = wp_item_string_to_option (g_strstrip ((gchar *)wpa->last->content)); have_scale = TRUE; } } else if (!strcmp ((gchar *)wpa->name, "shade_type")) { if (wpa->last != NULL) { wp->shade_type = wp_item_string_to_shading (g_strstrip ((gchar *)wpa->last->content)); have_shade = TRUE; } } else if (!strcmp ((gchar *)wpa->name, "pcolor")) { if (wpa->last != NULL) { pcolor = g_strdup (g_strstrip ((gchar *)wpa->last->content)); } } else if (!strcmp ((gchar *)wpa->name, "scolor")) { if (wpa->last != NULL) { scolor = g_strdup (g_strstrip ((gchar *)wpa->last->content)); } } else if (!strcmp ((gchar *)wpa->name, "text")) { /* Do nothing here, libxml2 is being weird */ } else { g_warning ("Unknown Tag: %s", wpa->name); } } /* Make sure we don't already have this one and that filename exists */ if (wp->filename == NULL || g_hash_table_lookup (data->wp_hash, wp->filename) != NULL) { mate_wp_item_free (wp); g_free (pcolor); g_free (scolor); continue; } /* Verify the colors and alloc some GdkColors here */ if (!have_scale) { s = mateconf_client_get_string (data->client, WP_OPTIONS_KEY, NULL); wp->options = wp_item_string_to_option (s); g_free (s); } if (!have_shade) { s = mateconf_client_get_string (data->client, WP_SHADING_KEY, NULL); wp->shade_type = wp_item_string_to_shading (s); g_free (s); } if (pcolor == NULL) { pcolor = mateconf_client_get_string (data->client, WP_PCOLOR_KEY, NULL); } if (scolor == NULL) { scolor = mateconf_client_get_string (data->client, WP_SCOLOR_KEY, NULL); } gdk_color_parse (pcolor, &color1); gdk_color_parse (scolor, &color2); g_free (pcolor); g_free (scolor); wp->pcolor = gdk_color_copy (&color1); wp->scolor = gdk_color_copy (&color2); if ((wp->filename != NULL && g_file_test (wp->filename, G_FILE_TEST_EXISTS)) || !strcmp (wp->filename, "(none)")) { wp->fileinfo = mate_wp_info_new (wp->filename, data->thumb_factory); if (wp->name == NULL || !strcmp (wp->filename, "(none)")) { g_free (wp->name); wp->name = g_strdup (wp->fileinfo->name); } mate_wp_item_ensure_mate_bg (wp); mate_wp_item_update_description (wp); g_hash_table_insert (data->wp_hash, wp->filename, wp); } else { mate_wp_item_free (wp); wp = NULL; } } } xmlFreeDoc (wplist); }
/** * gpa_printer_new_from_tree: * @tree: The xml tree where to create the printer from * * Create a GPAPrinter form an xml tree. * * Return Value: a newly created GPAPrinter or NULL on error **/ static GPANode * gpa_printer_new_from_tree (xmlNodePtr tree) { xmlNodePtr node; GPANode *settings, *printer, *model; xmlChar *name, *id, *version; const char* const *syslangs = NULL; g_return_val_if_fail (tree != NULL, NULL); g_return_val_if_fail (tree->name != NULL, NULL); settings = printer = model = NULL; name = id = version = NULL; if (strcmp (tree->name, "Printer")) { g_warning ("Base node is <%s>, should be <Printer>", tree->name); goto gpa_printer_new_from_tree_error; } id = xmlGetProp (tree, "Id"); if (!id) { g_warning ("Printer node does not have Id, could not load printer"); goto gpa_printer_new_from_tree_error; } version = xmlGetProp (tree, "Version"); if (!version || strcmp (version, "1.0")) { g_warning ("Wrong printer version \"%s\" should be \"1.0\" " "for printer \"%s\"", version, id); goto gpa_printer_new_from_tree_error; } #if GLIB_CHECK_VERSION (2, 6, 0) syslangs = g_get_language_names (); #endif for (node = tree->xmlChildrenNode; node != NULL; node = node->next) { if (!strcmp (node->name, "Name")) { if (syslangs != NULL) { xmlChar *xmllang = xmlNodeGetLang (node); int i; for (i = 0; syslangs[i] && xmllang; i++) { if (!strcmp (syslangs[i], xmllang)) { xmlFree (name); name = xmlNodeGetContent (node); break; } } if (!xmllang) name = xmlNodeGetContent (node); else xmlFree (xmllang); } else if (!name) { name = xmlNodeGetContent (node); } } else if (!strcmp (node->name, "Model")) { xmlChar *model_id = xmlNodeGetContent (node); model = gpa_model_get_by_id (model_id, FALSE); xmlFree (model_id); } else if (!strcmp (node->name, "Settings")) { /* We don't support multiple settings per printer yet */ g_assert (settings == NULL); if (model != NULL) { settings = gpa_settings_new_from_model_and_tree (model, node); } else { g_warning ("<Model> node should come before <Settings> (\"%s\")", id); } } } if (!name || !name[0]) { g_warning ("Invalid or missing <Name> for printer \"%s\"", id); goto gpa_printer_new_from_tree_error; } if (!model) { g_warning ("Invalid or missing <Model> for printer \"%s\"\n", id); goto gpa_printer_new_from_tree_error; } if (!settings) { g_warning ("Invalid or missing <Settings> for printer \"%s\"\n", id); goto gpa_printer_new_from_tree_error; } printer = gpa_printer_new (id, name, GPA_MODEL (model), GPA_SETTINGS (settings)); gpa_printer_new_from_tree_error: xmlFree (name); xmlFree (id); xmlFree (version); if (!printer) { my_gpa_node_unref (settings); my_gpa_node_unref (model); } return printer; }