|
|
48c875 |
From 4254c8305c1f7d48cf92eeff63434f1618542260 Mon Sep 17 00:00:00 2001
|
|
|
48c875 |
From: "Eduardo Lima (Etrunko)" <etrunko@redhat.com>
|
|
|
48c875 |
Date: Tue, 17 Jan 2017 18:14:15 -0200
|
|
|
48c875 |
Subject: [PATCH 07/26] ovirt-foreign-menu: Fetch ISO names using GTask API
|
|
|
48c875 |
|
|
|
48c875 |
Similar to the previous commit, the ISO dialog will fetch the result
|
|
|
48c875 |
asynchronously, rather than relying on the "notify::files" signal from
|
|
|
48c875 |
OvirtForeignMenu object. It also enables error to be shown if anything
|
|
|
48c875 |
goes wrong.
|
|
|
48c875 |
|
|
|
48c875 |
Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
|
|
|
48c875 |
---
|
|
|
48c875 |
src/ovirt-foreign-menu.c | 182 ++++++++++++++++++++++++++++-------------------
|
|
|
48c875 |
src/ovirt-foreign-menu.h | 9 ++-
|
|
|
48c875 |
src/remote-viewer.c | 45 ++++++++++--
|
|
|
48c875 |
3 files changed, 156 insertions(+), 80 deletions(-)
|
|
|
48c875 |
|
|
|
48c875 |
diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c
|
|
|
48c875 |
index a422ebb..8a99665 100644
|
|
|
48c875 |
--- a/src/ovirt-foreign-menu.c
|
|
|
48c875 |
+++ b/src/ovirt-foreign-menu.c
|
|
|
48c875 |
@@ -40,13 +40,13 @@ typedef enum {
|
|
|
48c875 |
STATE_ISOS
|
|
|
48c875 |
} OvirtForeignMenuState;
|
|
|
48c875 |
|
|
|
48c875 |
-static void ovirt_foreign_menu_next_async_step(OvirtForeignMenu *menu, OvirtForeignMenuState state);
|
|
|
48c875 |
-static void ovirt_foreign_menu_fetch_api_async(OvirtForeignMenu *menu);
|
|
|
48c875 |
-static void ovirt_foreign_menu_fetch_vm_async(OvirtForeignMenu *menu);
|
|
|
48c875 |
-static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu);
|
|
|
48c875 |
-static void ovirt_foreign_menu_fetch_vm_cdrom_async(OvirtForeignMenu *menu);
|
|
|
48c875 |
-static void ovirt_foreign_menu_refresh_cdrom_file_async(OvirtForeignMenu *menu);
|
|
|
48c875 |
-static gboolean ovirt_foreign_menu_refresh_iso_list(gpointer user_data);
|
|
|
48c875 |
+static void ovirt_foreign_menu_next_async_step(OvirtForeignMenu *menu, GTask *task, OvirtForeignMenuState state);
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_api_async(OvirtForeignMenu *menu, GTask *task);
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_vm_async(OvirtForeignMenu *menu, GTask *task);
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu, GTask *task);
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_vm_cdrom_async(OvirtForeignMenu *menu, GTask *task);
|
|
|
48c875 |
+static void ovirt_foreign_menu_refresh_cdrom_file_async(OvirtForeignMenu *menu, GTask *task);
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_iso_list_async(OvirtForeignMenu *menu, GTask *task);
|
|
|
48c875 |
|
|
|
48c875 |
G_DEFINE_TYPE (OvirtForeignMenu, ovirt_foreign_menu, G_TYPE_OBJECT)
|
|
|
48c875 |
|
|
|
48c875 |
@@ -273,11 +273,9 @@ OvirtForeignMenu* ovirt_foreign_menu_new(OvirtProxy *proxy)
|
|
|
48c875 |
|
|
|
48c875 |
static void
|
|
|
48c875 |
ovirt_foreign_menu_next_async_step(OvirtForeignMenu *menu,
|
|
|
48c875 |
+ GTask *task,
|
|
|
48c875 |
OvirtForeignMenuState current_state)
|
|
|
48c875 |
{
|
|
|
48c875 |
- g_return_if_fail(current_state >= STATE_0);
|
|
|
48c875 |
- g_return_if_fail(current_state < STATE_ISOS);
|
|
|
48c875 |
-
|
|
|
48c875 |
/* Each state will check if the member is initialized, falling directly to
|
|
|
48c875 |
* the next one if so. If not, the callback for the asynchronous call will
|
|
|
48c875 |
* be responsible for calling is function again with the next state as
|
|
|
48c875 |
@@ -286,26 +284,26 @@ ovirt_foreign_menu_next_async_step(OvirtForeignMenu *menu,
|
|
|
48c875 |
switch (current_state + 1) {
|
|
|
48c875 |
case STATE_API:
|
|
|
48c875 |
if (menu->priv->api == NULL) {
|
|
|
48c875 |
- ovirt_foreign_menu_fetch_api_async(menu);
|
|
|
48c875 |
+ ovirt_foreign_menu_fetch_api_async(menu, task);
|
|
|
48c875 |
break;
|
|
|
48c875 |
}
|
|
|
48c875 |
case STATE_VM:
|
|
|
48c875 |
if (menu->priv->vm == NULL) {
|
|
|
48c875 |
- ovirt_foreign_menu_fetch_vm_async(menu);
|
|
|
48c875 |
+ ovirt_foreign_menu_fetch_vm_async(menu, task);
|
|
|
48c875 |
break;
|
|
|
48c875 |
}
|
|
|
48c875 |
case STATE_STORAGE_DOMAIN:
|
|
|
48c875 |
if (menu->priv->files == NULL) {
|
|
|
48c875 |
- ovirt_foreign_menu_fetch_storage_domain_async(menu);
|
|
|
48c875 |
+ ovirt_foreign_menu_fetch_storage_domain_async(menu, task);
|
|
|
48c875 |
break;
|
|
|
48c875 |
}
|
|
|
48c875 |
case STATE_VM_CDROM:
|
|
|
48c875 |
if (menu->priv->cdrom == NULL) {
|
|
|
48c875 |
- ovirt_foreign_menu_fetch_vm_cdrom_async(menu);
|
|
|
48c875 |
+ ovirt_foreign_menu_fetch_vm_cdrom_async(menu, task);
|
|
|
48c875 |
break;
|
|
|
48c875 |
}
|
|
|
48c875 |
case STATE_CDROM_FILE:
|
|
|
48c875 |
- ovirt_foreign_menu_refresh_cdrom_file_async(menu);
|
|
|
48c875 |
+ ovirt_foreign_menu_refresh_cdrom_file_async(menu, task);
|
|
|
48c875 |
break;
|
|
|
48c875 |
case STATE_ISOS:
|
|
|
48c875 |
g_warn_if_fail(menu->priv->api != NULL);
|
|
|
48c875 |
@@ -313,18 +311,35 @@ ovirt_foreign_menu_next_async_step(OvirtForeignMenu *menu,
|
|
|
48c875 |
g_warn_if_fail(menu->priv->files != NULL);
|
|
|
48c875 |
g_warn_if_fail(menu->priv->cdrom != NULL);
|
|
|
48c875 |
|
|
|
48c875 |
- ovirt_foreign_menu_refresh_iso_list(menu);
|
|
|
48c875 |
+ ovirt_foreign_menu_fetch_iso_list_async(menu, task);
|
|
|
48c875 |
break;
|
|
|
48c875 |
default:
|
|
|
48c875 |
g_warn_if_reached();
|
|
|
48c875 |
+ g_task_return_new_error(task, OVIRT_ERROR, OVIRT_ERROR_FAILED,
|
|
|
48c875 |
+ "Invalid state: %d", current_state);
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
}
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
void
|
|
|
48c875 |
-ovirt_foreign_menu_start(OvirtForeignMenu *menu)
|
|
|
48c875 |
+ovirt_foreign_menu_fetch_iso_names_async(OvirtForeignMenu *menu,
|
|
|
48c875 |
+ GCancellable *cancellable,
|
|
|
48c875 |
+ GAsyncReadyCallback callback,
|
|
|
48c875 |
+ gpointer user_data)
|
|
|
48c875 |
+{
|
|
|
48c875 |
+ GTask *task = g_task_new(menu, cancellable, callback, user_data);
|
|
|
48c875 |
+ ovirt_foreign_menu_next_async_step(menu, task, STATE_0);
|
|
|
48c875 |
+}
|
|
|
48c875 |
+
|
|
|
48c875 |
+
|
|
|
48c875 |
+GList *
|
|
|
48c875 |
+ovirt_foreign_menu_fetch_iso_names_finish(OvirtForeignMenu *foreign_menu,
|
|
|
48c875 |
+ GAsyncResult *result,
|
|
|
48c875 |
+ GError **error)
|
|
|
48c875 |
{
|
|
|
48c875 |
- ovirt_foreign_menu_next_async_step(menu, STATE_0);
|
|
|
48c875 |
+ g_return_val_if_fail(OVIRT_IS_FOREIGN_MENU(foreign_menu), NULL);
|
|
|
48c875 |
+ return g_task_propagate_pointer(G_TASK(result), error);
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
@@ -545,7 +560,6 @@ static void ovirt_foreign_menu_set_files(OvirtForeignMenu *menu,
|
|
|
48c875 |
|
|
|
48c875 |
g_list_free_full(menu->priv->iso_names, (GDestroyNotify)g_free);
|
|
|
48c875 |
menu->priv->iso_names = sorted_files;
|
|
|
48c875 |
- g_object_notify(G_OBJECT(menu), "files");
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
@@ -553,14 +567,16 @@ static void cdrom_file_refreshed_cb(GObject *source_object,
|
|
|
48c875 |
GAsyncResult *result,
|
|
|
48c875 |
gpointer user_data)
|
|
|
48c875 |
{
|
|
|
48c875 |
+ GTask *task = G_TASK(user_data);
|
|
|
48c875 |
+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(g_task_get_source_object(task));
|
|
|
48c875 |
OvirtResource *cdrom = OVIRT_RESOURCE(source_object);
|
|
|
48c875 |
- OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data);
|
|
|
48c875 |
GError *error = NULL;
|
|
|
48c875 |
|
|
|
48c875 |
ovirt_resource_refresh_finish(cdrom, result, &error);
|
|
|
48c875 |
if (error != NULL) {
|
|
|
48c875 |
g_warning("failed to refresh cdrom content: %s", error->message);
|
|
|
48c875 |
- g_clear_error(&error);
|
|
|
48c875 |
+ g_task_return_error(task, error);
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
return;
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
@@ -573,20 +589,24 @@ static void cdrom_file_refreshed_cb(GObject *source_object,
|
|
|
48c875 |
}
|
|
|
48c875 |
g_object_notify(G_OBJECT(menu), "file");
|
|
|
48c875 |
if (menu->priv->cdrom != NULL) {
|
|
|
48c875 |
- ovirt_foreign_menu_next_async_step(menu, STATE_CDROM_FILE);
|
|
|
48c875 |
+ ovirt_foreign_menu_next_async_step(menu, task, STATE_CDROM_FILE);
|
|
|
48c875 |
} else {
|
|
|
48c875 |
g_debug("Could not find VM cdrom through oVirt REST API");
|
|
|
48c875 |
+ g_task_return_new_error(task, OVIRT_ERROR, OVIRT_ERROR_FAILED,
|
|
|
48c875 |
+ "Could not find VM cdrom through oVirt REST API");
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
}
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
-static void ovirt_foreign_menu_refresh_cdrom_file_async(OvirtForeignMenu *menu)
|
|
|
48c875 |
+static void ovirt_foreign_menu_refresh_cdrom_file_async(OvirtForeignMenu *menu,
|
|
|
48c875 |
+ GTask *task)
|
|
|
48c875 |
{
|
|
|
48c875 |
g_return_if_fail(OVIRT_IS_RESOURCE(menu->priv->cdrom));
|
|
|
48c875 |
|
|
|
48c875 |
ovirt_resource_refresh_async(OVIRT_RESOURCE(menu->priv->cdrom),
|
|
|
48c875 |
- menu->priv->proxy, NULL,
|
|
|
48c875 |
- cdrom_file_refreshed_cb, menu);
|
|
|
48c875 |
+ menu->priv->proxy, g_task_get_cancellable(task),
|
|
|
48c875 |
+ cdrom_file_refreshed_cb, task);
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
@@ -596,7 +616,8 @@ static void cdroms_fetched_cb(GObject *source_object,
|
|
|
48c875 |
{
|
|
|
48c875 |
GHashTable *cdroms;
|
|
|
48c875 |
OvirtCollection *cdrom_collection = OVIRT_COLLECTION(source_object);
|
|
|
48c875 |
- OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data);
|
|
|
48c875 |
+ GTask *task = G_TASK(user_data);
|
|
|
48c875 |
+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(g_task_get_source_object(task));
|
|
|
48c875 |
GHashTableIter iter;
|
|
|
48c875 |
OvirtCdrom *cdrom;
|
|
|
48c875 |
GError *error = NULL;
|
|
|
48c875 |
@@ -604,7 +625,8 @@ static void cdroms_fetched_cb(GObject *source_object,
|
|
|
48c875 |
ovirt_collection_fetch_finish(cdrom_collection, result, &error);
|
|
|
48c875 |
if (error != NULL) {
|
|
|
48c875 |
g_warning("failed to fetch cdrom collection: %s", error->message);
|
|
|
48c875 |
- g_clear_error(&error);
|
|
|
48c875 |
+ g_task_return_error(task, error);
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
return;
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
@@ -626,20 +648,25 @@ static void cdroms_fetched_cb(GObject *source_object,
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
if (menu->priv->cdrom != NULL) {
|
|
|
48c875 |
- ovirt_foreign_menu_next_async_step(menu, STATE_VM_CDROM);
|
|
|
48c875 |
+ ovirt_foreign_menu_next_async_step(menu, task, STATE_VM_CDROM);
|
|
|
48c875 |
} else {
|
|
|
48c875 |
g_debug("Could not find VM cdrom through oVirt REST API");
|
|
|
48c875 |
+ g_task_return_new_error(task, OVIRT_ERROR, OVIRT_ERROR_FAILED,
|
|
|
48c875 |
+ "Could not find VM cdrom through oVirt REST API");
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
}
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
-static void ovirt_foreign_menu_fetch_vm_cdrom_async(OvirtForeignMenu *menu)
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_vm_cdrom_async(OvirtForeignMenu *menu,
|
|
|
48c875 |
+ GTask *task)
|
|
|
48c875 |
{
|
|
|
48c875 |
OvirtCollection *cdrom_collection;
|
|
|
48c875 |
|
|
|
48c875 |
cdrom_collection = ovirt_vm_get_cdroms(menu->priv->vm);
|
|
|
48c875 |
- ovirt_collection_fetch_async(cdrom_collection, menu->priv->proxy, NULL,
|
|
|
48c875 |
- cdroms_fetched_cb, menu);
|
|
|
48c875 |
+ ovirt_collection_fetch_async(cdrom_collection, menu->priv->proxy,
|
|
|
48c875 |
+ g_task_get_cancellable(task),
|
|
|
48c875 |
+ cdroms_fetched_cb, task);
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
@@ -648,7 +675,8 @@ static void storage_domains_fetched_cb(GObject *source_object,
|
|
|
48c875 |
gpointer user_data)
|
|
|
48c875 |
{
|
|
|
48c875 |
GError *error = NULL;
|
|
|
48c875 |
- OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data);
|
|
|
48c875 |
+ GTask *task = G_TASK(user_data);
|
|
|
48c875 |
+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(g_task_get_source_object(task));
|
|
|
48c875 |
OvirtCollection *collection = OVIRT_COLLECTION(source_object);
|
|
|
48c875 |
GHashTableIter iter;
|
|
|
48c875 |
OvirtStorageDomain *domain;
|
|
|
48c875 |
@@ -656,7 +684,8 @@ static void storage_domains_fetched_cb(GObject *source_object,
|
|
|
48c875 |
ovirt_collection_fetch_finish(collection, result, &error);
|
|
|
48c875 |
if (error != NULL) {
|
|
|
48c875 |
g_warning("failed to fetch storage domains: %s", error->message);
|
|
|
48c875 |
- g_clear_error(&error);
|
|
|
48c875 |
+ g_task_return_error(task, error);
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
return;
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
@@ -687,21 +716,25 @@ static void storage_domains_fetched_cb(GObject *source_object,
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
if (menu->priv->files != NULL) {
|
|
|
48c875 |
- ovirt_foreign_menu_next_async_step(menu, STATE_STORAGE_DOMAIN);
|
|
|
48c875 |
+ ovirt_foreign_menu_next_async_step(menu, task, STATE_STORAGE_DOMAIN);
|
|
|
48c875 |
} else {
|
|
|
48c875 |
g_debug("Could not find iso file collection");
|
|
|
48c875 |
+ g_task_return_new_error(task, OVIRT_ERROR, OVIRT_ERROR_FAILED,
|
|
|
48c875 |
+ "Could not find ISO file collection");
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
}
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
-static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu)
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu,
|
|
|
48c875 |
+ GTask *task)
|
|
|
48c875 |
{
|
|
|
48c875 |
- OvirtCollection *collection;
|
|
|
48c875 |
+ OvirtCollection *collection = ovirt_api_get_storage_domains(menu->priv->api);
|
|
|
48c875 |
|
|
|
48c875 |
g_debug("Start fetching oVirt REST collection");
|
|
|
48c875 |
- collection = ovirt_api_get_storage_domains(menu->priv->api);
|
|
|
48c875 |
- ovirt_collection_fetch_async(collection, menu->priv->proxy, NULL,
|
|
|
48c875 |
- storage_domains_fetched_cb, menu);
|
|
|
48c875 |
+ ovirt_collection_fetch_async(collection, menu->priv->proxy,
|
|
|
48c875 |
+ g_task_get_cancellable(task),
|
|
|
48c875 |
+ storage_domains_fetched_cb, task);
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
@@ -710,16 +743,17 @@ static void vms_fetched_cb(GObject *source_object,
|
|
|
48c875 |
gpointer user_data)
|
|
|
48c875 |
{
|
|
|
48c875 |
GError *error = NULL;
|
|
|
48c875 |
- OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data);
|
|
|
48c875 |
- OvirtCollection *collection;
|
|
|
48c875 |
+ GTask *task = G_TASK(user_data);
|
|
|
48c875 |
+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(g_task_get_source_object(task));
|
|
|
48c875 |
+ OvirtCollection *collection = OVIRT_COLLECTION(source_object);
|
|
|
48c875 |
GHashTableIter iter;
|
|
|
48c875 |
OvirtVm *vm;
|
|
|
48c875 |
|
|
|
48c875 |
- collection = OVIRT_COLLECTION(source_object);
|
|
|
48c875 |
ovirt_collection_fetch_finish(collection, result, &error);
|
|
|
48c875 |
if (error != NULL) {
|
|
|
48c875 |
g_debug("failed to fetch VM list: %s", error->message);
|
|
|
48c875 |
- g_clear_error(&error);
|
|
|
48c875 |
+ g_task_return_error(task, error);
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
return;
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
@@ -736,14 +770,18 @@ static void vms_fetched_cb(GObject *source_object,
|
|
|
48c875 |
g_free(guid);
|
|
|
48c875 |
}
|
|
|
48c875 |
if (menu->priv->vm != NULL) {
|
|
|
48c875 |
- ovirt_foreign_menu_next_async_step(menu, STATE_VM);
|
|
|
48c875 |
+ ovirt_foreign_menu_next_async_step(menu, task, STATE_VM);
|
|
|
48c875 |
} else {
|
|
|
48c875 |
g_warning("failed to find a VM with guid \"%s\"", menu->priv->vm_guid);
|
|
|
48c875 |
+ g_task_return_new_error(task, OVIRT_ERROR, OVIRT_ERROR_FAILED,
|
|
|
48c875 |
+ "Could not find a VM with guid \"%s\"", menu->priv->vm_guid);
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
}
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
-static void ovirt_foreign_menu_fetch_vm_async(OvirtForeignMenu *menu)
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_vm_async(OvirtForeignMenu *menu,
|
|
|
48c875 |
+ GTask *task)
|
|
|
48c875 |
{
|
|
|
48c875 |
OvirtCollection *vms;
|
|
|
48c875 |
|
|
|
48c875 |
@@ -753,7 +791,8 @@ static void ovirt_foreign_menu_fetch_vm_async(OvirtForeignMenu *menu)
|
|
|
48c875 |
|
|
|
48c875 |
vms = ovirt_api_get_vms(menu->priv->api);
|
|
|
48c875 |
ovirt_collection_fetch_async(vms, menu->priv->proxy,
|
|
|
48c875 |
- NULL, vms_fetched_cb, menu);
|
|
|
48c875 |
+ g_task_get_cancellable(task),
|
|
|
48c875 |
+ vms_fetched_cb, task);
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
@@ -762,31 +801,35 @@ static void api_fetched_cb(GObject *source_object,
|
|
|
48c875 |
gpointer user_data)
|
|
|
48c875 |
{
|
|
|
48c875 |
GError *error = NULL;
|
|
|
48c875 |
- OvirtProxy *proxy;
|
|
|
48c875 |
- OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data);
|
|
|
48c875 |
+ GTask *task = G_TASK(user_data);
|
|
|
48c875 |
+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(g_task_get_source_object(task));
|
|
|
48c875 |
+ OvirtProxy *proxy = OVIRT_PROXY(source_object);
|
|
|
48c875 |
|
|
|
48c875 |
- proxy = OVIRT_PROXY(source_object);
|
|
|
48c875 |
menu->priv->api = ovirt_proxy_fetch_api_finish(proxy, result, &error);
|
|
|
48c875 |
if (error != NULL) {
|
|
|
48c875 |
g_debug("failed to fetch toplevel API object: %s", error->message);
|
|
|
48c875 |
- g_clear_error(&error);
|
|
|
48c875 |
+ g_task_return_error(task, error);
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
return;
|
|
|
48c875 |
}
|
|
|
48c875 |
g_return_if_fail(OVIRT_IS_API(menu->priv->api));
|
|
|
48c875 |
g_object_ref(menu->priv->api);
|
|
|
48c875 |
|
|
|
48c875 |
- ovirt_foreign_menu_next_async_step(menu, STATE_API);
|
|
|
48c875 |
+ ovirt_foreign_menu_next_async_step(menu, task, STATE_API);
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
-static void ovirt_foreign_menu_fetch_api_async(OvirtForeignMenu *menu)
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_api_async(OvirtForeignMenu *menu,
|
|
|
48c875 |
+ GTask *task)
|
|
|
48c875 |
{
|
|
|
48c875 |
g_debug("Start fetching oVirt main entry point");
|
|
|
48c875 |
|
|
|
48c875 |
g_return_if_fail(OVIRT_IS_FOREIGN_MENU(menu));
|
|
|
48c875 |
g_return_if_fail(OVIRT_IS_PROXY(menu->priv->proxy));
|
|
|
48c875 |
|
|
|
48c875 |
- ovirt_proxy_fetch_api_async(menu->priv->proxy, NULL, api_fetched_cb, menu);
|
|
|
48c875 |
+ ovirt_proxy_fetch_api_async(menu->priv->proxy,
|
|
|
48c875 |
+ g_task_get_cancellable(task),
|
|
|
48c875 |
+ api_fetched_cb, task);
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
@@ -794,6 +837,8 @@ static void iso_list_fetched_cb(GObject *source_object,
|
|
|
48c875 |
GAsyncResult *result,
|
|
|
48c875 |
gpointer user_data)
|
|
|
48c875 |
{
|
|
|
48c875 |
+ GTask *task = G_TASK(user_data);
|
|
|
48c875 |
+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(g_task_get_source_object(task));
|
|
|
48c875 |
OvirtCollection *collection = OVIRT_COLLECTION(source_object);
|
|
|
48c875 |
GError *error = NULL;
|
|
|
48c875 |
GList *files;
|
|
|
48c875 |
@@ -802,42 +847,29 @@ static void iso_list_fetched_cb(GObject *source_object,
|
|
|
48c875 |
if (error != NULL) {
|
|
|
48c875 |
g_warning("failed to fetch files for ISO storage domain: %s",
|
|
|
48c875 |
error->message);
|
|
|
48c875 |
- g_clear_error(&error);
|
|
|
48c875 |
+ g_task_return_error(task, error);
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
return;
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
files = g_hash_table_get_values(ovirt_collection_get_resources(collection));
|
|
|
48c875 |
- ovirt_foreign_menu_set_files(OVIRT_FOREIGN_MENU(user_data), files);
|
|
|
48c875 |
+ ovirt_foreign_menu_set_files(menu, files);
|
|
|
48c875 |
g_list_free(files);
|
|
|
48c875 |
-
|
|
|
48c875 |
- g_timeout_add_seconds(300, ovirt_foreign_menu_refresh_iso_list, user_data);
|
|
|
48c875 |
+ g_task_return_pointer(task, menu->priv->iso_names, NULL);
|
|
|
48c875 |
+ g_object_unref(task);
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
-static void ovirt_foreign_menu_fetch_iso_list_async(OvirtForeignMenu *menu)
|
|
|
48c875 |
+static void ovirt_foreign_menu_fetch_iso_list_async(OvirtForeignMenu *menu,
|
|
|
48c875 |
+ GTask *task)
|
|
|
48c875 |
{
|
|
|
48c875 |
if (menu->priv->files == NULL) {
|
|
|
48c875 |
return;
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
ovirt_collection_fetch_async(menu->priv->files, menu->priv->proxy,
|
|
|
48c875 |
- NULL, iso_list_fetched_cb, menu);
|
|
|
48c875 |
-}
|
|
|
48c875 |
-
|
|
|
48c875 |
-
|
|
|
48c875 |
-static gboolean ovirt_foreign_menu_refresh_iso_list(gpointer user_data)
|
|
|
48c875 |
-{
|
|
|
48c875 |
- OvirtForeignMenu *menu;
|
|
|
48c875 |
-
|
|
|
48c875 |
- g_debug("Refreshing foreign menu iso list");
|
|
|
48c875 |
- menu = OVIRT_FOREIGN_MENU(user_data);
|
|
|
48c875 |
- ovirt_foreign_menu_fetch_iso_list_async(menu);
|
|
|
48c875 |
-
|
|
|
48c875 |
- /* ovirt_foreign_menu_fetch_iso_list_async() will schedule a new call to
|
|
|
48c875 |
- * that function through iso_list_fetched_cb() when it has finished
|
|
|
48c875 |
- * fetching the iso list
|
|
|
48c875 |
- */
|
|
|
48c875 |
- return G_SOURCE_REMOVE;
|
|
|
48c875 |
+ g_task_get_cancellable(task),
|
|
|
48c875 |
+ iso_list_fetched_cb, task);
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
|
|
|
48c875 |
diff --git a/src/ovirt-foreign-menu.h b/src/ovirt-foreign-menu.h
|
|
|
48c875 |
index 791d0f3..a864a60 100644
|
|
|
48c875 |
--- a/src/ovirt-foreign-menu.h
|
|
|
48c875 |
+++ b/src/ovirt-foreign-menu.h
|
|
|
48c875 |
@@ -68,7 +68,14 @@ GType ovirt_foreign_menu_get_type(void);
|
|
|
48c875 |
|
|
|
48c875 |
OvirtForeignMenu* ovirt_foreign_menu_new(OvirtProxy *proxy);
|
|
|
48c875 |
OvirtForeignMenu *ovirt_foreign_menu_new_from_file(VirtViewerFile *self);
|
|
|
48c875 |
-void ovirt_foreign_menu_start(OvirtForeignMenu *menu);
|
|
|
48c875 |
+
|
|
|
48c875 |
+void ovirt_foreign_menu_fetch_iso_names_async(OvirtForeignMenu *menu,
|
|
|
48c875 |
+ GCancellable *cancellable,
|
|
|
48c875 |
+ GAsyncReadyCallback callback,
|
|
|
48c875 |
+ gpointer user_data);
|
|
|
48c875 |
+GList *ovirt_foreign_menu_fetch_iso_names_finish(OvirtForeignMenu *foreign_menu,
|
|
|
48c875 |
+ GAsyncResult *result,
|
|
|
48c875 |
+ GError **error);
|
|
|
48c875 |
|
|
|
48c875 |
void ovirt_foreign_menu_set_current_iso_name_async(OvirtForeignMenu *foreign_menu,
|
|
|
48c875 |
const char *name,
|
|
|
48c875 |
diff --git a/src/remote-viewer.c b/src/remote-viewer.c
|
|
|
48c875 |
index 13c6e7c..c84a35b 100644
|
|
|
48c875 |
--- a/src/remote-viewer.c
|
|
|
48c875 |
+++ b/src/remote-viewer.c
|
|
|
48c875 |
@@ -72,6 +72,7 @@ static OvirtVm * choose_vm(GtkWindow *main_window,
|
|
|
48c875 |
char **vm_name,
|
|
|
48c875 |
OvirtCollection *vms,
|
|
|
48c875 |
GError **error);
|
|
|
48c875 |
+static gboolean remote_viewer_refresh_ovirt_foreign_menu(gpointer user_data);
|
|
|
48c875 |
#endif
|
|
|
48c875 |
|
|
|
48c875 |
static gboolean remote_viewer_start(VirtViewerApp *self, GError **error);
|
|
|
48c875 |
@@ -783,6 +784,43 @@ ovirt_foreign_menu_updated(RemoteViewer *self)
|
|
|
48c875 |
}
|
|
|
48c875 |
|
|
|
48c875 |
static void
|
|
|
48c875 |
+ovirt_foreign_menu_fetch_iso_names_cb(GObject *source_object,
|
|
|
48c875 |
+ GAsyncResult *result,
|
|
|
48c875 |
+ gpointer user_data)
|
|
|
48c875 |
+{
|
|
|
48c875 |
+ OvirtForeignMenu *foreign_menu = OVIRT_FOREIGN_MENU(source_object);
|
|
|
48c875 |
+ RemoteViewer *self = REMOTE_VIEWER(user_data);
|
|
|
48c875 |
+ VirtViewerApp *app = VIRT_VIEWER_APP(user_data);
|
|
|
48c875 |
+ GError *error = NULL;
|
|
|
48c875 |
+ GList *iso_list;
|
|
|
48c875 |
+
|
|
|
48c875 |
+ iso_list = ovirt_foreign_menu_fetch_iso_names_finish(foreign_menu, result, &error);
|
|
|
48c875 |
+
|
|
|
48c875 |
+ if (!iso_list) {
|
|
|
48c875 |
+ virt_viewer_app_simple_message_dialog(app, error ? error->message : _("Failed to fetch CD names"));
|
|
|
48c875 |
+ g_clear_error(&error);
|
|
|
48c875 |
+ return;
|
|
|
48c875 |
+ }
|
|
|
48c875 |
+
|
|
|
48c875 |
+ ovirt_foreign_menu_updated(self);
|
|
|
48c875 |
+ g_timeout_add_seconds(300, remote_viewer_refresh_ovirt_foreign_menu, self);
|
|
|
48c875 |
+}
|
|
|
48c875 |
+
|
|
|
48c875 |
+static gboolean
|
|
|
48c875 |
+remote_viewer_refresh_ovirt_foreign_menu(gpointer user_data)
|
|
|
48c875 |
+{
|
|
|
48c875 |
+ VirtViewerApp *app = VIRT_VIEWER_APP(user_data);
|
|
|
48c875 |
+ RemoteViewer *self = REMOTE_VIEWER(user_data);
|
|
|
48c875 |
+
|
|
|
48c875 |
+ g_debug("Refreshing foreign menu iso list");
|
|
|
48c875 |
+ ovirt_foreign_menu_fetch_iso_names_async(self->priv->ovirt_foreign_menu,
|
|
|
48c875 |
+ NULL,
|
|
|
48c875 |
+ ovirt_foreign_menu_fetch_iso_names_cb,
|
|
|
48c875 |
+ app);
|
|
|
48c875 |
+ return G_SOURCE_REMOVE;
|
|
|
48c875 |
+}
|
|
|
48c875 |
+
|
|
|
48c875 |
+static void
|
|
|
48c875 |
ovirt_foreign_menu_changed(OvirtForeignMenu *foreign_menu G_GNUC_UNUSED,
|
|
|
48c875 |
GParamSpec *pspec G_GNUC_UNUSED,
|
|
|
48c875 |
VirtViewerApp *app)
|
|
|
48c875 |
@@ -806,13 +844,12 @@ virt_viewer_app_set_ovirt_foreign_menu(VirtViewerApp *app,
|
|
|
48c875 |
self->priv->ovirt_foreign_menu = foreign_menu;
|
|
|
48c875 |
g_signal_connect(G_OBJECT(foreign_menu), "notify::file",
|
|
|
48c875 |
(GCallback)ovirt_foreign_menu_changed, app);
|
|
|
48c875 |
- g_signal_connect(G_OBJECT(foreign_menu), "notify::files",
|
|
|
48c875 |
- (GCallback)ovirt_foreign_menu_changed, app);
|
|
|
48c875 |
+
|
|
|
48c875 |
g_signal_connect(G_OBJECT(app), "window-added",
|
|
|
48c875 |
(GCallback)ovirt_foreign_menu_update, NULL);
|
|
|
48c875 |
- ovirt_foreign_menu_start(foreign_menu);
|
|
|
48c875 |
-}
|
|
|
48c875 |
|
|
|
48c875 |
+ remote_viewer_refresh_ovirt_foreign_menu(self);
|
|
|
48c875 |
+}
|
|
|
48c875 |
|
|
|
48c875 |
static gboolean
|
|
|
48c875 |
create_ovirt_session(VirtViewerApp *app, const char *uri, GError **err)
|
|
|
48c875 |
--
|
|
|
48c875 |
2.12.0
|
|
|
48c875 |
|