[libvirt] [PATCH 53/66] vbox: Rewrite vboxDomainSnapshotListNames

Taowei uaedante at gmail.com
Mon Aug 11 10:06:56 UTC 2014


---
 src/vbox/vbox_common.c        |   79 ++++++++++++++++++++++++++++++++++++
 src/vbox/vbox_tmpl.c          |   90 -----------------------------------------
 src/vbox/vbox_uniformed_api.h |    2 +
 3 files changed, 81 insertions(+), 90 deletions(-)

diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 074eab0..dc9018f 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -6121,3 +6121,82 @@ int vboxDomainSnapshotNum(virDomainPtr dom, unsigned int flags)
     vboxIIDUnalloc(&iid);
     return ret;
 }
+
+int vboxDomainSnapshotListNames(virDomainPtr dom, char **names,
+                                int nameslen, unsigned int flags)
+{
+    VBOX_OBJECT_CHECK(dom->conn, int, -1);
+    vboxIIDUnion iid;
+    IMachine *machine = NULL;
+    nsresult rc;
+    ISnapshot **snapshots = NULL;
+    int count = 0;
+    size_t i;
+
+    virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
+                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
+
+    if (openSessionForMachine(data, dom->uuid, &iid, &machine, false) < 0)
+        goto cleanup;
+
+    if (flags & VIR_DOMAIN_SNAPSHOT_LIST_METADATA) {
+        ret = 0;
+        goto cleanup;
+    }
+
+    if (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) {
+        vboxIIDUnion empty;
+
+        VBOX_IID_INITIALIZE(&empty);
+        if (VIR_ALLOC_N(snapshots, 1) < 0)
+            goto cleanup;
+        rc = gVBoxAPI.UIMachine.FindSnapshot(machine, &empty, snapshots);
+        if (NS_FAILED(rc) || !snapshots[0]) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("could not get root snapshot for domain %s"),
+                           dom->name);
+            goto cleanup;
+        }
+        count = 1;
+    } else {
+        if ((count = vboxDomainSnapshotGetAll(dom, machine, &snapshots)) < 0)
+            goto cleanup;
+    }
+
+    for (i = 0; i < nameslen; i++) {
+        PRUnichar *nameUtf16;
+        char *name;
+
+        if (i >= count)
+            break;
+
+        rc = gVBoxAPI.UISnapshot.GetName(snapshots[i], &nameUtf16);
+        if (NS_FAILED(rc) || !nameUtf16) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           "%s", _("could not get snapshot name"));
+            goto cleanup;
+        }
+        VBOX_UTF16_TO_UTF8(nameUtf16, &name);
+        VBOX_UTF16_FREE(nameUtf16);
+        if (VIR_STRDUP(names[i], name) < 0) {
+            VBOX_UTF8_FREE(name);
+            goto cleanup;
+        }
+        VBOX_UTF8_FREE(name);
+    }
+
+    if (count <= nameslen)
+        ret = count;
+    else
+        ret = nameslen;
+
+ cleanup:
+    if (count > 0) {
+        for (i = 0; i < count; i++)
+            VBOX_RELEASE(snapshots[i]);
+    }
+    VIR_FREE(snapshots);
+    VBOX_RELEASE(machine);
+    vboxIIDUnalloc(&iid);
+    return ret;
+}
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index f384741..7b6f847 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -1522,96 +1522,6 @@ vboxDomainSnapshotGet(vboxGlobalData *data,
     return snapshot;
 }
 
-static int
-vboxDomainSnapshotListNames(virDomainPtr dom,
-                            char **names,
-                            int nameslen,
-                            unsigned int flags)
-{
-    VBOX_OBJECT_CHECK(dom->conn, int, -1);
-    vboxIID iid = VBOX_IID_INITIALIZER;
-    IMachine *machine = NULL;
-    nsresult rc;
-    ISnapshot **snapshots = NULL;
-    int count = 0;
-    size_t i;
-
-    virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
-                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
-
-    vboxIIDFromUUID(&iid, dom->uuid);
-    rc = VBOX_OBJECT_GET_MACHINE(iid.value, &machine);
-    if (NS_FAILED(rc)) {
-        virReportError(VIR_ERR_NO_DOMAIN, "%s",
-                       _("no domain with matching UUID"));
-        goto cleanup;
-    }
-
-    if (flags & VIR_DOMAIN_SNAPSHOT_LIST_METADATA) {
-        ret = 0;
-        goto cleanup;
-    }
-
-    if (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) {
-        vboxIID empty = VBOX_IID_INITIALIZER;
-
-        if (VIR_ALLOC_N(snapshots, 1) < 0)
-            goto cleanup;
-#if VBOX_API_VERSION < 4000000
-        rc = machine->vtbl->GetSnapshot(machine, empty.value, snapshots);
-#else /* VBOX_API_VERSION >= 4000000 */
-        rc = machine->vtbl->FindSnapshot(machine, empty.value, snapshots);
-#endif /* VBOX_API_VERSION >= 4000000 */
-        if (NS_FAILED(rc) || !snapshots[0]) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("could not get root snapshot for domain %s"),
-                           dom->name);
-            goto cleanup;
-        }
-        count = 1;
-    } else {
-        if ((count = vboxDomainSnapshotGetAll(dom, machine, &snapshots)) < 0)
-            goto cleanup;
-    }
-
-    for (i = 0; i < nameslen; i++) {
-        PRUnichar *nameUtf16;
-        char *name;
-
-        if (i >= count)
-            break;
-
-        rc = snapshots[i]->vtbl->GetName(snapshots[i], &nameUtf16);
-        if (NS_FAILED(rc) || !nameUtf16) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           "%s", _("could not get snapshot name"));
-            goto cleanup;
-        }
-        VBOX_UTF16_TO_UTF8(nameUtf16, &name);
-        VBOX_UTF16_FREE(nameUtf16);
-        if (VIR_STRDUP(names[i], name) < 0) {
-            VBOX_UTF8_FREE(name);
-            goto cleanup;
-        }
-        VBOX_UTF8_FREE(name);
-    }
-
-    if (count <= nameslen)
-        ret = count;
-    else
-        ret = nameslen;
-
- cleanup:
-    if (count > 0) {
-        for (i = 0; i < count; i++)
-            VBOX_RELEASE(snapshots[i]);
-    }
-    VIR_FREE(snapshots);
-    VBOX_RELEASE(machine);
-    vboxIIDUnalloc(&iid);
-    return ret;
-}
-
 static virDomainSnapshotPtr
 vboxDomainSnapshotLookupByName(virDomainPtr dom,
                                const char *name,
diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h
index ba75d00..f0cfb18 100644
--- a/src/vbox/vbox_uniformed_api.h
+++ b/src/vbox/vbox_uniformed_api.h
@@ -578,6 +578,8 @@ vboxDomainSnapshotCreateXML(virDomainPtr dom,
 char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
                                    unsigned int flags);
 int vboxDomainSnapshotNum(virDomainPtr dom, unsigned int flags);
+int vboxDomainSnapshotListNames(virDomainPtr dom, char **names,
+                                int nameslen, unsigned int flags);
 
 /* Version specified functions for installing uniformed API */
 void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);
-- 
1.7.9.5




More information about the libvir-list mailing list