--- src/vbox/vbox_storage.c | 93 +++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 124 +++-------------------------------------- src/vbox/vbox_uniformed_api.h | 2 + 3 files changed, 102 insertions(+), 117 deletions(-) diff --git a/src/vbox/vbox_storage.c b/src/vbox/vbox_storage.c index e96d159..8a3b5a0 100644 --- a/src/vbox/vbox_storage.c +++ b/src/vbox/vbox_storage.c @@ -746,3 +746,96 @@ int vboxStorageVolGetInfo(virStorageVolPtr vol, virStorageVolInfoPtr info) vboxIIDUnalloc(&hddIID); return ret; } + +char *vboxStorageVolGetXMLDesc(virStorageVolPtr vol, unsigned int flags) +{ + vboxGlobalData *data = vol->conn->privateData; + IHardDisk *hardDisk = NULL; + unsigned char uuid[VIR_UUID_BUFLEN]; + PRUnichar *hddFormatUtf16 = NULL; + char *hddFormatUtf8 = NULL; + PRUint64 hddLogicalSize = 0; + PRUint64 hddActualSize = 0; + virStoragePoolDef pool; + virStorageVolDef def; + vboxIIDUnion hddIID; + PRUint32 hddstate; + nsresult rc; + char *ret = NULL; + + if (!data->vboxObj) { + return ret; + } + + virCheckFlags(0, NULL); + + memset(&pool, 0, sizeof(pool)); + memset(&def, 0, sizeof(def)); + + if (virUUIDParse(vol->key, uuid) < 0) { + virReportError(VIR_ERR_INVALID_ARG, + _("Could not parse UUID from '%s'"), vol->key); + return ret; + } + + VBOX_IID_INITIALIZE(&hddIID); + vboxIIDFromUUID(&hddIID, uuid); + rc = gVBoxAPI.UIVirtualBox.GetHardDiskByIID(data->vboxObj, &hddIID, &hardDisk); + if (NS_FAILED(rc)) + goto cleanup; + + gVBoxAPI.UIMedium.GetState(hardDisk, &hddstate); + if (hddstate == MediaState_Inaccessible) + goto cleanup; + + /* since there is currently one default pool now + * and virStorageVolDefFormat() just checks it type + * so just assign it for now, change the behaviour + * when vbox supports pools. + */ + pool.type = VIR_STORAGE_POOL_DIR; + def.type = VIR_STORAGE_VOL_FILE; + + rc = gVBoxAPI.UIHardDisk.GetLogicalSizeInByte(hardDisk, &hddLogicalSize); + if (NS_FAILED(rc)) + goto cleanup; + + def.target.capacity = hddLogicalSize; + + rc = gVBoxAPI.UIMedium.GetSize(hardDisk, &hddActualSize); + if (NS_FAILED(rc)) + goto cleanup; + + if (VIR_STRDUP(def.name, vol->name) < 0) + goto cleanup; + + if (VIR_STRDUP(def.key, vol->key) < 0) + goto cleanup; + + rc = gVBoxAPI.UIHardDisk.GetFormat(hardDisk, &hddFormatUtf16); + if (NS_FAILED(rc)) + goto cleanup; + + VBOX_UTF16_TO_UTF8(hddFormatUtf16, &hddFormatUtf8); + if (!hddFormatUtf8) + goto cleanup; + + VIR_DEBUG("Storage Volume Format: %s", hddFormatUtf8); + + if (STRCASEEQ("vmdk", hddFormatUtf8)) + def.target.format = VIR_STORAGE_FILE_VMDK; + else if (STRCASEEQ("vhd", hddFormatUtf8)) + def.target.format = VIR_STORAGE_FILE_VPC; + else if (STRCASEEQ("vdi", hddFormatUtf8)) + def.target.format = VIR_STORAGE_FILE_VDI; + else + def.target.format = VIR_STORAGE_FILE_RAW; + ret = virStorageVolDefFormat(&pool, &def); + + cleanup: + VBOX_UTF16_FREE(hddFormatUtf16); + VBOX_UTF8_FREE(hddFormatUtf8); + VBOX_MEDIUM_RELEASE(hardDisk); + vboxIIDUnalloc(&hddIID); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 5293710..3c8490a 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2033,123 +2033,6 @@ _registerDomainEvent(virHypervisorDriverPtr driver) * The Storage Functions here on */ -static char *vboxStorageVolGetXMLDesc(virStorageVolPtr vol, unsigned int flags) -{ - VBOX_OBJECT_CHECK(vol->conn, char *, NULL); - IHardDisk *hardDisk = NULL; - unsigned char uuid[VIR_UUID_BUFLEN]; - vboxIID hddIID = VBOX_IID_INITIALIZER; - virStoragePoolDef pool; - virStorageVolDef def; - int defOk = 0; - nsresult rc; - - virCheckFlags(0, NULL); - - memset(&pool, 0, sizeof(pool)); - memset(&def, 0, sizeof(def)); - - if (virUUIDParse(vol->key, uuid) < 0) { - virReportError(VIR_ERR_INVALID_ARG, - _("Could not parse UUID from '%s'"), vol->key); - return ret; - } - - vboxIIDFromUUID(&hddIID, uuid); -#if VBOX_API_VERSION < 4000000 - rc = data->vboxObj->vtbl->GetHardDisk(data->vboxObj, hddIID.value, &hardDisk); -#elif VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 4002000 - rc = data->vboxObj->vtbl->FindMedium(data->vboxObj, hddIID.value, - DeviceType_HardDisk, &hardDisk); -#else - rc = data->vboxObj->vtbl->OpenMedium(data->vboxObj, hddIID.value, - DeviceType_HardDisk, AccessMode_ReadWrite, - PR_FALSE, &hardDisk); -#endif /* VBOX_API_VERSION >= 4000000 */ - if (NS_SUCCEEDED(rc)) { - PRUint32 hddstate; - - VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetState, &hddstate); - if (NS_SUCCEEDED(rc) && hddstate != MediaState_Inaccessible) { - PRUnichar *hddFormatUtf16 = NULL; -#if VBOX_API_VERSION < 4000000 - PRUint64 hddLogicalSize; - PRUint64 hddActualSize; -#else /* VBOX_API_VERSION >= 4000000 */ - PRInt64 hddLogicalSize; - PRInt64 hddActualSize; -#endif /* VBOX_API_VERSION >= 4000000 */ - - /* since there is currently one default pool now - * and virStorageVolDefFormat() just checks it type - * so just assign it for now, change the behaviour - * when vbox supports pools. - */ - pool.type = VIR_STORAGE_POOL_DIR; - def.type = VIR_STORAGE_VOL_FILE; - defOk = 1; - - rc = hardDisk->vtbl->GetLogicalSize(hardDisk, &hddLogicalSize); - if (NS_SUCCEEDED(rc) && defOk) { -#if VBOX_API_VERSION < 4000000 - def.target.capacity = hddLogicalSize * 1024 * 1024; /* MB => Bytes */ -#else /* VBOX_API_VERSION >= 4000000 */ - def.target.capacity = hddLogicalSize; -#endif /* VBOX_API_VERSION >= 4000000 */ - } else { - defOk = 0; - } - - rc = VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetSize, &hddActualSize); - if (NS_SUCCEEDED(rc) && defOk) - def.target.allocation = hddActualSize; - else - defOk = 0; - - if (VIR_STRDUP(def.name, vol->name) < 0) - defOk = 0; - - if (VIR_STRDUP(def.key, vol->key) < 0) - defOk = 0; - - rc = hardDisk->vtbl->GetFormat(hardDisk, &hddFormatUtf16); - if (NS_SUCCEEDED(rc) && defOk) { - char *hddFormatUtf8 = NULL; - - VBOX_UTF16_TO_UTF8(hddFormatUtf16, &hddFormatUtf8); - if (hddFormatUtf8) { - - VIR_DEBUG("Storage Volume Format: %s", hddFormatUtf8); - - if (STRCASEEQ("vmdk", hddFormatUtf8)) - def.target.format = VIR_STORAGE_FILE_VMDK; - else if (STRCASEEQ("vhd", hddFormatUtf8)) - def.target.format = VIR_STORAGE_FILE_VPC; - else if (STRCASEEQ("vdi", hddFormatUtf8)) - def.target.format = VIR_STORAGE_FILE_VDI; - else - def.target.format = VIR_STORAGE_FILE_RAW; - - VBOX_UTF8_FREE(hddFormatUtf8); - } - - VBOX_UTF16_FREE(hddFormatUtf16); - } else { - defOk = 0; - } - } - - VBOX_MEDIUM_RELEASE(hardDisk); - } - - vboxIIDUnalloc(&hddIID); - - if (defOk) - ret = virStorageVolDefFormat(&pool, &def); - - return ret; -} - static char *vboxStorageVolGetPath(virStorageVolPtr vol) { VBOX_OBJECT_CHECK(vol->conn, char *, NULL); IHardDisk *hardDisk = NULL; @@ -4839,6 +4722,12 @@ _hardDiskGetLogicalSizeInByte(IHardDisk *hardDisk, PRUint64 *uLogicalSize) return rc; } +static nsresult +_hardDiskGetFormat(IHardDisk *hardDisk, PRUnichar **format) +{ + return hardDisk->vtbl->GetFormat(hardDisk, format); +} + static bool _machineStateOnline(PRUint32 state) { return ((state >= MachineState_FirstOnline) && @@ -5188,6 +5077,7 @@ static vboxUniformedIHardDisk _UIHardDisk = { .CreateBaseStorage = _hardDiskCreateBaseStorage, .DeleteStorage = _hardDiskDeleteStorage, .GetLogicalSizeInByte = _hardDiskGetLogicalSizeInByte, + .GetFormat = _hardDiskGetFormat, }; static uniformedMachineStateChecker _machineStateChecker = { diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 5360fa4..70deb33 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -530,6 +530,7 @@ typedef struct { PRUint32 variant, IProgress **progress); nsresult (*DeleteStorage)(IHardDisk *hardDisk, IProgress **progress); nsresult (*GetLogicalSizeInByte)(IHardDisk *hardDisk, PRUint64 *uLogicalSize); + nsresult (*GetFormat)(IHardDisk *hardDisk, PRUnichar **format); } vboxUniformedIHardDisk; typedef struct { @@ -622,6 +623,7 @@ virStorageVolPtr vboxStorageVolCreateXML(virStoragePoolPtr pool, const char *xml, unsigned int flags); int vboxStorageVolDelete(virStorageVolPtr vol, unsigned int flags); int vboxStorageVolGetInfo(virStorageVolPtr vol, virStorageVolInfoPtr info); +char *vboxStorageVolGetXMLDesc(virStorageVolPtr vol, unsigned int flags); /* 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