[Libosinfo] [PATCH 3/7] os: Add variant info API/XML

Christophe Fergeau cfergeau at redhat.com
Wed Nov 27 09:30:18 UTC 2013


On Tue, Nov 26, 2013 at 04:16:29PM +0000, Zeeshan Ali (Khattak) wrote:
> Add:
> 
> * ability to specificy various variants of an OS under the 'os' XML node.
> * API to add and query variants of an OS.

An example of the XML in the log would be nice

> ---
>  data/schemas/libosinfo.rng | 13 +++++++++++++
>  osinfo/libosinfo.syms      |  3 +++
>  osinfo/osinfo_loader.c     | 38 ++++++++++++++++++++++++++++++++++++++
>  osinfo/osinfo_os.c         | 37 +++++++++++++++++++++++++++++++++++++
>  osinfo/osinfo_os.h         |  4 ++++
>  5 files changed, 95 insertions(+)
> 
> diff --git a/data/schemas/libosinfo.rng b/data/schemas/libosinfo.rng
> index a504266..cc13982 100644
> --- a/data/schemas/libosinfo.rng
> +++ b/data/schemas/libosinfo.rng
> @@ -215,6 +215,16 @@
>      </interleave>
>    </define>
>  
> +  <define name='variant'>
> +    <element name='variant'>
> +      <attribute name='id'>
> +      </attribute>
> +      <element name='name'>
> +        <text/>
> +      </element>
> +    </element>
> +  </define>
> +
>    <define name='devices-rel'>
>      <element name='devices'>
>        <zeroOrMore>
> @@ -485,6 +495,9 @@
>            <ref name='release-status'/>
>          </optional>
>          <zeroOrMore>
> +          <ref name='variant'/>
> +        </zeroOrMore>
> +        <zeroOrMore>
>            <ref name='resources'/>
>          </zeroOrMore>
>          <zeroOrMore>
> diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
> index a70ac86..528c2a5 100644
> --- a/osinfo/libosinfo.syms
> +++ b/osinfo/libosinfo.syms
> @@ -448,6 +448,9 @@ LIBOSINFO_0.2.9 {
>  	osinfo_os_get_release_status;
>  	osinfo_release_status_get_type;
>  
> +	osinfo_os_add_variant;
> +	osinfo_os_get_variant_list;
> +
>  	osinfo_variant_get_type;
>  	osinfo_variant_get_name;
>  	osinfo_variant_new;
> diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
> index bb7e9a4..84dd843 100644
> --- a/osinfo/osinfo_loader.c
> +++ b/osinfo/osinfo_loader.c
> @@ -859,6 +859,7 @@ 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 },
> @@ -1005,6 +1006,25 @@ static OsinfoTree *osinfo_loader_tree (OsinfoLoader *loader,
>      return tree;
>  }
>  
> +static OsinfoVariant *osinfo_loader_variant (OsinfoLoader *loader,
> +                                             xmlXPathContextPtr ctxt,
> +                                             xmlNodePtr root,
> +                                             GError **err)
> +{
> +    const OsinfoEntityKey keys[] = {
> +        { OSINFO_VARIANT_PROP_NAME, G_TYPE_STRING },
> +        { NULL, G_TYPE_INVALID }
> +    };
> +
> +    gchar *id = (gchar *)xmlGetProp(root, BAD_CAST "id");
> +    OsinfoVariant *variant= osinfo_variant_new(id);
> +    xmlFree(id);
> +
> +    osinfo_loader_entity(loader, OSINFO_ENTITY(variant), keys, ctxt, root, err);
> +
> +    return variant;
> +}
> +
>  static OsinfoResources *osinfo_loader_resources(OsinfoLoader *loader,
>                                                  xmlXPathContextPtr ctxt,
>                                                  xmlNodePtr root,
> @@ -1230,6 +1250,24 @@ static void osinfo_loader_os(OsinfoLoader *loader,
>  
>      g_free(nodes);
>  
> +    nnodes = osinfo_loader_nodeset("./variant", ctxt, &nodes, err);
> +    if (error_is_set(err))
> +        goto cleanup;
> +
> +    for (i = 0 ; i < nnodes ; i++) {
> +        xmlNodePtr saved = ctxt->node;
> +        ctxt->node = nodes[i];
> +        OsinfoVariant *variant = osinfo_loader_variant(loader, ctxt, nodes[i], err);
> +        ctxt->node = saved;
> +        if (error_is_set(err))
> +            goto cleanup;
> +
> +        osinfo_os_add_variant (os, variant);
> +        g_object_unref(G_OBJECT(variant));
> +    }
> +
> +    g_free(nodes);
> +
>      nnodes = osinfo_loader_nodeset("./resources", ctxt, &nodes, err);
>      if (error_is_set(err))
>          goto cleanup;
> diff --git a/osinfo/osinfo_os.c b/osinfo/osinfo_os.c
> index 8d1cc66..ecab1c2 100644
> --- a/osinfo/osinfo_os.c
> +++ b/osinfo/osinfo_os.c
> @@ -52,6 +52,7 @@ struct _OsinfoOsPrivate
>  
>      OsinfoMediaList *medias;
>      OsinfoTreeList *trees;
> +    OsinfoVariantList *variants;
>      OsinfoResourcesList *minimum;
>      OsinfoResourcesList *recommended;
>  
> @@ -115,6 +116,7 @@ osinfo_os_finalize (GObject *object)
>      g_list_free(os->priv->deviceLinks);
>      g_object_unref(os->priv->medias);
>      g_object_unref(os->priv->trees);
> +    g_object_unref(os->priv->variants);
>  
>      g_object_unref(os->priv->scripts);
>  
> @@ -177,6 +179,7 @@ osinfo_os_init (OsinfoOs *os)
>      os->priv->deviceLinks = NULL;
>      os->priv->medias = osinfo_medialist_new ();
>      os->priv->trees = osinfo_treelist_new ();
> +    os->priv->variants = osinfo_variantlist_new ();
>      os->priv->minimum = osinfo_resourceslist_new ();
>      os->priv->recommended = osinfo_resourceslist_new ();
>      os->priv->scripts = osinfo_install_scriptlist_new ();
> @@ -490,6 +493,40 @@ void osinfo_os_add_tree(OsinfoOs *os, OsinfoTree *tree)
>  }
>  
>  /**
> + * osinfo_os_get_variant_list:
> + * @os: an operating system
> + *
> + * Gets all known variants of operating system @os.
> + *
> + * Returns: (transfer full): A list of variants
> + */
> +OsinfoVariantList *osinfo_os_get_variant_list(OsinfoOs *os)
> +{
> +    g_return_val_if_fail(OSINFO_IS_OS(os), NULL);
> +
> +    OsinfoVariantList *newList = osinfo_variantlist_new();
> +
> +    osinfo_list_add_all(OSINFO_LIST(newList), OSINFO_LIST(os->priv->variants));
> +
> +    return newList;
> +}
> +
> +/**
> + * osinfo_os_add_variant:
> + * @os: an operating system
> + * @variant: (transfer none): the variant to add
> + *
> + * Adds a variant @variant to operating system @os.
> + */
> +void osinfo_os_add_variant(OsinfoOs *os, OsinfoVariant *variant)
> +{
> +    g_return_if_fail(OSINFO_IS_OS(os));
> +    g_return_if_fail(OSINFO_IS_VARIANT(variant));
> +
> +    osinfo_list_add(OSINFO_LIST(os->priv->variants), OSINFO_ENTITY(variant));
> +}
> +
> +/**
>   * osinfo_os_get_minimum_resources:
>   * @os: an operating system
>   *
> diff --git a/osinfo/osinfo_os.h b/osinfo/osinfo_os.h
> index 433c511..f3ff54b 100644
> --- a/osinfo/osinfo_os.h
> +++ b/osinfo/osinfo_os.h
> @@ -29,6 +29,8 @@
>  #include <osinfo/osinfo_medialist.h>
>  #include <osinfo/osinfo_media.h>
>  #include <osinfo/osinfo_treelist.h>
> +#include <osinfo/osinfo_variant.h>
> +#include <osinfo/osinfo_variantlist.h>
>  #include <osinfo/osinfo_tree.h>
>  #include <osinfo/osinfo_resources.h>
>  #include <osinfo/osinfo_resourceslist.h>
> @@ -114,6 +116,8 @@ OsinfoMediaList *osinfo_os_get_media_list(OsinfoOs *os);
>  void osinfo_os_add_media(OsinfoOs *os, OsinfoMedia *media);
>  OsinfoTreeList *osinfo_os_get_tree_list(OsinfoOs *os);
>  void osinfo_os_add_tree(OsinfoOs *os, OsinfoTree *tree);
> +OsinfoVariantList *osinfo_os_get_variant_list(OsinfoOs *os);
> +void osinfo_os_add_variant(OsinfoOs *os, OsinfoVariant *variant);
>  OsinfoResourcesList *osinfo_os_get_minimum_resources(OsinfoOs *os);
>  OsinfoResourcesList *osinfo_os_get_recommended_resources(OsinfoOs *os);
>  void osinfo_os_add_minimum_resources(OsinfoOs *os, OsinfoResources *resources);
> -- 
> 1.8.4.2
> 
> _______________________________________________
> Libosinfo mailing list
> Libosinfo at redhat.com
> https://www.redhat.com/mailman/listinfo/libosinfo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libosinfo/attachments/20131127/d0d374a2/attachment.sig>


More information about the Libosinfo mailing list