[virt-tools-list] [libosinfo 5/5] Load localized values for entity params

Michal Privoznik mprivozn at redhat.com
Fri Oct 19 09:56:55 UTC 2012


On 19.10.2012 05:50, Zeeshan Ali (Khattak) wrote:
> From: "Zeeshan Ali (Khattak)" <zeeshanak at gnome.org>
> 
> Attempt to use the localized values of entity params if available before
> using the non-localized values.
> 
> This does not yet include custom (ones starting with 'x-') params as I
> haven't yet figured the right xpath magic to (cleanly) achieve that.
> Suggestions welcome!

We are again hitting the issue I've mentioned when I was updating the
RNG files. From XML/XPATH specification it is not possible to regexp
over element names. Therefore we need to switch to other scheme. We can
leave the 'x-' prefix, though. Something like:
  <x-attribute name='foo' value='bar'/>

> ---
>  osinfo/osinfo_loader.c | 33 +++++++++++++++++++++++++++------
>  1 file changed, 27 insertions(+), 6 deletions(-)
> 
> diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
> index 934c758..7569262 100644
> --- a/osinfo/osinfo_loader.c
> +++ b/osinfo/osinfo_loader.c
> @@ -219,14 +219,35 @@ static void osinfo_loader_entity(OsinfoLoader *loader,
>                                   GError **err)
>  {
>      int i = 0;
> +    const gchar * const *langs = g_get_language_names ();
>  
>      /* Standard well-known keys first, allow single value only */
> -    for (i = 0 ; keys[i] != NULL ; i++) {
> -        gchar *xpath = g_strdup_printf("string(./%s)", keys[i]);
> -        gchar *value = osinfo_loader_string(xpath, ctxt, err);
> -        g_free(xpath);
> -        if (error_is_set(err))
> -            return;
> +    for (i = 0 ; keys[i] != NULL; i++) {
> +        gchar *value = NULL;
> +        gchar *xpath;
> +        int j;
> +
> +        /* We are guaranteed to have at least the default "C" locale and we
> +         * want to ignore that, hence the NULL check on index 'j + 1'.
> +         */
> +        for (j = 0; langs[j + 1] != NULL; j++) {
> +            xpath = g_strdup_printf("string(./%s[lang('%s')])", keys[i], langs[j]);
> +            value = osinfo_loader_string(xpath, ctxt, err);
> +            g_free(xpath);
> +            if (error_is_set(err))
> +                return;
> +
> +            if (value != NULL)
> +                break;
> +        }
> +
> +        if (value == NULL) {
> +            xpath = g_strdup_printf("string(./%s)", keys[i]);
> +            value = osinfo_loader_string(xpath, ctxt, err);
> +            g_free(xpath);
> +            if (error_is_set(err))
> +                return;
> +        }
>  
>          if (value) {
>              osinfo_entity_set_param(entity, keys[i], value);
> 

Again, if an app was querying for 'vendor' attribute, for instance, if
the DB gets translated the application will not get any result even
though it was prior this change?

Michal




More information about the virt-tools-list mailing list