---
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