vbox: Rewrite vboxStoragePoolListVolumes

This commit is contained in:
Taowei Luo 2014-10-24 09:46:40 +08:00 committed by Michal Privoznik
parent ce381d3764
commit c3c8cd4fdc
3 changed files with 64 additions and 48 deletions

View File

@ -147,3 +147,59 @@ int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool)
return ret; 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;
}

View File

@ -2033,54 +2033,6 @@ _registerDomainEvent(virHypervisorDriverPtr driver)
* The Storage Functions here on * 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 static virStorageVolPtr
vboxStorageVolLookupByName(virStoragePoolPtr pool, const char *name) vboxStorageVolLookupByName(virStoragePoolPtr pool, const char *name)
{ {
@ -4904,6 +4856,11 @@ static nsresult _mediumGetState(IMedium *medium, PRUint32 *state)
return medium->vtbl->GetState(medium, 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, static nsresult _mediumGetReadOnly(IMedium *medium ATTRIBUTE_UNUSED,
PRBool *readOnly ATTRIBUTE_UNUSED) PRBool *readOnly ATTRIBUTE_UNUSED)
{ {
@ -5626,6 +5583,7 @@ static vboxUniformedIMedium _UIMedium = {
.GetId = _mediumGetId, .GetId = _mediumGetId,
.GetLocation = _mediumGetLocation, .GetLocation = _mediumGetLocation,
.GetState = _mediumGetState, .GetState = _mediumGetState,
.GetName = _mediumGetName,
.GetReadOnly = _mediumGetReadOnly, .GetReadOnly = _mediumGetReadOnly,
.GetParent = _mediumGetParent, .GetParent = _mediumGetParent,
.GetChildren = _mediumGetChildren, .GetChildren = _mediumGetChildren,

View File

@ -409,6 +409,7 @@ typedef struct {
nsresult (*GetId)(IMedium *medium, vboxIIDUnion *iidu); nsresult (*GetId)(IMedium *medium, vboxIIDUnion *iidu);
nsresult (*GetLocation)(IMedium *medium, PRUnichar **location); nsresult (*GetLocation)(IMedium *medium, PRUnichar **location);
nsresult (*GetState)(IMedium *medium, PRUint32 *state); nsresult (*GetState)(IMedium *medium, PRUint32 *state);
nsresult (*GetName)(IMedium *medium, PRUnichar **name);
nsresult (*GetReadOnly)(IMedium *medium, PRBool *readOnly); nsresult (*GetReadOnly)(IMedium *medium, PRBool *readOnly);
nsresult (*GetParent)(IMedium *medium, IMedium **parent); nsresult (*GetParent)(IMedium *medium, IMedium **parent);
nsresult (*GetChildren)(IMedium *medium, PRUint32 *childrenSize, IMedium ***children); 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); int vboxConnectListStoragePools(virConnectPtr conn, char **const names, int nnames);
virStoragePoolPtr vboxStoragePoolLookupByName(virConnectPtr conn, const char *name); virStoragePoolPtr vboxStoragePoolLookupByName(virConnectPtr conn, const char *name);
int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool); int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool);
int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames);
/* Version specified functions for installing uniformed API */ /* Version specified functions for installing uniformed API */
void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);