/* 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;
}
Пример #2
0
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;
}
Пример #4
0
/*
 * 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);
}
Пример #5
0
/*
 * 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);
}
Пример #7
0
/**
 * 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;
}