virtxml was doing its own loading of the libosinfo database, and gvir_designer_init() was loading it a second time. By adding a GVirDesignerDomain::osinfo_db property, applications can share the same OsinfoDb as libvirt-designer. The association is made per libvirt-designer domain for more flexibility. If no OsinfoDb is associated with a domain when needed, libvirt-designer will automatically try to load it. --- examples/virtxml.c | 2 ++ libvirt-designer/libvirt-designer-domain.c | 49 +++++++++++++++++++++++++++- libvirt-designer/libvirt-designer-internal.h | 3 -- libvirt-designer/libvirt-designer-main.c | 12 ------- libvirt-designer/libvirt-designer-main.h | 2 ++ libvirt-designer/libvirt-designer.sym | 1 + 6 files changed, 53 insertions(+), 16 deletions(-) diff --git a/examples/virtxml.c b/examples/virtxml.c index a68843d..be6ee7a 100644 --- a/examples/virtxml.c +++ b/examples/virtxml.c @@ -559,6 +559,8 @@ main(int argc, char *argv[]) } domain = gvir_designer_domain_new(os, platform, caps); + if (db != NULL) + g_object_set(G_OBJECT(domain), "osinfo-db", db, NULL); gvir_designer_domain_setup_machine(domain, &error); CHECK_ERROR; diff --git a/libvirt-designer/libvirt-designer-domain.c b/libvirt-designer/libvirt-designer-domain.c index 3e31bd1..b78b8d3 100644 --- a/libvirt-designer/libvirt-designer-domain.c +++ b/libvirt-designer/libvirt-designer-domain.c @@ -35,6 +35,7 @@ struct _GVirDesignerDomainPrivate { GVirConfigDomain *config; GVirConfigCapabilities *caps; + OsinfoDb *osinfo_db; OsinfoOs *os; OsinfoPlatform *platform; @@ -66,6 +67,7 @@ enum { PROP_OS, PROP_PLATFORM, PROP_CAPS, + PROP_OSINFO_DB, }; static void gvir_designer_domain_get_property(GObject *object, @@ -83,6 +85,10 @@ static void gvir_designer_domain_get_property(GObject *object, g_value_set_object(value, priv->config); break; + case PROP_OSINFO_DB: + g_value_set_object(value, priv->osinfo_db); + break; + case PROP_OS: g_value_set_object(value, priv->os); break; @@ -112,6 +118,11 @@ static void gvir_designer_domain_set_property(GObject *object, GVirDesignerDomainPrivate *priv = design->priv; switch (prop_id) { + case PROP_OSINFO_DB: + if (priv->osinfo_db) + g_object_unref(priv->osinfo_db); + priv->osinfo_db = g_value_dup_object(value); + break; case PROP_OS: if (priv->os) g_object_unref(priv->os); @@ -147,6 +158,8 @@ static void gvir_designer_domain_finalize(GObject *object) g_object_unref(priv->caps); if (priv->deployment) g_object_unref(priv->deployment); + if (priv->osinfo_db) + g_object_unref(priv->osinfo_db); G_OBJECT_CLASS(gvir_designer_domain_parent_class)->finalize(object); } @@ -171,6 +184,15 @@ static void gvir_designer_domain_class_init(GVirDesignerDomainClass *klass) G_PARAM_STATIC_STRINGS)); g_object_class_install_property(object_class, + PROP_OSINFO_DB, + g_param_spec_object("osinfo-db", + "Osinfo Database", + "libosinfo database", + OSINFO_TYPE_DB, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, PROP_OS, g_param_spec_object("os", "Os", @@ -709,6 +731,23 @@ cleanup: } +static void gvir_designer_domain_load_osinfo_db(GVirDesignerDomain *domain) +{ + /* Init libosinfo and load databases from default paths */ + /* XXX maybe we want to let users tell a different path via + * env variable or argv */ + OsinfoLoader *osinfo_loader = NULL; + OsinfoDb *db; + + osinfo_loader = osinfo_loader_new(); + osinfo_loader_process_default_path(osinfo_loader, NULL); + + db = osinfo_loader_get_db(osinfo_loader); + if (db != NULL) + g_object_set(G_OBJECT(domain), "osinfo-db", db, NULL); + g_object_unref(G_OBJECT(osinfo_loader)); +} + static OsinfoDeviceLink * gvir_designer_domain_get_preferred_device(GVirDesignerDomain *design, const char *class, @@ -721,7 +760,15 @@ gvir_designer_domain_get_preferred_device(GVirDesignerDomain *design, OsinfoDeviceLink *dev_link = NULL; if (!deployment) { - priv->deployment = deployment = osinfo_db_find_deployment(osinfo_db, + if (!priv->osinfo_db) + gvir_designer_domain_load_osinfo_db(design); + + if (!priv->osinfo_db) { + g_set_error(error, GVIR_DESIGNER_DOMAIN_ERROR, 0, + "Unable to find any deployment in libosinfo database"); + goto cleanup; + } + priv->deployment = deployment = osinfo_db_find_deployment(priv->osinfo_db, priv->os, priv->platform); if (!deployment) { diff --git a/libvirt-designer/libvirt-designer-internal.h b/libvirt-designer/libvirt-designer-internal.h index bbef922..e95edfc 100644 --- a/libvirt-designer/libvirt-designer-internal.h +++ b/libvirt-designer/libvirt-designer-internal.h @@ -24,7 +24,4 @@ #ifndef __LIBVIRT_DESIGNER_INTERNAL_H__ #define __LIBVIRT_DESIGNER_INTERNAL_H__ -extern OsinfoLoader *osinfo_loader; -extern OsinfoDb *osinfo_db; - #endif /* __LIBVIRT_DESIGNER_INTERNAL_H__ */ diff --git a/libvirt-designer/libvirt-designer-main.c b/libvirt-designer/libvirt-designer-main.c index 5c70b57..927eb21 100644 --- a/libvirt-designer/libvirt-designer-main.c +++ b/libvirt-designer/libvirt-designer-main.c @@ -30,9 +30,6 @@ #include <libvirt-designer/libvirt-designer.h> #include <libvirt-gconfig/libvirt-gconfig.h> -OsinfoLoader *osinfo_loader = NULL; -OsinfoDb *osinfo_db = NULL; - /** * gvir_designer_init: * @argc: (inout): pointer to application's argc @@ -57,7 +54,6 @@ static void gvir_log_handler(const gchar *log_domain G_GNUC_UNUSED, fprintf(stderr, "%s\n", message); } - /** * gvir_designer_init_check: * @argc: (inout): pointer to application's argc @@ -85,13 +81,5 @@ gboolean gvir_designer_init_check(int *argc, gvir_log_handler, NULL); #endif - /* Init libosinfo and load databases from default paths */ - /* XXX maybe we want to let users tell a different path via - * env variable or argv */ - osinfo_loader = osinfo_loader_new(); - osinfo_loader_process_default_path(osinfo_loader, NULL); - - osinfo_db = osinfo_loader_get_db(osinfo_loader); - return TRUE; } diff --git a/libvirt-designer/libvirt-designer-main.h b/libvirt-designer/libvirt-designer-main.h index 2500ef7..5e82f8a 100644 --- a/libvirt-designer/libvirt-designer-main.h +++ b/libvirt-designer/libvirt-designer-main.h @@ -24,6 +24,8 @@ #error "Only <libvirt-gdesigner/libvirt-gdesigner.h> can be included directly." #endif +#include <osinfo/osinfo.h> + #ifndef __LIBVIRT_DESIGNER_MAIN_H__ #define __LIBVIRT_DESIGNER_MAIN_H__ diff --git a/libvirt-designer/libvirt-designer.sym b/libvirt-designer/libvirt-designer.sym index 79db09f..6f63abc 100644 --- a/libvirt-designer/libvirt-designer.sym +++ b/libvirt-designer/libvirt-designer.sym @@ -2,6 +2,7 @@ LIBVIRT_DESIGNER_0.0.1 { global: gvir_designer_init; gvir_designer_init_check; + gvir_designer_get_osinfo_db; gvir_designer_domain_new; gvir_designer_domain_get_type; -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list