[virt-tools-list] [RFC virt-viewer 03/12] vv-file: Add VirtViewerFile::versions
Pavel Grunt
pgrunt at redhat.com
Wed Jun 3 13:44:58 UTC 2015
On Tue, 2015-06-02 at 16:29 +0200, Christophe Fergeau wrote:
> Specifying a single minimal version in the .vv file is not enough as
> the client version will be highly dependent on the OS it's running in.
> Windows versioning is not the same as linux versioning, Fedora 21 and
> Fedora 22 may have different release numbers for the same version,
> and we may want to force a specific minimal release in case of a
> critical bug fix.
>
> This commit adds supports for a 'versions' field in .vv files where a
> list of os-id:version couples can be stored.
> ---
> man/remote-viewer.pod | 7 +++++
> src/virt-viewer-file.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++
> -
> src/virt-viewer-file.h | 2 ++
> 3 files changed, 81 insertions(+), 1 deletion(-)
>
> diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod
> index 00b474c..8910bb0 100644
> --- a/man/remote-viewer.pod
> +++ b/man/remote-viewer.pod
> @@ -147,6 +147,13 @@ Version comparison is done by comparing each integer from
> the list one by
> one. If any of the component is not a number, the version comparison will
> fail
> and consider that the 2 versions are considered to be the same.
>
> +=item C<versions> (osid:version list)
> +
> +This is a list of osid:version couples separated by ';'. osid is an arbitrary
> string, version is
> +a version number in the same format as in the 'version' field. A given couple
> indicates that
> +remote-viewer builds matching the given 'osid' (fedora22, debian70, ...) must
> +be at least version 'version'.
> +
> =item C<type> (string, mandatory)
>
> The session type, either "spice", "vnc" or "ovirt".
> diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c
> index 23eae31..5b13e07 100644
> --- a/src/virt-viewer-file.c
> +++ b/src/virt-viewer-file.c
> @@ -2,7 +2,7 @@
> /*
> * Virt Viewer: A virtual machine console viewer
> *
> - * Copyright (C) 2012 Red Hat, Inc.
> + * Copyright (C) 2012-2015 Red Hat, Inc.
> *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License as published by
> @@ -39,6 +39,7 @@
> *
> * The current list of [virt-viewer] keys is:
> * - version: string
> + * - versions: list of id:versions strings
> * - type: string, mandatory, values: "spice" (later "vnc" etc..)
> * - host: string
> * - port: int
> @@ -118,6 +119,7 @@ enum {
> PROP_USB_FILTER,
> PROP_PROXY,
> PROP_VERSION,
> + PROP_VERSIONS,
> PROP_SECURE_CHANNELS,
> PROP_DELETE_THIS_FILE,
> PROP_SECURE_ATTENTION,
> @@ -615,6 +617,65 @@ virt_viewer_file_set_version(VirtViewerFile* self, const
> gchar* value)
> g_object_notify(G_OBJECT(self), "version");
> }
>
> +GHashTable*
> +virt_viewer_file_get_versions(VirtViewerFile* self)
> +{
> + GHashTable *versions;
> + gchar **versions_str;
> + gsize length;
> + unsigned int i;
> +
> + versions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
> g_free);
> + versions_str = virt_viewer_file_get_string_list(self, MAIN_GROUP,
> + "versions", &length);
> + for (i = 0; i < length; i++) {
> + GStrv tokens;
> +
> + if (versions_str[i] == NULL) {
> + g_warn_if_reached();
> + break;
> + }
> + tokens = g_strsplit(versions_str[i], ":", 2);
> + if (g_strv_length(tokens) != 2) {
> + g_warn_if_reached();
> + continue;
> + }
> + g_debug("Minimum version '%s' for OS id '%s'", tokens[0], tokens[1]);
not g_debug("Minimum version '%s' for OS id '%s'", tokens[1], tokens[0]); ?
> + g_hash_table_insert(versions, tokens[0], tokens[1]);
> + g_free(tokens);
> + }
> + g_strfreev(versions_str);
> +
> + return versions;
> +}
> +
> +void
> +virt_viewer_file_set_versions(VirtViewerFile* self, GHashTable
> *version_table)
> +{
> + GHashTableIter iter;
> + gpointer key, value;
> + GPtrArray *versions;
> +
> + versions = g_ptr_array_new_with_free_func(g_free);
> +
> + g_hash_table_iter_init(&iter, version_table);
> + while (g_hash_table_iter_next(&iter, &key, &value)) {
> + char *str;
> +
> + /* Check that id only contains letters/numbers/- */
> + /* Check that version only contains numbers, ., :, -, (letters ?) */
> + /* FIXME: ':' separator overlaps with ':' epoch indicator */
> +
> + str = g_strdup_printf("%s:%s", (char *)key, (char *)value);
> + g_ptr_array_add(versions, str);
> + }
> + virt_viewer_file_set_string_list(self, MAIN_GROUP, "versions",
> + (const char * const *)versions->pdata,
> + versions->len);
> + g_ptr_array_unref(versions);
> + g_object_notify(G_OBJECT(self), "versions");
> +}
> +
> gchar**
> virt_viewer_file_get_secure_channels(VirtViewerFile* self, gsize* length)
> {
> @@ -862,6 +923,9 @@ virt_viewer_file_set_property(GObject* object, guint
> property_id,
> case PROP_VERSION:
> virt_viewer_file_set_version(self, g_value_get_string(value));
> break;
> + case PROP_VERSIONS:
> + virt_viewer_file_set_versions(self, g_value_get_boxed(value));
> + break;
> case PROP_SECURE_CHANNELS:
> strv = g_value_get_boxed(value);
> virt_viewer_file_set_secure_channels(self, (const gchar* const*)strv,
> g_strv_length(strv));
> @@ -966,6 +1030,9 @@ virt_viewer_file_get_property(GObject* object, guint
> property_id,
> case PROP_VERSION:
> g_value_take_string(value, virt_viewer_file_get_version(self));
> break;
> + case PROP_VERSIONS:
> + g_value_take_boxed(value, virt_viewer_file_get_versions(self));
> + break;
> case PROP_SECURE_CHANNELS:
> g_value_take_boxed(value, virt_viewer_file_get_secure_channels(self,
> NULL));
> break;
> @@ -1114,6 +1181,10 @@ virt_viewer_file_class_init(VirtViewerFileClass* klass)
> g_param_spec_string("version", "version", "version", NULL,
> G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
>
> + g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_VERSIONS,
> + g_param_spec_boxed("versions", "versions", "versions",
> G_TYPE_HASH_TABLE,
> + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
> +
> g_object_class_install_property(G_OBJECT_CLASS(klass),
> PROP_SECURE_CHANNELS,
> g_param_spec_boxed("secure-channels", "secure-channels", "secure
> -channels", G_TYPE_STRV,
> G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
> diff --git a/src/virt-viewer-file.h b/src/virt-viewer-file.h
> index e84988a..1635507 100644
> --- a/src/virt-viewer-file.h
> +++ b/src/virt-viewer-file.h
> @@ -102,6 +102,8 @@ gchar* virt_viewer_file_get_proxy(VirtViewerFile* self);
> void virt_viewer_file_set_proxy(VirtViewerFile* self, const gchar* value);
> gchar* virt_viewer_file_get_version(VirtViewerFile* self);
> void virt_viewer_file_set_version(VirtViewerFile* self, const gchar* value);
> +GHashTable* virt_viewer_file_get_versions(VirtViewerFile* self);
> +void virt_viewer_file_set_versions(VirtViewerFile* self, GHashTable
> *version_table);
> gchar** virt_viewer_file_get_secure_channels(VirtViewerFile* self, gsize*
> length);
> void virt_viewer_file_set_secure_channels(VirtViewerFile* self, const gchar*
> const* value, gsize length);
> gint virt_viewer_file_get_delete_this_file(VirtViewerFile* self);
More information about the virt-tools-list
mailing list