From 47eb32d31190bf1911d0ef904c776126b022b88f Mon Sep 17 00:00:00 2001 From: Taowei Date: Mon, 11 Aug 2014 18:06:56 +0800 Subject: [PATCH] vbox: Rewrite vboxDomainSnapshotListNames --- 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 fedd84a307..35ca0dcac8 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -6109,3 +6109,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 38c9ca35e5..ad26f9b1a8 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -1523,96 +1523,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 ba75d007d0..f0cfb18339 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);