---
src/vbox/vbox_tmpl.c | 290 ++++++++++++++++++++++++++++++++-------------------
1 file changed, 183 insertions(+), 107 deletions(-)
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 7a8205d..79ce001 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -69,6 +69,8 @@
# include "vbox_CAPI_v4_3.h"
#elif VBOX_API_VERSION == 4003004
# include "vbox_CAPI_v4_3_4.h"
+#elif VBOX_API_VERSION == 5000000
+# include "vbox_CAPI_v5_0.h"
#else
# error "Unsupport VBOX_API_VERSION"
#endif
@@ -228,18 +230,18 @@ static void nsIDtoChar(unsigned char *uuid, const nsID *iid)
memcpy(uuidinterim, iid, VIR_UUID_BUFLEN);
virUUIDFormat(uuidinterim, uuidstrsrc);
- uuidstrdst[0] = uuidstrsrc[6];
- uuidstrdst[1] = uuidstrsrc[7];
- uuidstrdst[2] = uuidstrsrc[4];
- uuidstrdst[3] = uuidstrsrc[5];
- uuidstrdst[4] = uuidstrsrc[2];
- uuidstrdst[5] = uuidstrsrc[3];
- uuidstrdst[6] = uuidstrsrc[0];
- uuidstrdst[7] = uuidstrsrc[1];
+ uuidstrdst[0] = uuidstrsrc[6];
+ uuidstrdst[1] = uuidstrsrc[7];
+ uuidstrdst[2] = uuidstrsrc[4];
+ uuidstrdst[3] = uuidstrsrc[5];
+ uuidstrdst[4] = uuidstrsrc[2];
+ uuidstrdst[5] = uuidstrsrc[3];
+ uuidstrdst[6] = uuidstrsrc[0];
+ uuidstrdst[7] = uuidstrsrc[1];
- uuidstrdst[8] = uuidstrsrc[8];
+ uuidstrdst[8] = uuidstrsrc[8];
- uuidstrdst[9] = uuidstrsrc[11];
+ uuidstrdst[9] = uuidstrsrc[11];
uuidstrdst[10] = uuidstrsrc[12];
uuidstrdst[11] = uuidstrsrc[9];
uuidstrdst[12] = uuidstrsrc[10];
@@ -267,18 +269,18 @@ static void nsIDFromChar(nsID *iid, const unsigned char *uuid)
virUUIDFormat(uuid, uuidstrsrc);
- uuidstrdst[0] = uuidstrsrc[6];
- uuidstrdst[1] = uuidstrsrc[7];
- uuidstrdst[2] = uuidstrsrc[4];
- uuidstrdst[3] = uuidstrsrc[5];
- uuidstrdst[4] = uuidstrsrc[2];
- uuidstrdst[5] = uuidstrsrc[3];
- uuidstrdst[6] = uuidstrsrc[0];
- uuidstrdst[7] = uuidstrsrc[1];
+ uuidstrdst[0] = uuidstrsrc[6];
+ uuidstrdst[1] = uuidstrsrc[7];
+ uuidstrdst[2] = uuidstrsrc[4];
+ uuidstrdst[3] = uuidstrsrc[5];
+ uuidstrdst[4] = uuidstrsrc[2];
+ uuidstrdst[5] = uuidstrsrc[3];
+ uuidstrdst[6] = uuidstrsrc[0];
+ uuidstrdst[7] = uuidstrsrc[1];
- uuidstrdst[8] = uuidstrsrc[8];
+ uuidstrdst[8] = uuidstrsrc[8];
- uuidstrdst[9] = uuidstrsrc[11];
+ uuidstrdst[9] = uuidstrsrc[11];
uuidstrdst[10] = uuidstrsrc[12];
uuidstrdst[11] = uuidstrsrc[9];
uuidstrdst[12] = uuidstrsrc[10];
@@ -621,13 +623,12 @@ _vboxIIDFromArrayItem(vboxGlobalData *data, vboxIIDUnion *iidu,
# if VBOX_API_VERSION < 4000000
/* Only 3.x will use this function. */
static bool vboxGetDeviceDetails(const char *deviceName,
- PRUint32 *aMaxPortPerInst,
- PRUint32 *aMaxSlotPerPort,
- PRUint32 storageBus,
- PRInt32 *deviceInst,
- PRInt32 *devicePort,
- PRInt32 *deviceSlot)
-{
+ PRUint32 *aMaxPortPerInst,
+ PRUint32 *aMaxSlotPerPort,
+ PRUint32 storageBus,
+ PRInt32 *deviceInst,
+ PRInt32 *devicePort,
+ PRInt32 *deviceSlot) {
int total = 0;
PRUint32 maxPortPerInst = 0;
PRUint32 maxSlotPerPort = 0;
@@ -829,8 +830,8 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data,
IMachine *machin
machine->vtbl->GetDVDDrive(machine, &dvdDrive);
if (dvdDrive) {
- IDVDImage *dvdImage = NULL;
- PRUnichar *dvdfileUtf16 = NULL;
+ IDVDImage *dvdImage = NULL;
+ PRUnichar *dvdfileUtf16 = NULL;
vboxIID dvduuid = VBOX_IID_INITIALIZER;
vboxIID dvdemptyuuid = VBOX_IID_INITIALIZER;
@@ -873,10 +874,10 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data,
IMachine *machin
}
} else if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
if (type == VIR_STORAGE_TYPE_FILE && src) {
- IHardDisk *hardDisk = NULL;
+ IHardDisk *hardDisk = NULL;
PRUnichar *hddfileUtf16 = NULL;
vboxIID hdduuid = VBOX_IID_INITIALIZER;
- PRUnichar *hddEmpty = NULL;
+ PRUnichar *hddEmpty = NULL;
/* Current Limitation: Harddisk can't be connected to
* Secondary Master as Secondary Master is always used
* for CD/DVD Drive, so don't connect the harddisk if it
@@ -930,8 +931,8 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data,
IMachine *machin
VIR_DEBUG("Not connecting harddisk to hdc as
hdc"
" is taken by CD/DVD Drive");
} else {
- PRInt32 channel = 0;
- PRInt32 device = 0;
+ PRInt32 channel = 0;
+ PRInt32 device = 0;
PRUnichar *hddcnameUtf16 = NULL;
char *hddcname;
@@ -941,13 +942,13 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data,
IMachine *machin
if (STREQ(def->disks[i]->dst, "hda")) {
channel = 0;
- device = 0;
+ device = 0;
} else if (STREQ(def->disks[i]->dst,
"hdb")) {
channel = 0;
- device = 1;
+ device = 1;
} else if (STREQ(def->disks[i]->dst,
"hdd")) {
channel = 1;
- device = 1;
+ device = 1;
}
rc = machine->vtbl->AttachHardDisk(machine,
@@ -982,8 +983,8 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data,
IMachine *machin
if (floppyDrive) {
rc = floppyDrive->vtbl->SetEnabled(floppyDrive, 1);
if (NS_SUCCEEDED(rc)) {
- IFloppyImage *floppyImage = NULL;
- PRUnichar *fdfileUtf16 = NULL;
+ IFloppyImage *floppyImage = NULL;
+ PRUnichar *fdfileUtf16 = NULL;
vboxIID fduuid = VBOX_IID_INITIALIZER;
vboxIID fdemptyuuid = VBOX_IID_INITIALIZER;
@@ -1038,7 +1039,7 @@ static void
_vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
{
size_t i;
- nsresult rc = 0;
+ nsresult rc;
PRUint32 maxPortPerInst[StorageBus_Floppy + 1] = {};
PRUint32 maxSlotPerPort[StorageBus_Floppy + 1] = {};
@@ -1110,14 +1111,14 @@ _vboxAttachDrivesOld(virDomainDefPtr def, vboxGlobalData *data,
IMachine *machin
? "True" : "False"));
if (type == VIR_STORAGE_TYPE_FILE && src) {
- IMedium *medium = NULL;
- PRUnichar *mediumUUID = NULL;
+ IMedium *medium = NULL;
+ PRUnichar *mediumUUID = NULL;
PRUnichar *mediumFileUtf16 = NULL;
- PRUint32 storageBus = StorageBus_Null;
- PRUint32 deviceType = DeviceType_Null;
- PRInt32 deviceInst = 0;
- PRInt32 devicePort = 0;
- PRInt32 deviceSlot = 0;
+ PRUint32 storageBus = StorageBus_Null;
+ PRUint32 deviceType = DeviceType_Null;
+ PRInt32 deviceInst = 0;
+ PRInt32 devicePort = 0;
+ PRInt32 deviceSlot = 0;
VBOX_UTF8_TO_UTF16(src, &mediumFileUtf16);
@@ -1311,7 +1312,9 @@ _vboxDomainSnapshotRestore(virDomainPtr dom,
ISnapshot *snapshot)
{
vboxGlobalData *data = dom->conn->privateData;
+# if VBOX_API_VERSION < 5000000
IConsole *console = NULL;
+# endif /*VBOX_API_VERSION < 5000000*/
IProgress *progress = NULL;
PRUint32 state;
nsresult rc;
@@ -1344,16 +1347,22 @@ _vboxDomainSnapshotRestore(virDomainPtr dom,
}
rc = VBOX_SESSION_OPEN(domiid.value, machine);
+# if VBOX_API_VERSION < 5000000
if (NS_SUCCEEDED(rc))
rc = data->vboxSession->vtbl->GetConsole(data->vboxSession,
&console);
+# endif /*VBOX_API_VERSION < 5000000*/
if (NS_FAILED(rc)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("could not open VirtualBox session with domain %s"),
dom->name);
goto cleanup;
}
-
+# if VBOX_API_VERSION < 5000000
rc = console->vtbl->RestoreSnapshot(console, snapshot, &progress);
+# elif VBOX_API_VERSION >= 5000000 /*VBOX_API_VERSION < 5000000*/
+ rc = machine->vtbl->RestoreSnapshot(machine, snapshot, &progress);
+# endif /*VBOX_API_VERSION >= 5000000*/
+
if (NS_FAILED(rc) || !progress) {
if (rc == VBOX_E_INVALID_VM_STATE) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
@@ -1378,7 +1387,9 @@ _vboxDomainSnapshotRestore(virDomainPtr dom,
cleanup:
VBOX_RELEASE(progress);
+# if VBOX_API_VERSION < 5000000
VBOX_RELEASE(console);
+# endif /*VBOX_API_VERSION < 5000000*/
VBOX_SESSION_CLOSE();
vboxIIDUnalloc(&domiid);
return ret;
@@ -1406,8 +1417,8 @@ vboxCallbackOnMachineStateChange(IVirtualBoxCallback *pThis
ATTRIBUTE_UNUSED,
PRUnichar *machineId, PRUint32 state)
{
virDomainPtr dom = NULL;
- int event = 0;
- int detail = 0;
+ int event = 0;
+ int detail = 0;
vboxDriverLock(g_pVBoxGlobalData);
@@ -1415,7 +1426,7 @@ vboxCallbackOnMachineStateChange(IVirtualBoxCallback *pThis
ATTRIBUTE_UNUSED,
DEBUGPRUnichar("machineId", machineId);
if (machineId) {
- char *machineIdUtf8 = NULL;
+ char *machineIdUtf8 = NULL;
unsigned char uuid[VIR_UUID_BUFLEN];
g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8);
@@ -1426,31 +1437,31 @@ vboxCallbackOnMachineStateChange(IVirtualBoxCallback *pThis
ATTRIBUTE_UNUSED,
virObjectEventPtr ev;
if (state == MachineState_Starting) {
- event = VIR_DOMAIN_EVENT_STARTED;
+ event = VIR_DOMAIN_EVENT_STARTED;
detail = VIR_DOMAIN_EVENT_STARTED_BOOTED;
} else if (state == MachineState_Restoring) {
- event = VIR_DOMAIN_EVENT_STARTED;
+ event = VIR_DOMAIN_EVENT_STARTED;
detail = VIR_DOMAIN_EVENT_STARTED_RESTORED;
} else if (state == MachineState_Paused) {
- event = VIR_DOMAIN_EVENT_SUSPENDED;
+ event = VIR_DOMAIN_EVENT_SUSPENDED;
detail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
} else if (state == MachineState_Running) {
- event = VIR_DOMAIN_EVENT_RESUMED;
+ event = VIR_DOMAIN_EVENT_RESUMED;
detail = VIR_DOMAIN_EVENT_RESUMED_UNPAUSED;
} else if (state == MachineState_PoweredOff) {
- event = VIR_DOMAIN_EVENT_STOPPED;
+ event = VIR_DOMAIN_EVENT_STOPPED;
detail = VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN;
} else if (state == MachineState_Stopping) {
- event = VIR_DOMAIN_EVENT_STOPPED;
+ event = VIR_DOMAIN_EVENT_STOPPED;
detail = VIR_DOMAIN_EVENT_STOPPED_DESTROYED;
} else if (state == MachineState_Aborted) {
- event = VIR_DOMAIN_EVENT_STOPPED;
+ event = VIR_DOMAIN_EVENT_STOPPED;
detail = VIR_DOMAIN_EVENT_STOPPED_CRASHED;
} else if (state == MachineState_Saving) {
- event = VIR_DOMAIN_EVENT_STOPPED;
+ event = VIR_DOMAIN_EVENT_STOPPED;
detail = VIR_DOMAIN_EVENT_STOPPED_SAVED;
} else {
- event = VIR_DOMAIN_EVENT_STOPPED;
+ event = VIR_DOMAIN_EVENT_STOPPED;
detail = VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN;
}
@@ -1525,8 +1536,8 @@ vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis
ATTRIBUTE_UNUSED,
PRUnichar *machineId, PRBool registered)
{
virDomainPtr dom = NULL;
- int event = 0;
- int detail = 0;
+ int event = 0;
+ int detail = 0;
vboxDriverLock(g_pVBoxGlobalData);
@@ -1534,7 +1545,7 @@ vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis
ATTRIBUTE_UNUSED,
DEBUGPRUnichar("machineId", machineId);
if (machineId) {
- char *machineIdUtf8 = NULL;
+ char *machineIdUtf8 = NULL;
unsigned char uuid[VIR_UUID_BUFLEN];
g_pVBoxGlobalData->pFuncs->pfnUtf16ToUtf8(machineId, &machineIdUtf8);
@@ -1551,10 +1562,10 @@ vboxCallbackOnMachineRegistered(IVirtualBoxCallback *pThis
ATTRIBUTE_UNUSED,
* to show the VIR_DOMAIN_EVENT_UNDEFINED event
*/
if (registered) {
- event = VIR_DOMAIN_EVENT_DEFINED;
+ event = VIR_DOMAIN_EVENT_DEFINED;
detail = VIR_DOMAIN_EVENT_DEFINED_ADDED;
} else {
- event = VIR_DOMAIN_EVENT_UNDEFINED;
+ event = VIR_DOMAIN_EVENT_UNDEFINED;
detail = VIR_DOMAIN_EVENT_UNDEFINED_REMOVED;
}
@@ -1750,7 +1761,7 @@ vboxConnectDomainEventRegister(virConnectPtr conn,
virFreeCallback freecb)
{
vboxGlobalData *data = conn->privateData;
- int vboxRet = -1;
+ int vboxRet = -1;
nsresult rc;
int ret = -1;
@@ -1854,7 +1865,7 @@ static int vboxConnectDomainEventRegisterAny(virConnectPtr conn,
virFreeCallback freecb)
{
vboxGlobalData *data = conn->privateData;
- int vboxRet = -1;
+ int vboxRet = -1;
nsresult rc;
int ret = -1;
@@ -2160,26 +2171,26 @@ _dumpIDEHDDsOld(virDomainDefPtr def,
vboxGlobalData *data,
IMachine *machine)
{
- PRInt32 hddNum = 0;
- IHardDisk *hardDiskPM = NULL;
- IHardDisk *hardDiskPS = NULL;
- IHardDisk *hardDiskSS = NULL;
- const char *hddBus = "IDE";
- PRUnichar *hddBusUtf16 = NULL;
+ PRInt32 hddNum = 0;
+ IHardDisk *hardDiskPM = NULL;
+ IHardDisk *hardDiskPS = NULL;
+ IHardDisk *hardDiskSS = NULL;
+ const char *hddBus = "IDE";
+ PRUnichar *hddBusUtf16 = NULL;
/* dump IDE hdds if present */
VBOX_UTF8_TO_UTF16(hddBus, &hddBusUtf16);
def->ndisks = 0;
- machine->vtbl->GetHardDisk(machine, hddBusUtf16, 0, 0, &hardDiskPM);
+ machine->vtbl->GetHardDisk(machine, hddBusUtf16, 0, 0, &hardDiskPM);
if (hardDiskPM)
def->ndisks++;
- machine->vtbl->GetHardDisk(machine, hddBusUtf16, 0, 1, &hardDiskPS);
+ machine->vtbl->GetHardDisk(machine, hddBusUtf16, 0, 1, &hardDiskPS);
if (hardDiskPS)
def->ndisks++;
- machine->vtbl->GetHardDisk(machine, hddBusUtf16, 1, 1, &hardDiskSS);
+ machine->vtbl->GetHardDisk(machine, hddBusUtf16, 1, 1, &hardDiskSS);
if (hardDiskSS)
def->ndisks++;
@@ -2199,8 +2210,8 @@ _dumpIDEHDDsOld(virDomainDefPtr def,
if (hardDiskPM) {
PRUnichar *hddlocationUtf16 = NULL;
- char *hddlocation = NULL;
- PRUint32 hddType = HardDiskType_Normal;
+ char *hddlocation = NULL;
+ PRUint32 hddType = HardDiskType_Normal;
hardDiskPM->vtbl->imedium.GetLocation((IMedium *)hardDiskPM,
&hddlocationUtf16);
VBOX_UTF16_TO_UTF8(hddlocationUtf16, &hddlocation);
@@ -2221,8 +2232,8 @@ _dumpIDEHDDsOld(virDomainDefPtr def,
if (hardDiskPS) {
PRUnichar *hddlocationUtf16 = NULL;
- char *hddlocation = NULL;
- PRUint32 hddType = HardDiskType_Normal;
+ char *hddlocation = NULL;
+ PRUint32 hddType = HardDiskType_Normal;
hardDiskPS->vtbl->imedium.GetLocation((IMedium *)hardDiskPS,
&hddlocationUtf16);
VBOX_UTF16_TO_UTF8(hddlocationUtf16, &hddlocation);
@@ -2243,8 +2254,8 @@ _dumpIDEHDDsOld(virDomainDefPtr def,
if (hardDiskSS) {
PRUnichar *hddlocationUtf16 = NULL;
- char *hddlocation = NULL;
- PRUint32 hddType = HardDiskType_Normal;
+ char *hddlocation = NULL;
+ PRUint32 hddType = HardDiskType_Normal;
hardDiskSS->vtbl->imedium.GetLocation((IMedium *)hardDiskSS,
&hddlocationUtf16);
VBOX_UTF16_TO_UTF8(hddlocationUtf16, &hddlocation);
@@ -2269,10 +2280,10 @@ _dumpDVD(virDomainDefPtr def,
vboxGlobalData *data,
IMachine *machine)
{
- IDVDDrive *dvdDrive = NULL;
- IDVDImage *dvdImage = NULL;
+ IDVDDrive *dvdDrive = NULL;
+ IDVDImage *dvdImage = NULL;
PRUnichar *locationUtf16 = NULL;
- char *location = NULL;
+ char *location = NULL;
/* dump CDROM/DVD if the drive is attached and has DVD/CD in it */
@@ -2323,8 +2334,8 @@ _dumpDVD(virDomainDefPtr def,
static int
_attachDVD(vboxGlobalData *data, IMachine *machine, const char *src)
{
- IDVDDrive *dvdDrive = NULL;
- IDVDImage *dvdImage = NULL;
+ IDVDDrive *dvdDrive = NULL;
+ IDVDImage *dvdImage = NULL;
PRUnichar *dvdfileUtf16 = NULL;
vboxIID dvduuid = VBOX_IID_INITIALIZER;
vboxIID dvdemptyuuid = VBOX_IID_INITIALIZER;
@@ -2410,10 +2421,10 @@ _dumpFloppy(virDomainDefPtr def,
{
IFloppyDrive *floppyDrive = NULL;
IFloppyImage *floppyImage = NULL;
- PRUnichar *locationUtf16 = NULL;
- char *location = NULL;
- PRBool enabled = PR_FALSE;
- PRUint32 state = DriveState_Null;
+ PRUnichar *locationUtf16 = NULL;
+ char *location = NULL;
+ PRBool enabled = PR_FALSE;
+ PRUint32 state = DriveState_Null;
/* dump Floppy if the drive is attached and has floppy in it */
machine->vtbl->GetFloppyDrive(machine, &floppyDrive);
@@ -2466,8 +2477,8 @@ static int
_attachFloppy(vboxGlobalData *data, IMachine *machine, const char *src)
{
IFloppyDrive *floppyDrive;
- IFloppyImage *floppyImage = NULL;
- PRUnichar *fdfileUtf16 = NULL;
+ IFloppyImage *floppyImage = NULL;
+ PRUnichar *fdfileUtf16 = NULL;
vboxIID fduuid = VBOX_IID_INITIALIZER;
vboxIID fdemptyuuid = VBOX_IID_INITIALIZER;
nsresult rc;
@@ -2812,7 +2823,7 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def,
IMachine **m
{
vboxIID iid = VBOX_IID_INITIALIZER;
PRUnichar *machineNameUtf16 = NULL;
- nsresult rc = -1;
+ nsresult rc;
VBOX_UTF8_TO_UTF16(def->name, &machineNameUtf16);
vboxIIDFromUUID(&iid, def->uuid);
@@ -2825,7 +2836,7 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def,
IMachine **m
iid.value,
machine);
#elif VBOX_API_VERSION < 4000000 /* 3002000 <= VBOX_API_VERSION < 4000000 */
- PRBool override = PR_FALSE;
+ PRBool override = PR_FALSE;
rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj,
machineNameUtf16,
NULL,
@@ -2834,7 +2845,7 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def,
IMachine **m
override,
machine);
#elif VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 4002000
- PRBool override = PR_FALSE;
+ PRBool override = PR_FALSE;
rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj,
NULL,
machineNameUtf16,
@@ -2843,12 +2854,18 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr
def, IMachine **m
override,
machine);
#else /* VBOX_API_VERSION >= 4002000 */
- char *createFlags = NULL;
+ const char *flagsUUIDPrefix = "UUID=";
+ const char *flagsForceOverwrite = "forceOverwrite=0";
+ const char *flagsSeparator = ",";
+ char createFlags[strlen(flagsUUIDPrefix) + VIR_UUID_STRING_BUFLEN +
strlen(flagsSeparator) + strlen(flagsForceOverwrite) + 1];
PRUnichar *createFlagsUtf16 = NULL;
- if (virAsprintf(&createFlags,
- "UUID=%s,forceOverwrite=0", uuidstr) < 0)
- goto cleanup;
+ snprintf(createFlags, sizeof(createFlags), "%s%s%s%s",
+ flagsUUIDPrefix,
+ uuidstr,
+ flagsSeparator,
+ flagsForceOverwrite
+ );
VBOX_UTF8_TO_UTF16(createFlags, &createFlagsUtf16);
rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj,
NULL,
@@ -2858,8 +2875,6 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def,
IMachine **m
nsnull,
createFlagsUtf16,
machine);
- cleanup:
- VIR_FREE(createFlags);
#endif /* VBOX_API_VERSION >= 4002000 */
}
VBOX_UTF16_FREE(machineNameUtf16);
@@ -2874,7 +2889,12 @@ _virtualboxCreateHardDisk(IVirtualBox *vboxObj, PRUnichar *format,
/* In vbox 2.2 and 3.0, this function will create a IHardDisk object.
* In vbox 3.1 and later, this function will create a IMedium object.
*/
+#if VBOX_API_VERSION < 5000000
return vboxObj->vtbl->CreateHardDisk(vboxObj, format, location, hardDisk);
+#elif VBOX_API_VERSION >= 5000000 /*VBOX_API_VERSION >= 5000000*/
+ return vboxObj->vtbl->CreateMedium(vboxObj, format, location,
AccessMode_ReadWrite, DeviceType_HardDisk, hardDisk);
+#endif /*VBOX_API_VERSION >= 5000000*/
+
}
static nsresult
@@ -3366,7 +3386,23 @@ _sessionGetMachine(ISession *session, IMachine **machine)
static nsresult
_consoleSaveState(IConsole *console, IProgress **progress)
{
+#if VBOX_API_VERSION < 5000000
return console->vtbl->SaveState(console, progress);
+#else /*VBOX_API_VERSION < 5000000*/
+ IMachine *machine;
+ nsresult rc;
+
+ rc = console->vtbl->GetMachine(console, &machine);
+
+ if (NS_SUCCEEDED(rc))
+ rc = machine->vtbl->SaveState(machine, progress);
+ else
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unable to get machine from console. (error %d)"), rc);
+
+ return rc;
+
+#endif /*VBOX_API_VERSION >= 5000000*/
}
static nsresult
@@ -3414,7 +3450,25 @@ static nsresult
_consoleTakeSnapshot(IConsole *console, PRUnichar *name,
PRUnichar *description, IProgress **progress)
{
+#if VBOX_API_VERSION < 5000000
return console->vtbl->TakeSnapshot(console, name, description, progress);
+#else
+ IMachine *machine;
+ nsresult rc;
+ PRUnichar *id = NULL;
+ bool bpause = true; /*NO live snapshot*/
+
+ rc = console->vtbl->GetMachine(console, &machine);
+
+ if (NS_SUCCEEDED(rc))
+ rc = machine->vtbl->TakeSnapshot(machine, name, description, bpause, &id,
progress);
+ else
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unable to get machine from console. (error %d)"), rc);
+
+ VBOX_RELEASE(machine);
+ return rc;
+#endif /* VBOX_API_VERSION >= 5000000 */
}
static nsresult
@@ -3422,9 +3476,24 @@ _consoleDeleteSnapshot(IConsole *console, vboxIIDUnion *iidu,
IProgress **progre
{
#if VBOX_API_VERSION < 3001000
return console->vtbl->DiscardSnapshot(console, IID_MEMBER(value), progress);
-#else /* VBOX_API_VERSION >= 3001000 */
+#elif VBOX_API_VERSION >= 3001000 && VBOX_API_VERSION < 5000000 /*
VBOX_API_VERSION >= 3001000 */
return console->vtbl->DeleteSnapshot(console, IID_MEMBER(value), progress);
-#endif /* VBOX_API_VERSION >= 3001000 */
+#else /* VBOX_API_VERSION >= 5000000 */
+ IMachine *machine;
+ nsresult rc;
+
+ rc = console->vtbl->GetMachine(console, &machine);
+
+ if (NS_SUCCEEDED(rc))
+ rc = machine->vtbl->DeleteSnapshot(machine, IID_MEMBER(value), progress);
+ else
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unable to get machine from console. (error %d)"), rc);
+
+ VBOX_RELEASE(machine);
+
+ return rc;
+#endif /* VBOX_API_VERSION >= 5000000 */
}
static nsresult
@@ -4342,11 +4411,18 @@ _displayGetScreenResolution(IDisplay *display ATTRIBUTE_UNUSED,
#elif VBOX_API_VERSION < 4003000
return display->vtbl->GetScreenResolution(display, screenId, width,
height, bitsPerPixel);
-#else /* VBOX_API_VERSION >= 4003000 */
+#elif VBOX_API_VERSION < 5000000 /* VBOX_API_VERSION >= 4003000 */
return display->vtbl->GetScreenResolution(display, screenId, width,
height, bitsPerPixel,
xOrigin, yOrigin);
-#endif /* VBOX_API_VERSION >= 4003000 */
+#else /*VBOX_API_VERSION >= 5000000 */
+ PRUint32 gms;
+
+ return display->vtbl->GetScreenResolution(display, screenId, width,
+ height, bitsPerPixel,
+ xOrigin, yOrigin, &gms);
+#endif /* VBOX_API_VERSION >= 5000000 */
+
}
static nsresult
@@ -4357,10 +4433,10 @@ _displayTakeScreenShotPNGToArray(IDisplay *display
ATTRIBUTE_UNUSED,
PRUint32 *screenDataSize ATTRIBUTE_UNUSED,
PRUint8** screenData ATTRIBUTE_UNUSED)
{
-#if VBOX_API_VERSION < 4000000
+#if VBOX_API_VERSION < 4000000 || VBOX_API_VERSION >= 5000000
vboxUnsupported();
return 0;
-#else /* VBOX_API_VERSION >= 4000000 */
+#else /* VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 5000000 */
return display->vtbl->TakeScreenShotPNGToArray(display, screenId, width,
height, screenDataSize,
screenData);
--
2.7.4