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); _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list