[libvirt] [glib PATCH V6] Add bindings for virDomainRestore*()

Jovanka Gulicoska jovanka.gulicoska at gmail.com
Fri Jul 13 04:43:23 UTC 2012


---
 libvirt-gobject/libvirt-gobject-connection.c |  137 ++++++++++++++++++++++++++
 libvirt-gobject/libvirt-gobject-connection.h |   20 ++++
 libvirt-gobject/libvirt-gobject-domain.c     |   22 ++---
 libvirt-gobject/libvirt-gobject-domain.h     |   10 ++
 libvirt-gobject/libvirt-gobject.sym          |    4 +
 5 files changed, 180 insertions(+), 13 deletions(-)

diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c
index 3a99034..5f21c11 100644
--- a/libvirt-gobject/libvirt-gobject-connection.c
+++ b/libvirt-gobject/libvirt-gobject-connection.c
@@ -1605,3 +1605,140 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
 
     return g_object_ref(caps);
 }
+
+/**
+ * gvir_connection_domain_restore:
+ * @conn: a #GVirConnection
+ * @filename: path to input file
+ * @custom_conf: (allow-none): configuration for domain or NULL
+ * @flags: the flags
+ *
+ * Returns: TRUE on success, FALSE otherwise
+ */
+gboolean gvir_connection_domain_restore(GVirConnection *conn,
+                                        gchar *filename,
+                                        GVirConfigDomain *custom_conf,
+                                        guint flags,
+                                        GError **err)
+{
+    GVirConnectionPrivate *priv;
+    int ret;
+
+    g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
+    g_return_val_if_fail((err == NULL) || (*err == NULL), FALSE);
+
+    priv = conn->priv;
+
+    if (flags || custom_conf != NULL) {
+        gchar *custom_xml = NULL;
+
+        if (custom_conf != NULL)
+            custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(custom_conf));
+
+       ret = virDomainRestoreFlags(priv->conn, filename, custom_xml, flags);
+       g_free (custom_xml);
+    }
+    else {
+       ret = virDomainRestore(priv->conn, filename);
+    }
+
+    if (ret < 0) {
+        gvir_set_error_literal(err, GVIR_CONNECTION_ERROR,
+                               0,
+                               "Unable to restore domain");
+
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+static void
+gvir_connection_domain_restore_helper(GSimpleAsyncResult *res,
+                                      GObject *object,
+                                      GCancellable *cancellable G_GNUC_UNUSED)
+{
+    GVirConnection *conn = GVIR_CONNECTION(object);
+    GVirDomainRestoreFromFileData *data;
+    GError *err = NULL;
+
+    data = g_simple_async_result_get_op_res_gpointer(res);
+
+    if (!gvir_connection_domain_restore(conn, data->filename, data->custom_conf,
+                                        data->flags, &err))
+        g_simple_async_result_take_error(res, err);
+}
+
+/**
+ * gvir_connection_domain_restore_async:
+ * @conn: a #GVirConnection
+ * @filename: path to input file
+ * @custom_conf: (allow-none): configuration for domain or NULL
+ * @flags: the flags
+ * @cancellable: (allow-none) (transfer none): cancallation object
+ * @callback: (scope async): completion callback
+ * @user_data: (closure): opaque data for callback
+ *
+ * Asynchronous variant of #gvir_connection_domain_restore
+ */
+void gvir_connection_domain_restore_async(GVirConnection *conn,
+                                          gchar *filename,
+                                          GVirConfigDomain *custom_conf,
+                                          guint flags,
+                                          GCancellable *cancellable,
+                                          GAsyncReadyCallback callback,
+                                          gpointer user_data)
+{
+    GSimpleAsyncResult *res;
+    GVirDomainRestoreFromFileData *data;
+
+    g_return_if_fail(GVIR_IS_CONNECTION(conn));
+    g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable));
+
+    data = g_slice_new0(GVirDomainRestoreFromFileData);
+    data->filename = g_strdup(filename);
+    data->custom_conf = g_object_ref(custom_conf);
+    data->flags = flags;
+
+    res = g_simple_async_result_new(G_OBJECT(conn),
+                                    callback,
+                                    user_data,
+                                    gvir_connection_domain_restore_async);
+    g_simple_async_result_set_op_res_gpointer
+                          (res, data,
+                           (GDestroyNotify)gvir_domain_save_to_file_data_free);
+
+    g_simple_async_result_run_in_thread(res,
+                                        gvir_connection_domain_restore_helper,
+                                        G_PRIORITY_DEFAULT,
+                                        cancellable);
+
+    g_object_unref(res);
+}
+
+/**
+ * gvir_connection_domain_finish:
+ * @conn: a #GVirConnection
+ * @result: (transfer none): async method result
+ * @err: Place-holder for possible errors
+ *
+ * Finishes the operation started by #gvir_domain_restore_async.
+ *
+ * Returns: TRUE if domain was restored successfully, FALSE otherwise.
+ */
+gboolean gvir_connection_domain_restore_finish(GVirConnection *conn,
+                                               GAsyncResult *result,
+                                               GError **err)
+{
+    g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
+    g_return_val_if_fail(g_simple_async_result_is_valid
+                                  (result, G_OBJECT(conn),
+                                   gvir_connection_domain_restore_async),
+                                   FALSE);
+
+    if (g_simple_async_result_propagate_error(G_SIMPLE_ASYNC_RESULT(result),
+                                              err))
+        return FALSE;
+
+    return TRUE;
+}
diff --git a/libvirt-gobject/libvirt-gobject-connection.h b/libvirt-gobject/libvirt-gobject-connection.h
index c80eecf..5932661 100644
--- a/libvirt-gobject/libvirt-gobject-connection.h
+++ b/libvirt-gobject/libvirt-gobject-connection.h
@@ -38,6 +38,8 @@ G_BEGIN_DECLS
 
 #define GVIR_TYPE_CONNECTION_HANDLE      (gvir_connection_handle_get_type ())
 
+#define GVirDomainRestoreFromFileData GVirDomainSaveToFileData
+
 typedef struct _GVirNodeInfo GVirNodeInfo;
 struct _GVirNodeInfo
 {
@@ -202,6 +204,24 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
                                         GAsyncResult *result,
                                         GError **err);
 
+gboolean gvir_connection_domain_restore(GVirConnection *conn,
+                                        gchar *filename,
+                                        GVirConfigDomain *custom_conf,
+                                        guint flags,
+                                        GError **err);
+
+void gvir_connection_domain_restore_async(GVirConnection *conn,
+                                          gchar *filename,
+                                          GVirConfigDomain *custom_conf,
+                                          guint flags,
+                                          GCancellable *cancellable,
+                                          GAsyncReadyCallback callback,
+                                          gpointer user_data);
+
+gboolean gvir_connection_domain_restore_finish(GVirConnection *conn,
+                                               GAsyncResult *result,
+                                               GError **err);
+
 G_END_DECLS
 
 #endif /* __LIBVIRT_GOBJECT_CONNECTION_H__ */
diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c
index 308a817..61c153b 100644
--- a/libvirt-gobject/libvirt-gobject-domain.c
+++ b/libvirt-gobject/libvirt-gobject-domain.c
@@ -602,17 +602,11 @@ gboolean gvir_domain_save_to_file(GVirDomain *dom,
     return TRUE;
 }
 
-typedef struct {
-    gchar *filename;
-    GVirConfigDomain *custom_conf;
-    guint flags;
-} DomainSaveToFileData;
-
-static void domain_save_to_file_data_free(DomainSaveToFileData *data)
+void gvir_domain_save_to_file_data_free(GVirDomainSaveToFileData *data)
 {
     g_free(data->filename);
     g_object_unref(data->custom_conf);
-    g_slice_free(DomainSaveToFileData, data);
+    g_slice_free(GVirDomainSaveToFileData, data);
 }
 
 static void
@@ -621,7 +615,7 @@ gvir_domain_save_to_file_helper(GSimpleAsyncResult *res,
                                 GCancellable *cancellable G_GNUC_UNUSED)
 {
     GVirDomain *dom = GVIR_DOMAIN(object);
-    DomainSaveToFileData *data;
+    GVirDomainSaveToFileData *data;
     GError *err = NULL;
 
     data = g_simple_async_result_get_op_res_gpointer(res);
@@ -651,12 +645,12 @@ void gvir_domain_save_to_file_async(GVirDomain *dom,
                                     gpointer user_data)
 {
     GSimpleAsyncResult *res;
-    DomainSaveToFileData *data;
+    GVirDomainSaveToFileData *data;
 
     g_return_if_fail(GVIR_IS_DOMAIN(dom));
     g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable));
 
-    data = g_slice_new0(DomainSaveToFileData);
+    data = g_slice_new0(GVirDomainSaveToFileData);
     data->filename = g_strdup(filename);
     data->custom_conf = g_object_ref(custom_conf);
     data->flags = flags;
@@ -665,8 +659,10 @@ void gvir_domain_save_to_file_async(GVirDomain *dom,
                                     callback,
                                     user_data,
                                     gvir_domain_save_to_file_async);
-    g_simple_async_result_set_op_res_gpointer(res, data, (GDestroyNotify)
-                                              domain_save_to_file_data_free);
+    g_simple_async_result_set_op_res_gpointer
+                                 (res, data,
+                                  (GDestroyNotify)
+                                  gvir_domain_save_to_file_data_free);
 
     g_simple_async_result_run_in_thread(res,
                                         gvir_domain_save_to_file_helper,
diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h
index 8f17799..ac225a2 100644
--- a/libvirt-gobject/libvirt-gobject-domain.h
+++ b/libvirt-gobject/libvirt-gobject-domain.h
@@ -112,6 +112,14 @@ struct _GVirDomainInfo
     guint64 cpuTime;       /* the CPU time used in nanoseconds */
 };
 
+typedef struct _GVirDomainSaveToFileData GVirDomainSaveToFileData;
+struct _GVirDomainSaveToFileData
+{
+    gchar *filename;
+    GVirConfigDomain *custom_conf;
+    guint flags;
+};
+
 GType gvir_domain_get_type(void);
 GType gvir_domain_info_get_type(void);
 GType gvir_domain_handle_get_type(void);
@@ -166,6 +174,8 @@ gboolean gvir_domain_save_to_file_finish(GVirDomain *dom,
                                          GAsyncResult *result,
                                          GError **err);
 
+void gvir_domain_save_to_file_data_free(GVirDomainSaveToFileData *data);
+
 GVirDomainInfo *gvir_domain_get_info(GVirDomain *dom,
                                      GError **err);
 void gvir_domain_get_info_async(GVirDomain *dom,
diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym
index 54a093a..dde0e70 100644
--- a/libvirt-gobject/libvirt-gobject.sym
+++ b/libvirt-gobject/libvirt-gobject.sym
@@ -31,6 +31,9 @@ LIBVIRT_GOBJECT_0.0.8 {
 	gvir_connection_create_storage_pool;
 	gvir_connection_start_domain;
 	gvir_connection_get_node_info;
+	gvir_connection_domain_restore;
+	gvir_connection_domain_restore_async;
+	gvir_connection_domain_restore_finish;
 
 	gvir_domain_device_get_type;
 	gvir_domain_device_get_domain;
@@ -78,6 +81,7 @@ LIBVIRT_GOBJECT_0.0.8 {
 	gvir_domain_save_to_file;
 	gvir_domain_save_to_file_async;
 	gvir_domain_save_to_file_finish;
+	gvir_domain_save_to_file_data_free;
 
 	gvir_domain_snapshot_get_type;
 	gvir_domain_snapshot_handle_get_type;
-- 
1.7.10.4




More information about the libvir-list mailing list