This factors the code that is repeated in the _new methods of all classes deriving from GVirObject --- libvirt-gconfig/libvirt-gconfig-domain.c | 26 ++++++++++-------------- libvirt-gconfig/libvirt-gconfig-object.c | 31 ++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-object.h | 8 +++++++ libvirt-gconfig/libvirt-gconfig.sym | 1 + 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 837287c..3290389 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -147,27 +147,23 @@ static void gvir_config_domain_init(GVirConfigDomain *conn) GVirConfigDomain *gvir_config_domain_new_from_xml(const gchar *xml, GError **error) { - xmlNodePtr node; + GVirConfigObject *object; - node = gvir_config_xml_parse(xml, "domain", error); - if ((error != NULL) && (*error != NULL)) - return NULL; - return GVIR_CONFIG_DOMAIN(g_object_new(GVIR_TYPE_CONFIG_DOMAIN, - "node", node, - "schema", DATADIR "/libvirt/schemas/domain.rng", - NULL)); + object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_DOMAIN, + "domain", + DATADIR "/libvirt/schemas/domain.rng", + xml, error); + return GVIR_CONFIG_DOMAIN(object); } GVirConfigDomain *gvir_config_domain_new(void) { - xmlDocPtr doc; + GVirConfigObject *object; - doc = xmlNewDoc((xmlChar *)"1.0"); - doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)"domain", NULL); - return GVIR_CONFIG_DOMAIN(g_object_new(GVIR_TYPE_CONFIG_DOMAIN, - "node", doc->children, - "schema", DATADIR "/libvirt/schemas/domain.rng", - NULL)); + object = gvir_config_object_new(GVIR_TYPE_CONFIG_DOMAIN, + "domain", + DATADIR "/libvirt/schemas/domain.rng"); + return GVIR_CONFIG_DOMAIN(object); } char *gvir_config_domain_get_name(GVirConfigDomain *domain) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index e59cbcd..adbd955 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -355,3 +355,34 @@ void gvir_config_object_set_node_content_uint64(GVirConfigObject *object, gvir_config_object_set_node_content(object, node_name, str); g_free(str); } + +GVirConfigObject *gvir_config_object_new_from_xml(GType type, + const char *root_name, + const char *schema, + const gchar *xml, + GError **error) +{ + xmlNodePtr node; + + node = gvir_config_xml_parse(xml, root_name, error); + if ((error != NULL) && (*error != NULL)) + return NULL; + return GVIR_CONFIG_OBJECT(g_object_new(type, + "node", node, + "schema", schema, + NULL)); +} + +GVirConfigObject *gvir_config_object_new(GType type, + const char *root_name, + const char *schema) +{ + xmlDocPtr doc; + + doc = xmlNewDoc((xmlChar *)"1.0"); + doc->children = xmlNewDocNode(doc, NULL, (xmlChar *)root_name, NULL); + return GVIR_CONFIG_OBJECT(g_object_new(type, + "node", doc->children, + "schema", schema, + NULL)); +} diff --git a/libvirt-gconfig/libvirt-gconfig-object.h b/libvirt-gconfig/libvirt-gconfig-object.h index c203798..52e4525 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.h +++ b/libvirt-gconfig/libvirt-gconfig-object.h @@ -59,6 +59,14 @@ struct _GVirConfigObjectClass GType gvir_config_object_get_type(void); +GVirConfigObject *gvir_config_object_new(GType type, + const char *root_name, + const char *schema); +GVirConfigObject *gvir_config_object_new_from_xml(GType type, + const char *root_name, + const char *schema, + const gchar *xml, + GError **error); void gvir_config_object_validate(GVirConfigObject *config, GError **err); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 951aac6..31a89d2 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -31,6 +31,7 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_get_type; gvir_config_object_error_quark; gvir_config_object_new; + gvir_config_object_new_from_xml; gvir_config_object_get_schema; gvir_config_object_get_xml_node; gvir_config_object_to_xml; -- 1.7.7 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list