--- src/vbox/vbox_common.c | 51 ++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 54 +++++------------------------------------ src/vbox/vbox_uniformed_api.h | 2 ++ 3 files changed, 59 insertions(+), 48 deletions(-) diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 4ca0a10..85c4dd0 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -8397,6 +8397,57 @@ int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool) return ret; } +int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames) +{ + VBOX_OBJECT_CHECK(pool->conn, int, -1); + vboxArray hardDisks = VBOX_ARRAY_INITIALIZER; + PRUint32 numActive = 0; + nsresult rc; + size_t i; + + rc = gVBoxAPI.UArray.vboxArrayGet(&hardDisks, data->vboxObj, + gVBoxAPI.UArray.handleGetHardDisks(data->vboxObj)); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("could not get the volume list in the pool: %s, rc=%08x"), + pool->name, (unsigned)rc); + return ret; + } + + for (i = 0; i < hardDisks.count && numActive < nnames; ++i) { + IHardDisk *hardDisk = hardDisks.items[i]; + PRUint32 hddstate; + char *nameUtf8 = NULL; + PRUnichar *nameUtf16 = NULL; + + if (!hardDisk) + continue; + + gVBoxAPI.UIMedium.GetState(hardDisk, &hddstate); + if (hddstate == MediaState_Inaccessible) + continue; + + gVBoxAPI.UIMedium.GetName(hardDisk, &nameUtf16); + + VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); + VBOX_UTF16_FREE(nameUtf16); + + if (!nameUtf8) + continue; + + VIR_DEBUG("nnames[%d]: %s", numActive, nameUtf8); + if (VIR_STRDUP(names[numActive], nameUtf8) > 0) + numActive++; + + VBOX_UTF8_FREE(nameUtf8); + } + + gVBoxAPI.UArray.vboxArrayRelease(&hardDisks); + ret = numActive; + + return ret; +} + /** * Function Tables */ diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 75eb73d..eac0e9c 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2021,54 +2021,6 @@ _registerDomainEvent(virDriverPtr driver) * The Storage Functions here on */ -static int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames) { - VBOX_OBJECT_CHECK(pool->conn, int, -1); - vboxArray hardDisks = VBOX_ARRAY_INITIALIZER; - PRUint32 numActive = 0; - nsresult rc; - size_t i; - - rc = vboxArrayGet(&hardDisks, data->vboxObj, data->vboxObj->vtbl->GetHardDisks); - if (NS_SUCCEEDED(rc)) { - for (i = 0; i < hardDisks.count && numActive < nnames; ++i) { - IHardDisk *hardDisk = hardDisks.items[i]; - - if (hardDisk) { - PRUint32 hddstate; - char *nameUtf8 = NULL; - PRUnichar *nameUtf16 = NULL; - - VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetState, &hddstate); - if (hddstate != MediaState_Inaccessible) { - VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetName, &nameUtf16); - - VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); - VBOX_UTF16_FREE(nameUtf16); - - if (nameUtf8) { - VIR_DEBUG("nnames[%d]: %s", numActive, nameUtf8); - if (VIR_STRDUP(names[numActive], nameUtf8) > 0) - numActive++; - - VBOX_UTF8_FREE(nameUtf8); - } - } - } - } - - vboxArrayRelease(&hardDisks); - - ret = numActive; - } else { - ret = -1; - virReportError(VIR_ERR_INTERNAL_ERROR, - _("could not get the volume list in the pool: %s, rc=%08x"), - pool->name, (unsigned)rc); - } - - return ret; -} - static virStorageVolPtr vboxStorageVolLookupByName(virStoragePoolPtr pool, const char *name) { @@ -4891,6 +4843,11 @@ static nsresult _mediumGetState(IMedium *medium, PRUint32 *state) return medium->vtbl->GetState(medium, state); } +static nsresult _mediumGetName(IMedium *medium, PRUnichar **name) +{ + return medium->vtbl->GetName(medium, name); +} + static nsresult _mediumGetReadOnly(IMedium *medium ATTRIBUTE_UNUSED, PRBool *readOnly ATTRIBUTE_UNUSED) { @@ -5612,6 +5569,7 @@ static vboxUniformedIMedium _UIMedium = { .GetId = _mediumGetId, .GetLocation = _mediumGetLocation, .GetState = _mediumGetState, + .GetName = _mediumGetName, .GetReadOnly = _mediumGetReadOnly, .GetParent = _mediumGetParent, .GetChildren = _mediumGetChildren, diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 9709934..ed72447 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -409,6 +409,7 @@ typedef struct { nsresult (*GetId)(IMedium *medium, vboxIIDUnion *iidu); nsresult (*GetLocation)(IMedium *medium, PRUnichar **location); nsresult (*GetState)(IMedium *medium, PRUint32 *state); + nsresult (*GetName)(IMedium *medium, PRUnichar **name); nsresult (*GetReadOnly)(IMedium *medium, PRBool *readOnly); nsresult (*GetParent)(IMedium *medium, IMedium **parent); nsresult (*GetChildren)(IMedium *medium, PRUint32 *childrenSize, IMedium ***children); @@ -595,6 +596,7 @@ int vboxConnectNumOfStoragePools(virConnectPtr conn); int vboxConnectListStoragePools(virConnectPtr conn, char **const names, int nnames); virStoragePoolPtr vboxStoragePoolLookupByName(virConnectPtr conn, const char *name); int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool); +int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list