--- src/vbox/vbox_storage.c | 56 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 54 +++++---------------------------------- src/vbox/vbox_uniformed_api.h | 2 ++ 3 files changed, 64 insertions(+), 48 deletions(-) diff --git a/src/vbox/vbox_storage.c b/src/vbox/vbox_storage.c index 804f723..ffa91a9 100644 --- a/src/vbox/vbox_storage.c +++ b/src/vbox/vbox_storage.c @@ -147,3 +147,59 @@ int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool) return ret; } + +int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames) +{ + vboxGlobalData *data = pool->conn->privateData; + vboxArray hardDisks = VBOX_ARRAY_INITIALIZER; + PRUint32 numActive = 0; + nsresult rc; + size_t i; + int ret = -1; + + if (!data->vboxObj) { + return ret; + } + + 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; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index c78cd44..ac712d8 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2033,54 +2033,6 @@ _registerDomainEvent(virHypervisorDriverPtr 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) { @@ -4904,6 +4856,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) { @@ -5626,6 +5583,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 4c17051..4a6ec33 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