[Libosinfo] [[PATCH v3] 4/6] media: Add variant info API/XML

Zeeshan Ali (Khattak) zeeshanak at gnome.org
Thu Nov 28 15:10:22 UTC 2013


Add:

* ability to associate media to one or more variants of the OS in the
  'media' XML node. For example:

  <os id="http://microsoft.com/win/7">
    <short-id>win7</short-id>
    <name>Microsoft Windows 7</name>
    ..

    <variant id="starter">
      <name>Microsoft Windows 7 Starter</name>
    </variant>
    <variant id="home-basic">
      <name>Microsoft Windows 7 Home Basic</name>
    </variant>
    <variant id="home-premium">
      <name>Microsoft Windows 7 Home Premium</name>
    </variant>
    ..

    <media installer-reboots="2" arch="x86_64">
      <variant id="home-premium"/>
      <iso>
        ..
      </iso>
    </media>
  </os>

* API to query variants of the OS, media is associated with.
---
 data/schemas/libosinfo.rng |  6 ++++++
 osinfo/libosinfo.syms      |  2 ++
 osinfo/osinfo_db.c         |  8 +++++++-
 osinfo/osinfo_loader.c     | 18 ++++++++++++++++--
 osinfo/osinfo_media.c      | 39 +++++++++++++++++++++++++++++++++++++++
 osinfo/osinfo_media.h      |  3 +++
 6 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/data/schemas/libosinfo.rng b/data/schemas/libosinfo.rng
index cc13982..0675217 100644
--- a/data/schemas/libosinfo.rng
+++ b/data/schemas/libosinfo.rng
@@ -338,6 +338,12 @@
         </attribute>
       </optional>
       <optional>
+        <element name='variant'>
+          <attribute name='id'>
+          </attribute>
+        </element>
+      </optional>
+      <optional>
         <element name='url'>
           <ref name='url'/>
         </element>
diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index 21d80f4..637ad09 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -448,6 +448,8 @@ LIBOSINFO_0.2.9 {
 	osinfo_os_get_release_status;
 	osinfo_release_status_get_type;
 
+	osinfo_media_get_os_variants;
+
 	osinfo_os_add_variant;
 	osinfo_os_get_variant_list;
 
diff --git a/osinfo/osinfo_db.c b/osinfo/osinfo_db.c
index f19d9b4..db04033 100644
--- a/osinfo/osinfo_db.c
+++ b/osinfo/osinfo_db.c
@@ -627,6 +627,7 @@ static void fill_media (OsinfoDb *db, OsinfoMedia *media,
     const gchar *initrd_path;
     const gchar *arch;
     const gchar *url;
+    GList *variants, *node;
 
     languages = match_languages(db, media, matched_media);
     if (languages != NULL)
@@ -642,7 +643,12 @@ static void fill_media (OsinfoDb *db, OsinfoMedia *media,
     url = osinfo_media_get_url(matched_media);
     if (url != NULL)
         g_object_set(G_OBJECT(media), "url", url, NULL);
-
+    variants = osinfo_entity_get_param_value_list(OSINFO_ENTITY(matched_media),
+                                                  "variant");
+    for (node = variants; node != NULL; node = node->next)
+        osinfo_entity_add_param(OSINFO_ENTITY(media),
+                                "variant",
+                                (gchar *) node->data);
     kernel_path = osinfo_media_get_kernel_path(matched_media);
     if (kernel_path != NULL)
         g_object_set(G_OBJECT(media), "kernel_path", kernel_path, NULL);
diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index affc49b..e9ce8e1 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -859,7 +859,6 @@ static OsinfoMedia *osinfo_loader_media (OsinfoLoader *loader,
     xmlChar *installer = xmlGetProp(root, BAD_CAST OSINFO_MEDIA_PROP_INSTALLER);
     xmlChar *installer_reboots =
             xmlGetProp(root, BAD_CAST OSINFO_MEDIA_PROP_INSTALLER_REBOOTS);
-    xmlChar *variant = xmlGetProp(root, BAD_CAST OSINFO_MEDIA_PROP_VARIANT);
     const OsinfoEntityKey keys[] = {
         { OSINFO_MEDIA_PROP_URL, G_TYPE_STRING },
         { OSINFO_MEDIA_PROP_KERNEL, G_TYPE_STRING },
@@ -892,7 +891,22 @@ static OsinfoMedia *osinfo_loader_media (OsinfoLoader *loader,
         xmlFree(installer_reboots);
     }
 
-    gint nnodes = osinfo_loader_nodeset("./iso/*", ctxt, &nodes, err);
+    gint nnodes = osinfo_loader_nodeset("./variant", ctxt, &nodes, err);
+    if (error_is_set(err)) {
+        g_object_unref(media);
+        return NULL;
+    }
+
+    for (i = 0 ; i < nnodes ; i++) {
+        gchar *variant_id = (gchar *)xmlGetProp(nodes[i], BAD_CAST "id");
+        osinfo_entity_add_param(OSINFO_ENTITY(media),
+                                OSINFO_MEDIA_PROP_VARIANT,
+                                variant_id);
+        xmlFree(variant_id);
+    }
+    g_free(nodes);
+
+    nnodes = osinfo_loader_nodeset("./iso/*", ctxt, &nodes, err);
     if (error_is_set(err)) {
         g_object_unref(media);
         return NULL;
diff --git a/osinfo/osinfo_media.c b/osinfo/osinfo_media.c
index 118ff8b..0d6b96a 100644
--- a/osinfo/osinfo_media.c
+++ b/osinfo/osinfo_media.c
@@ -1136,6 +1136,45 @@ void osinfo_media_set_os(OsinfoMedia *media, OsinfoOs *os)
 }
 
 /**
+ * osinfo_media_get_os_variants:
+ * @media: an #OsinfoMedia instance
+ *
+ * Gets the variants of the associated operating system.
+ *
+ * Returns: (transfer full): the operating system variant, or NULL
+ */
+OsinfoOsVariantList *osinfo_media_get_os_variants(OsinfoMedia *media)
+{
+    OsinfoOs *os;
+    OsinfoOsVariantList *os_variants;
+    OsinfoOsVariantList *media_variants;
+    GList *ids, *node;
+    OsinfoFilter *filter;
+
+    g_return_val_if_fail(OSINFO_IS_MEDIA(media), NULL);
+    os = g_weak_ref_get(&media->priv->os);
+    os_variants = osinfo_os_get_variant_list(os);
+    g_object_unref (os);
+
+    ids = osinfo_entity_get_param_value_list(OSINFO_ENTITY(media),
+                                             OSINFO_MEDIA_PROP_VARIANT);
+    filter = osinfo_filter_new();
+    media_variants = osinfo_os_variantlist_new();
+    for (node = ids; node != NULL; node = node->next) {
+        osinfo_filter_clear_constraints(filter);
+        osinfo_filter_add_constraint(filter,
+                                     OSINFO_ENTITY_PROP_ID,
+                                     (const char *) node->data);
+        osinfo_list_add_filtered(OSINFO_LIST(media_variants),
+                                 OSINFO_LIST(os_variants),
+                                 filter);
+    }
+    g_object_unref (os_variants);
+
+    return media_variants;
+}
+
+/**
  * osinfo_media_get_languages:
  * @media: an #OsinfoMedia instance
  *
diff --git a/osinfo/osinfo_media.h b/osinfo/osinfo_media.h
index 308f75e..8cf3e05 100644
--- a/osinfo/osinfo_media.h
+++ b/osinfo/osinfo_media.h
@@ -26,6 +26,7 @@
 #include <glib-object.h>
 #include <gio/gio.h>
 #include <osinfo/osinfo_entity.h>
+#include <osinfo/osinfo_os_variantlist.h>
 
 #ifndef __OSINFO_MEDIA_H__
 #define __OSINFO_MEDIA_H__
@@ -84,6 +85,7 @@ typedef struct _OsinfoMediaPrivate OsinfoMediaPrivate;
 #define OSINFO_MEDIA_PROP_LANG           "l10n-language"
 #define OSINFO_MEDIA_PROP_LANG_REGEX     "l10n-language-regex"
 #define OSINFO_MEDIA_PROP_LANG_MAP       "l10n-language-map"
+#define OSINFO_MEDIA_PROP_VARIANT        "variant"
 
 /* object */
 struct _OsinfoMedia
@@ -128,6 +130,7 @@ const gchar *osinfo_media_get_application_id(OsinfoMedia *media);
 const gchar *osinfo_media_get_kernel_path(OsinfoMedia *media);
 const gchar *osinfo_media_get_initrd_path(OsinfoMedia *media);
 OsinfoOs *osinfo_media_get_os(OsinfoMedia *media);
+OsinfoOsVariantList *osinfo_media_get_os_variants(OsinfoMedia *media);
 GList *osinfo_media_get_languages(OsinfoMedia *media);
 gboolean osinfo_media_get_installer(OsinfoMedia *media);
 gboolean osinfo_media_get_live(OsinfoMedia *media);
-- 
1.8.4.2




More information about the Libosinfo mailing list