Blame libvirt-gconfig/libvirt-gconfig-helpers.c

Packit Service ea0369
/*
Packit Service ea0369
 * libvirt-gconfig-helpers.c: libvirt configuration helpers
Packit Service ea0369
 *
Packit Service ea0369
 * Copyright (C) 2010, 2011 Red Hat, Inc.
Packit Service ea0369
 *
Packit Service ea0369
 * This library is free software; you can redistribute it and/or
Packit Service ea0369
 * modify it under the terms of the GNU Lesser General Public
Packit Service ea0369
 * License as published by the Free Software Foundation; either
Packit Service ea0369
 * version 2.1 of the License, or (at your option) any later version.
Packit Service ea0369
 *
Packit Service ea0369
 * This library is distributed in the hope that it will be useful,
Packit Service ea0369
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service ea0369
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service ea0369
 * Lesser General Public License for more details.
Packit Service ea0369
 *
Packit Service ea0369
 * You should have received a copy of the GNU Lesser General Public
Packit Service ea0369
 * License along with this library. If not, see
Packit Service ea0369
 * <http://www.gnu.org/licenses/>.
Packit Service ea0369
 *
Packit Service ea0369
 * Authors: Daniel P. Berrange <berrange@redhat.com>
Packit Service ea0369
 *          Christophe Fergeau <cfergeau@gmail.com>
Packit Service ea0369
 */
Packit Service ea0369
Packit Service ea0369
#include <config.h>
Packit Service ea0369
Packit Service ea0369
#include <string.h>
Packit Service ea0369
Packit Service ea0369
#include <libxml/xmlerror.h>
Packit Service ea0369
#include <glib/gi18n-lib.h>
Packit Service ea0369
Packit Service ea0369
#include "libvirt-gconfig/libvirt-gconfig.h"
Packit Service ea0369
#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h"
Packit Service ea0369
Packit Service ea0369
GQuark
Packit Service ea0369
gvir_config_object_error_quark(void)
Packit Service ea0369
{
Packit Service ea0369
    return g_quark_from_static_string("gvir-config-object");
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
static GError *gvir_config_error_new_literal(GQuark domain,
Packit Service ea0369
                                             gint code,
Packit Service ea0369
                                             const gchar *message)
Packit Service ea0369
{
Packit Service ea0369
    xmlErrorPtr xerr = xmlGetLastError();
Packit Service ea0369
Packit Service ea0369
    if (!xerr)
Packit Service ea0369
        return NULL;
Packit Service ea0369
Packit Service ea0369
    if (message)
Packit Service ea0369
        return g_error_new(domain,
Packit Service ea0369
                           code,
Packit Service ea0369
                           "%s: %s",
Packit Service ea0369
                           message,
Packit Service ea0369
                           xerr->message);
Packit Service ea0369
    else
Packit Service ea0369
        return g_error_new(domain,
Packit Service ea0369
                           code,
Packit Service ea0369
                           "%s",
Packit Service ea0369
                           xerr->message);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
Packit Service ea0369
GError *gvir_config_error_new(GQuark domain,
Packit Service ea0369
                              gint code,
Packit Service ea0369
                              const gchar *format,
Packit Service ea0369
                              ...)
Packit Service ea0369
{
Packit Service ea0369
    GError *err;
Packit Service ea0369
    va_list args;
Packit Service ea0369
    gchar *message;
Packit Service ea0369
Packit Service ea0369
    va_start(args, format);
Packit Service ea0369
    message = g_strdup_vprintf(format, args);
Packit Service ea0369
    va_end(args);
Packit Service ea0369
Packit Service ea0369
    err = gvir_config_error_new_literal(domain, code, message);
Packit Service ea0369
Packit Service ea0369
    g_free(message);
Packit Service ea0369
Packit Service ea0369
    return err;
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
Packit Service ea0369
void gvir_config_set_error(GError **err,
Packit Service ea0369
                           GQuark domain, gint code,
Packit Service ea0369
                           const gchar *format, ...)
Packit Service ea0369
{
Packit Service ea0369
    va_list args;
Packit Service ea0369
    gchar *message;
Packit Service ea0369
Packit Service ea0369
    if (!err)
Packit Service ea0369
        return;
Packit Service ea0369
Packit Service ea0369
    va_start(args, format);
Packit Service ea0369
    message = g_strdup_vprintf(format, args);
Packit Service ea0369
    va_end(args);
Packit Service ea0369
Packit Service ea0369
    *err = gvir_config_error_new_literal(domain, code, message);
Packit Service ea0369
Packit Service ea0369
    g_free(message);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
Packit Service ea0369
void gvir_config_set_error_literal(GError **err,
Packit Service ea0369
                                   GQuark domain, gint code,
Packit Service ea0369
                                   const gchar *message)
Packit Service ea0369
{
Packit Service ea0369
    if (!err)
Packit Service ea0369
        return;
Packit Service ea0369
Packit Service ea0369
    *err = gvir_config_error_new_literal(domain, code, message);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
Packit Service ea0369
void gvir_config_set_error_valist(GError **err,
Packit Service ea0369
                                  GQuark domain, gint code,
Packit Service ea0369
                                  const gchar *format,
Packit Service ea0369
                                  va_list args)
Packit Service ea0369
{
Packit Service ea0369
    gchar *message;
Packit Service ea0369
Packit Service ea0369
    if (!err)
Packit Service ea0369
        return;
Packit Service ea0369
Packit Service ea0369
    message = g_strdup_vprintf(format, args);
Packit Service ea0369
Packit Service ea0369
    *err = gvir_config_error_new_literal(domain, code, message);
Packit Service ea0369
Packit Service ea0369
    g_free(message);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
xmlNodePtr
Packit Service ea0369
gvir_config_xml_parse(const char *xml, const char *root_node, GError **err)
Packit Service ea0369
{
Packit Service ea0369
    xmlDocPtr doc;
Packit Service ea0369
Packit Service ea0369
    if (!xml) {
Packit Service ea0369
        *err = g_error_new(GVIR_CONFIG_OBJECT_ERROR,
Packit Service ea0369
                           0,
Packit Service ea0369
                           "%s",
Packit Service ea0369
                           _("No XML document to parse"));
Packit Service ea0369
        return NULL;
Packit Service ea0369
    }
Packit Service ea0369
Packit Service ea0369
    doc = xmlParseMemory(xml, strlen(xml));
Packit Service ea0369
    if (!doc) {
Packit Service ea0369
        gvir_config_set_error_literal(err, GVIR_CONFIG_OBJECT_ERROR,
Packit Service ea0369
                                      0,
Packit Service ea0369
                                      _("Unable to parse configuration"));
Packit Service ea0369
        return NULL;
Packit Service ea0369
    }
Packit Service ea0369
    if ((!doc->children) ||
Packit Service ea0369
         ((root_node != NULL) && g_strcmp0((char *)doc->children->name, root_node) != 0)) {
Packit Service ea0369
        g_set_error(err,
Packit Service ea0369
                    GVIR_CONFIG_OBJECT_ERROR,
Packit Service ea0369
                    0,
Packit Service ea0369
                    _("XML data has no '%s' node"),
Packit Service ea0369
                    root_node);
Packit Service ea0369
        xmlFreeDoc(doc);
Packit Service ea0369
        return NULL;
Packit Service ea0369
    }
Packit Service ea0369
Packit Service ea0369
    return doc->children;
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
void gvir_config_xml_foreach_child(xmlNodePtr node,
Packit Service ea0369
                                   GVirConfigXmlNodeIterator iter_func,
Packit Service ea0369
                                   gpointer opaque)
Packit Service ea0369
{
Packit Service ea0369
    xmlNodePtr it;
Packit Service ea0369
Packit Service ea0369
    g_return_if_fail(iter_func != NULL);
Packit Service ea0369
Packit Service ea0369
    it = node->children;
Packit Service ea0369
    while (it != NULL) {
Packit Service ea0369
        gboolean cont;
Packit Service ea0369
        xmlNodePtr next = it->next;
Packit Service ea0369
Packit Service ea0369
        if (!xmlIsBlankNode(it)) {
Packit Service ea0369
            cont = iter_func(it, opaque);
Packit Service ea0369
            if (!cont)
Packit Service ea0369
                break;
Packit Service ea0369
        }
Packit Service ea0369
Packit Service ea0369
        it = next;
Packit Service ea0369
    }
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
/*
Packit Service ea0369
 * gvir_config_xml_get_element is
Packit Service ea0369
 *
Packit Service ea0369
 * Copyright (C) 2006, 2007 OpenedHand Ltd.
Packit Service ea0369
 *
Packit Service ea0369
 * Author: Jorn Baayen <jorn@openedhand.com>
Packit Service ea0369
 */
Packit Service ea0369
xmlNode *
Packit Service ea0369
gvir_config_xml_get_element (xmlNode *node, ...)
Packit Service ea0369
{
Packit Service ea0369
        va_list var_args;
Packit Service ea0369
Packit Service ea0369
        va_start (var_args, node);
Packit Service ea0369
Packit Service ea0369
        while (TRUE) {
Packit Service ea0369
                const char *arg;
Packit Service ea0369
Packit Service ea0369
                arg = va_arg (var_args, const char *);
Packit Service ea0369
                if (!arg)
Packit Service ea0369
                        break;
Packit Service ea0369
Packit Service ea0369
                for (node = node->children; node; node = node->next)
Packit Service ea0369
                        if (!g_strcmp0 (arg, (char *) node->name))
Packit Service ea0369
                                break;
Packit Service ea0369
Packit Service ea0369
                if (!node)
Packit Service ea0369
                        break;
Packit Service ea0369
        }
Packit Service ea0369
Packit Service ea0369
        va_end (var_args);
Packit Service ea0369
Packit Service ea0369
        return node;
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
G_GNUC_INTERNAL const char *
Packit Service ea0369
gvir_config_xml_get_child_element_content (xmlNode *node,
Packit Service ea0369
                                           const char *child_name)
Packit Service ea0369
{
Packit Service ea0369
    xmlNode *child_node;
Packit Service ea0369
Packit Service ea0369
    child_node = gvir_config_xml_get_element(node, child_name, NULL);
Packit Service ea0369
    if (!child_node || !(child_node->children))
Packit Service ea0369
        return NULL;
Packit Service ea0369
Packit Service ea0369
    return (const char *)child_node->children->content;
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
G_GNUC_INTERNAL const char *
Packit Service ea0369
gvir_config_xml_get_attribute_content(xmlNodePtr node, const char *attr_name)
Packit Service ea0369
{
Packit Service ea0369
    xmlAttr *attr;
Packit Service ea0369
Packit Service ea0369
    for (attr = node->properties; attr; attr = attr->next)
Packit Service ea0369
        if (g_strcmp0 (attr_name, (char *)attr->name) == 0)
Packit Service ea0369
            return (const char *)attr->children->content;
Packit Service ea0369
Packit Service ea0369
    return NULL;
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
const char *gvir_config_genum_get_nick (GType enum_type, gint value)
Packit Service ea0369
{
Packit Service ea0369
    GEnumClass *enum_class;
Packit Service ea0369
    GEnumValue *enum_value;
Packit Service ea0369
Packit Service ea0369
    g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
Packit Service ea0369
Packit Service ea0369
    enum_class = g_type_class_ref(enum_type);
Packit Service ea0369
    enum_value = g_enum_get_value(enum_class, value);
Packit Service ea0369
    g_type_class_unref(enum_class);
Packit Service ea0369
Packit Service ea0369
    if (enum_value != NULL)
Packit Service ea0369
        return enum_value->value_nick;
Packit Service ea0369
Packit Service ea0369
    g_return_val_if_reached(NULL);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
G_GNUC_INTERNAL int
Packit Service ea0369
gvir_config_genum_get_value (GType enum_type, const char *nick,
Packit Service ea0369
                             gint default_value)
Packit Service ea0369
{
Packit Service ea0369
    GEnumClass *enum_class;
Packit Service ea0369
    GEnumValue *enum_value;
Packit Service ea0369
Packit Service ea0369
    g_return_val_if_fail(G_TYPE_IS_ENUM(enum_type), default_value);
Packit Service ea0369
    g_return_val_if_fail(nick != NULL, default_value);
Packit Service ea0369
Packit Service ea0369
    enum_class = g_type_class_ref(enum_type);
Packit Service ea0369
    enum_value = g_enum_get_value_by_nick(enum_class, nick);
Packit Service ea0369
    g_type_class_unref(enum_class);
Packit Service ea0369
Packit Service ea0369
    if (enum_value != NULL)
Packit Service ea0369
        return enum_value->value;
Packit Service ea0369
Packit Service ea0369
    g_return_val_if_reached(default_value);
Packit Service ea0369
}
Packit Service ea0369
Packit Service ea0369
G_GNUC_INTERNAL char *
Packit Service ea0369
gvir_config_xml_node_to_string(xmlNodePtr node)
Packit Service ea0369
{
Packit Service ea0369
    xmlBufferPtr xmlbuf;
Packit Service ea0369
    char *xml;
Packit Service ea0369
Packit Service ea0369
    if (node == NULL)
Packit Service ea0369
        return NULL;
Packit Service ea0369
Packit Service ea0369
    xmlbuf = xmlBufferCreate();
Packit Service ea0369
    if (xmlNodeDump(xmlbuf, node->doc, node, 0, 1) < 0)
Packit Service ea0369
        xml = NULL;
Packit Service ea0369
    else
Packit Service ea0369
        xml = g_strndup((gchar *)xmlBufferContent(xmlbuf), xmlBufferLength(xmlbuf));
Packit Service ea0369
Packit Service ea0369
    xmlBufferFree(xmlbuf);
Packit Service ea0369
Packit Service ea0369
    return xml;
Packit Service ea0369
}