diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2016-11-03 19:22:12 +0100 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2016-11-03 19:24:48 +0100 |
commit | 58ea8fd438b86aae1ee4ba46aa30408896b873ec (patch) | |
tree | fc9616eb7f57df121499c02143ed7bf839f73da2 | |
parent | 2b1082c4721e16831a39ccaf0127158dd3d92fb8 (diff) |
ovirt-foreign-menu: Set new ISO name using GTask API
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@redhat.com>
-rw-r--r-- | src/ovirt-foreign-menu.c | 84 | ||||
-rw-r--r-- | src/ovirt-foreign-menu.h | 8 |
2 files changed, 70 insertions, 22 deletions
diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c index bea70c3..53c08f4 100644 --- a/src/ovirt-foreign-menu.c +++ b/src/ovirt-foreign-menu.c @@ -47,6 +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 iso_name_set_cb(GObject *source_object, GAsyncResult *result, gpointer user_data); G_DEFINE_TYPE (OvirtForeignMenu, ovirt_foreign_menu, G_TYPE_OBJECT) @@ -100,6 +101,44 @@ ovirt_foreign_menu_get_current_iso_name(OvirtForeignMenu *foreign_menu) } +void +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); + + if (name) { + g_debug("Updating VM cdrom image to '%s'", name); + foreign_menu->priv->next_iso_name = g_strdup(name); + } else { + g_debug("Removing current cdrom image"); + foreign_menu->priv->next_iso_name = NULL; + } + + 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, + 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) { @@ -351,38 +390,49 @@ menu_item_set_active_no_signal(GtkMenuItem *menuitem, } -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_object_notify(G_OBJECT(foreign_menu), "file"); + g_task_return_boolean(task, TRUE); + goto end; } else { /* Reset old state back as we were not successful in switching to * the new ISO */ const char *current_file = foreign_menu->priv->current_iso_name; - 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'", current_file?current_file:NULL); g_object_set(foreign_menu->priv->cdrom, "file", current_file, NULL); + + 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"); + } } g_clear_pointer(&foreign_menu->priv->next_iso_name, g_free); + +end: + g_object_unref(task); } @@ -390,7 +440,7 @@ static void ovirt_foreign_menu_activate_item_cb(GtkMenuItem *menuitem, gpointer user_data) { OvirtForeignMenu *foreign_menu; - const char *iso_name; + const char *iso_name = NULL; gboolean checked; checked = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); @@ -410,19 +460,9 @@ ovirt_foreign_menu_activate_item_cb(GtkMenuItem *menuitem, gpointer user_data) if (checked) { iso_name = gtk_menu_item_get_label(menuitem); - g_debug("Updating VM cdrom image to '%s'", iso_name); - foreign_menu->priv->next_iso_name = g_strdup(iso_name); - } else { - g_debug("Removing current cdrom image"); - iso_name = NULL; - foreign_menu->priv->next_iso_name = NULL; } - g_object_set(foreign_menu->priv->cdrom, - "file", iso_name, - NULL); - ovirt_cdrom_update_async(foreign_menu->priv->cdrom, TRUE, - foreign_menu->priv->proxy, NULL, - updated_cdrom_cb, foreign_menu); + + ovirt_foreign_menu_set_current_iso_name(foreign_menu, iso_name); } diff --git a/src/ovirt-foreign-menu.h b/src/ovirt-foreign-menu.h index 6ed17cc..29a4476 100644 --- a/src/ovirt-foreign-menu.h +++ b/src/ovirt-foreign-menu.h @@ -73,6 +73,14 @@ void ovirt_foreign_menu_start(OvirtForeignMenu *menu); GtkWidget *ovirt_foreign_menu_get_gtk_menu(OvirtForeignMenu *foreign_menu); char *ovirt_foreign_menu_get_current_iso_name(OvirtForeignMenu *menu); +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); |