summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2016-11-03 19:22:12 +0100
committerChristophe Fergeau <cfergeau@redhat.com>2016-11-03 19:24:48 +0100
commit58ea8fd438b86aae1ee4ba46aa30408896b873ec (patch)
treefc9616eb7f57df121499c02143ed7bf839f73da2
parent2b1082c4721e16831a39ccaf0127158dd3d92fb8 (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.c84
-rw-r--r--src/ovirt-foreign-menu.h8
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);