[libvirt] [glib PATCH] Add gvir_connection_domain_restore() and gvir_connection_domain_restore_async()

Jovanka Gulicoska jovanka.gulicoska at gmail.com
Wed Jul 11 05:29:15 UTC 2012


---
 libvirt-gobject/libvirt-gobject-connection.c |  136 ++++++++++++++++++++++++++
 libvirt-gobject/libvirt-gobject-connection.h |   19 ++++
 libvirt-gobject/libvirt-gobject.sym          |    3 +
 3 files changed, 158 insertions(+)

diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c
index 3a99034..2302328 100644
--- a/libvirt-gobject/libvirt-gobject-connection.c
+++ b/libvirt-gobject/libvirt-gobject-connection.c
@@ -57,6 +57,7 @@ enum {
     VIR_CONNECTION_CLOSED,
     VIR_DOMAIN_ADDED,
     VIR_DOMAIN_REMOVED,
+    VIR_DOMAIN_RESTORED,
     LAST_SIGNAL
 };
 
@@ -228,6 +229,15 @@ static void gvir_connection_class_init(GVirConnectionClass *klass)
                  1,
                  GVIR_TYPE_DOMAIN);
 
+    signals[VIR_DOMAIN_RESTORED] = g_signal_new("domain-restored",
+                                                G_OBJECT_CLASS_TYPE(object_class),
+                                                G_SIGNAL_RUN_FIRST,
+                                                G_STRUCT_OFFSET(GVirConnectionClass, domain_restored),
+                                                NULL, NULL,
+                                                g_cclosure_marshal_VOID__OBJECT,
+                                                G_TYPE_NONE,
+                                                0);
+
     g_type_class_add_private(klass, sizeof(GVirConnectionPrivate));
 }
 
@@ -1605,3 +1615,129 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
 
     return g_object_ref(caps);
 }
+
+/*
+ * gvir_connection_domain_restore
+ */
+gboolean gvir_connection_domain_restore(GVirConnection *conn,
+                                        gchar *filename,
+                                        GVirConfigDomain *conf,
+                                        guint flags,
+                                        GError **err)
+{
+    GVirConnectionPrivate *priv;
+    gchar *custom_xml;
+    int ret;
+
+    g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
+    g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN (conf), FALSE);
+    g_return_val_if_fail((err == NULL) || (*err == NULL), FALSE);
+
+    priv = conn->priv;
+    custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
+
+    g_return_val_if_fail(custom_xml != NULL, FALSE);
+
+    if(flags || custom_xml) {
+       ret = virDomainRestoreFlags(priv->conn, filename, custom_xml, flags);
+       g_free (custom_xml);
+    }
+    else {
+       ret = virDomainRestore(priv->conn, filename);
+       g_free (custom_xml);
+    }
+
+    if(ret < 0) {
+       gvir_set_error_literal(err, GVIR_CONNECTION_ERROR,
+                              0,
+                              "Unable to restore domain");
+
+       return FALSE;
+    }
+
+    return TRUE;
+}
+
+typedef struct {
+    gchar *filename;
+    gchar *custom_xml;
+    guint flags;
+} DomainRestoreFromFileData;
+
+static void domain_restore_from_file_data_free(DomainRestoreFromFileData *data)
+{
+    g_slice_free(DomainRestoreFromFileData, data);
+}
+
+static void
+gvir_connection_domain_restore_helper(GSimpleAsyncResult *res,
+                                      GObject *object,
+                                      GCancellable *cancellable G_GNUC_UNUSED)
+{
+    GVirConnection *conn = GVIR_CONNECTION(object);
+    DomainRestoreFromFileData *data;
+    GVirConfigDomain *conf;
+    GError *err = NULL;
+
+    data = g_simple_async_result_get_op_res_gpointer(res);
+    conf =  gvir_config_domain_new_from_xml(data->custom_xml, &err);
+
+    if(!gvir_connection_domain_restore(conn, data->filename, conf, data->flags, &err))
+       g_simple_async_result_take_error(res, err);
+}
+
+/*
+ * Async function of gvir_connection_domain_restore
+ */
+void gvir_connection_domain_restore_async(GVirConnection *conn,
+                                          gchar *filename,
+                                          GVirConfigDomain *conf,
+                                          guint flags,
+                                          GCancellable *cancellable,
+                                          GAsyncReadyCallback callback,
+                                          gpointer user_data)
+{
+    GSimpleAsyncResult *res;
+    DomainRestoreFromFileData *data;
+    gchar *custom_xml;
+
+    g_return_if_fail(GVIR_IS_CONNECTION(conn));
+    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN (conf));
+    g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable));
+    
+    custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));
+
+    data = g_slice_new0(DomainRestoreFromFileData);
+    data->filename = filename;
+    data->custom_xml = custom_xml;
+    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)domain_restore_from_file_data_free);
+
+    g_simple_async_result_run_in_thread(res,
+                                        gvir_connection_domain_restore_helper,
+                                        G_PRIORITY_DEFAULT,
+                                        cancellable);
+
+    g_object_unref(res);
+}
+
+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..01d5d0b 100644
--- a/libvirt-gobject/libvirt-gobject-connection.h
+++ b/libvirt-gobject/libvirt-gobject-connection.h
@@ -75,6 +75,8 @@ struct _GVirConnectionClass
     void (*domain_added)(GVirConnection *conn, GVirDomain *dom);
     void (*domain_removed)(GVirConnection *conn, GVirDomain *dom);
 
+    void (*domain_restored)(GVirConnection *conn);
+
     GVirStream *(*stream_new)(GVirConnection *conn, gpointer handle);
 
     gpointer padding[20];
@@ -202,6 +204,23 @@ gvir_connection_get_capabilities_finish(GVirConnection *conn,
                                         GAsyncResult *result,
                                         GError **err);
 
+gboolean gvir_connection_domain_restore(GVirConnection *conn,
+                                        gchar *filename,
+                                        GVirConfigDomain *conf,
+                                        guint flags,
+                                        GError **err);
+
+void gvir_connection_domain_restore_async(GVirConnection *conn,
+                                          gchar *filename,
+                                          GVirConfigDomain *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.sym b/libvirt-gobject/libvirt-gobject.sym
index 8ff9e24..0aaefa2 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;
-- 
1.7.10.4




More information about the libvir-list mailing list