From: Christophe Fergeau <cfergeau@xxxxxxxxxx> This is done with the new ovirt_foreign_menu_set_current_iso_name_async function. Also, an error dialog will be shown in case anything goes wrong with the async method. Signed-off-by: Eduardo Lima (Etrunko) <etrunko@xxxxxxxxxx> --- src/ovirt-foreign-menu.c | 53 ++++++++++++++++++++++++++----------- src/ovirt-foreign-menu.h | 9 ++++++- src/remote-viewer-iso-list-dialog.c | 48 ++++++++++++++++++++++++--------- 3 files changed, 81 insertions(+), 29 deletions(-) diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c index 8320552..9979d37 100644 --- a/src/ovirt-foreign-menu.c +++ b/src/ovirt-foreign-menu.c @@ -47,7 +47,7 @@ static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu static void ovirt_foreign_menu_fetch_vm_cdrom_async(OvirtForeignMenu *menu); static void ovirt_foreign_menu_refresh_cdrom_file_async(OvirtForeignMenu *menu); static void ovirt_foreign_menu_fetch_iso_list_async(OvirtForeignMenu *menu); -static void updated_cdrom_cb(GObject *source_object, GAsyncResult *result, gpointer user_data); +static void iso_name_set_cb(GObject *source_object, GAsyncResult *result, gpointer user_data); G_DEFINE_TYPE (OvirtForeignMenu, ovirt_foreign_menu, G_TYPE_OBJECT) @@ -102,8 +102,14 @@ ovirt_foreign_menu_get_current_iso_name(OvirtForeignMenu *foreign_menu) void -ovirt_foreign_menu_set_current_iso_name(OvirtForeignMenu *foreign_menu, char *name) +ovirt_foreign_menu_set_current_iso_name_async(OvirtForeignMenu *foreign_menu, + char *name, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { + GTask *task; + g_return_if_fail(foreign_menu->priv->cdrom != NULL); g_return_if_fail(foreign_menu->priv->next_iso_name == NULL); @@ -118,11 +124,20 @@ ovirt_foreign_menu_set_current_iso_name(OvirtForeignMenu *foreign_menu, char *na g_object_set(foreign_menu->priv->cdrom, "file", name, NULL); + + task = g_task_new(foreign_menu, cancellable, callback, user_data); ovirt_cdrom_update_async(foreign_menu->priv->cdrom, TRUE, foreign_menu->priv->proxy, NULL, - updated_cdrom_cb, foreign_menu); + iso_name_set_cb, task); } +gboolean ovirt_foreign_menu_set_current_iso_name_finish(OvirtForeignMenu *foreign_menu, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail(OVIRT_IS_FOREIGN_MENU(foreign_menu), FALSE); + return g_task_propagate_boolean(G_TASK(result), error); +} GList* ovirt_foreign_menu_get_iso_names(OvirtForeignMenu *foreign_menu) @@ -359,31 +374,27 @@ ovirt_foreign_menu_start(OvirtForeignMenu *menu) } -static void updated_cdrom_cb(GObject *source_object, - GAsyncResult *result, - gpointer user_data) +static void iso_name_set_cb(GObject *source_object, + GAsyncResult *result, + gpointer user_data) { GError *error = NULL; OvirtForeignMenu *foreign_menu; gboolean updated; + GTask *task = G_TASK(user_data); - foreign_menu = OVIRT_FOREIGN_MENU(user_data); + foreign_menu = OVIRT_FOREIGN_MENU(g_task_get_source_object(task)); updated = ovirt_cdrom_update_finish(OVIRT_CDROM(source_object), result, &error); - g_debug("Finished updating cdrom content"); if (updated) { + g_debug("Finished updating cdrom content: '%s'", foreign_menu->priv->next_iso_name); g_free(foreign_menu->priv->current_iso_name); foreign_menu->priv->current_iso_name = foreign_menu->priv->next_iso_name; foreign_menu->priv->next_iso_name = NULL; + g_task_return_boolean(task, TRUE); goto end; } - /* Reset old state back as we were not successful in switching to - * the new ISO */ - if (error != NULL) { - g_warning("failed to update cdrom resource: %s", error->message); - g_clear_error(&error); - } g_debug("setting OvirtCdrom:file back to '%s'", foreign_menu->priv->current_iso_name); g_object_set(foreign_menu->priv->cdrom, @@ -391,11 +402,21 @@ static void updated_cdrom_cb(GObject *source_object, NULL); g_clear_pointer(&foreign_menu->priv->next_iso_name, g_free); + /* Reset old state back as we were not successful in switching to + * the new ISO */ + if (error != NULL) { + g_warning("failed to update cdrom resource: %s", error->message); + g_task_return_error(task, error); + } else { + g_warn_if_reached(); + g_task_return_new_error(task, OVIRT_ERROR, OVIRT_ERROR_FAILED, + "failed to update cdrom resource"); + } + end: - g_object_notify(G_OBJECT(foreign_menu), "file"); + g_object_unref(task); } - static void ovirt_foreign_menu_set_files(OvirtForeignMenu *menu, const GList *files) { diff --git a/src/ovirt-foreign-menu.h b/src/ovirt-foreign-menu.h index f1a1ddb..df4a50e 100644 --- a/src/ovirt-foreign-menu.h +++ b/src/ovirt-foreign-menu.h @@ -71,7 +71,14 @@ OvirtForeignMenu *ovirt_foreign_menu_new_from_file(VirtViewerFile *self); void ovirt_foreign_menu_start(OvirtForeignMenu *menu); char *ovirt_foreign_menu_get_current_iso_name(OvirtForeignMenu *menu); -void ovirt_foreign_menu_set_current_iso_name(OvirtForeignMenu *menu, char *name); +void ovirt_foreign_menu_set_current_iso_name_async(OvirtForeignMenu *foreign_menu, + char *name, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean ovirt_foreign_menu_set_current_iso_name_finish(OvirtForeignMenu *foreign_menu, + GAsyncResult *result, + GError **error); GList *ovirt_foreign_menu_get_iso_names(OvirtForeignMenu *menu); diff --git a/src/remote-viewer-iso-list-dialog.c b/src/remote-viewer-iso-list-dialog.c index dd652d7..5b1afb8 100644 --- a/src/remote-viewer-iso-list-dialog.c +++ b/src/remote-viewer-iso-list-dialog.c @@ -27,6 +27,9 @@ #include "virt-viewer-util.h" #include "ovirt-foreign-menu.h" +static void ovirt_foreign_menu_iso_name_changed(OvirtForeignMenu *foreign_menu, GAsyncResult *result, RemoteViewerISOListDialog *self); +static void remote_viewer_iso_list_dialog_show_error(RemoteViewerISOListDialog *self, gchar *message); + G_DEFINE_TYPE(RemoteViewerISOListDialog, remote_viewer_iso_list_dialog, GTK_TYPE_DIALOG) #define DIALOG_PRIVATE(o) \ @@ -180,7 +183,9 @@ remote_viewer_iso_list_dialog_toggled(GtkCellRendererToggle *cell_renderer G_GNU gtk_dialog_set_response_sensitive(GTK_DIALOG(self), GTK_RESPONSE_NONE, FALSE); gtk_widget_set_sensitive(priv->tree_view, FALSE); - ovirt_foreign_menu_set_current_iso_name(priv->foreign_menu, active ? NULL : name); + ovirt_foreign_menu_set_current_iso_name_async(priv->foreign_menu, active ? NULL : name, NULL, + (GAsyncReadyCallback)ovirt_foreign_menu_iso_name_changed, + self); gtk_tree_path_free(tree_path); g_free(name); } @@ -231,19 +236,44 @@ remote_viewer_iso_list_dialog_init(RemoteViewerISOListDialog *self) } static void -ovirt_foreign_menu_notify_file(OvirtForeignMenu *foreign_menu, - GParamSpec *pspec G_GNUC_UNUSED, - RemoteViewerISOListDialog *self) +remote_viewer_iso_list_dialog_show_error(RemoteViewerISOListDialog *self, + gchar *message) +{ + GtkWidget *dialog; + + g_warn_if_fail(message != NULL); + + dialog = gtk_message_dialog_new(GTK_WINDOW(self), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + message ? message : _("Unspecified error")); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +} + +static void +ovirt_foreign_menu_iso_name_changed(OvirtForeignMenu *foreign_menu, + GAsyncResult *result, + RemoteViewerISOListDialog *self) { RemoteViewerISOListDialogPrivate *priv = self->priv; GtkTreeModel *model = GTK_TREE_MODEL(priv->list_store); - char *current_iso = ovirt_foreign_menu_get_current_iso_name(foreign_menu); + char *current_iso; GtkTreeIter iter; gchar *name; gboolean active, match = FALSE; + GError *error = NULL; + + if (!ovirt_foreign_menu_set_current_iso_name_finish(foreign_menu, result, &error)) { + remote_viewer_iso_list_dialog_show_error(self, error ? error->message : _("Failed to change CD")); + g_clear_error(&error); + } if (!gtk_tree_model_get_iter_first(model, &iter)) - goto end; + return; + + current_iso = ovirt_foreign_menu_get_current_iso_name(foreign_menu); do { gtk_tree_model_get(model, &iter, @@ -268,8 +298,6 @@ ovirt_foreign_menu_notify_file(OvirtForeignMenu *foreign_menu, remote_viewer_iso_list_dialog_set_subtitle(self, current_iso); gtk_dialog_set_response_sensitive(GTK_DIALOG(self), GTK_RESPONSE_NONE, TRUE); gtk_widget_set_sensitive(priv->tree_view, TRUE); - -end: free(current_iso); } @@ -303,10 +331,6 @@ remote_viewer_iso_list_dialog_new(GtkWindow *parent, GObject *foreign_menu) self->priv->foreign_menu = OVIRT_FOREIGN_MENU(g_object_ref(foreign_menu)); g_signal_connect(foreign_menu, - "notify::file", - (GCallback)ovirt_foreign_menu_notify_file, - dialog); - g_signal_connect(foreign_menu, "notify::files", (GCallback)ovirt_foreign_menu_notify_files, dialog); -- 2.7.4 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list