diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h index 434689bb57a604e0c94362c3b5b5f2ac4536dc40..a093481e03dea4abbe41c0845202b07341120cfb 100644 --- a/src/vbox/vbox_common.h +++ b/src/vbox/vbox_common.h @@ -269,5 +269,6 @@ typedef nsISupports IMedium; typedef nsISupports IMediumAttachment; typedef nsISupports IStorageController; typedef nsISupports ISharedFolder; +typedef nsISupports ISnapshot; #endif /* VBOX_COMMON_H */ diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 10eab8840d7a59e3260105ef84a3e281e1dbf59f..eac6236f0ce38e8be69ba167773eb9b627bf1f0d 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -666,7 +666,6 @@ _vboxIIDFromArrayItem(vboxGlobalData *data, vboxIIDUnion *iidu, vboxIIDFromArrayItem_v3_x(data, &iidu->vboxIID_v3_x, array, idx); } - # define vboxIIDUnalloc(iid) vboxIIDUnalloc_v3_x(data, iid) # define vboxIIDToUUID(iid, uuid) vboxIIDToUUID_v3_x(data, iid, uuid) # define vboxIIDFromUUID(iid, uuid) vboxIIDFromUUID_v3_x(data, iid, uuid) @@ -677,7 +676,6 @@ _vboxIIDFromArrayItem(vboxGlobalData *data, vboxIIDUnion *iidu, #endif /* !(VBOX_API_VERSION == 2002000) */ - /** * function to generate the name for medium, * for e.g: hda, sda, etc @@ -7786,6 +7784,18 @@ static void _DEBUGIID(const char *msg, vboxIIDUnion *iidu) #endif /* VBOX_API_VERSION != 2002000 */ +static void +_vboxIIDToUtf8(vboxGlobalData *data ATTRIBUTE_UNUSED, + vboxIIDUnion *iidu ATTRIBUTE_UNUSED, + char **utf8 ATTRIBUTE_UNUSED) +{ +#if VBOX_API_VERSION == 2002000 + vboxUnsupported(); +#else /* !(VBOX_API_VERSION == 2002000) */ + data->pFuncs->pfnUtf16ToUtf8(IID_MEMBER(value), utf8); +#endif /* !(VBOX_API_VERSION == 2002000) */ +} + static void* _handleGetMachines(IVirtualBox *vboxObj) { return vboxObj->vtbl->GetMachines; @@ -7839,6 +7849,12 @@ _virtualboxGetMachine(IVirtualBox *vboxObj, vboxIIDUnion *iidu, IMachine **machi #endif /* VBOX_API_VERSION >= 4000000 */ +static nsresult +_virtualboxOpenMachine(IVirtualBox *vboxObj, PRUnichar *settingsFile, IMachine **machine) +{ + return vboxObj->vtbl->OpenMachine(vboxObj, settingsFile, machine); +} + static nsresult _virtualboxGetSystemProperties(IVirtualBox *vboxObj, ISystemProperties **systemProperties) { @@ -7909,6 +7925,20 @@ _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **m return rc; } +static nsresult +_virtualboxCreateHardDiskMedium(IVirtualBox *vboxObj ATTRIBUTE_UNUSED, + PRUnichar *format ATTRIBUTE_UNUSED, + PRUnichar *location ATTRIBUTE_UNUSED, + IMedium **medium ATTRIBUTE_UNUSED) +{ +#if VBOX_API_VERSION < 3001000 + vboxUnsupported(); + return 0; +#else /* VBOX_API_VERSION >= 3001000 */ + return vboxObj->vtbl->CreateHardDisk(vboxObj, format, location, medium); +#endif /* VBOX_API_VERSION >= 3001000 */ +} + static nsresult _virtualboxRegisterMachine(IVirtualBox *vboxObj, IMachine *machine) { @@ -8032,6 +8062,20 @@ _machineLaunchVMProcess(vboxGlobalData *data, #endif /* VBOX_API_VERSION >= 4000000 */ } +static nsresult +_machineUnregister(IMachine *machine ATTRIBUTE_UNUSED, + PRUint32 cleanupMode ATTRIBUTE_UNUSED, + PRUint32 *aMediaSize ATTRIBUTE_UNUSED, + IMedium ***aMedia ATTRIBUTE_UNUSED) +{ +#if VBOX_API_VERSION < 4000000 + vboxUnsupported(); + return 0; +#else /* VBOX_API_VERSION >= 4000000 */ + return machine->vtbl->Unregister(machine, cleanupMode, aMediaSize, aMedia); +#endif /* VBOX_API_VERSION >= 4000000 */ +} + static nsresult _machineGetAccessible(IMachine *machine, PRBool *isAccessible) { @@ -8117,6 +8161,18 @@ _machineGetUSBCommon(IMachine *machine, IUSBCommon **USBCommon) #endif } +static nsresult +_machineGetCurrentSnapshot(IMachine *machine, ISnapshot **currentSnapshot) +{ + return machine->vtbl->GetCurrentSnapshot(machine, currentSnapshot); +} + +static nsresult +_machineGetSettingsFilePath(IMachine *machine, PRUnichar **settingsFilePath) +{ + return machine->vtbl->GetSettingsFilePath(machine, settingsFilePath); +} + static nsresult _machineGetCPUCount(IMachine *machine, PRUint32 *CPUCount) { @@ -8356,6 +8412,13 @@ _consoleReset(IConsole *console) return console->vtbl->Reset(console); } +static nsresult +_consoleTakeSnapshot(IConsole *console, PRUnichar *name, + PRUnichar *description, IProgress **progress) +{ + return console->vtbl->TakeSnapshot(console, name, description, progress); +} + static nsresult _progressWaitForCompletion(IProgress *progress, PRInt32 timeout) { @@ -9012,10 +9075,74 @@ static nsresult _mediumGetReadOnly(IMedium *medium ATTRIBUTE_UNUSED, #endif /* VBOX_API_VERSION >= 3001000 */ } +#if VBOX_API_VERSION < 3001000 + +static nsresult _mediumGetParent(IMedium *medium ATTRIBUTE_UNUSED, + IMedium **parent ATTRIBUTE_UNUSED) +{ + vboxUnsupported(); + return 0; +} + +static nsresult _mediumGetChildren(IMedium *medium ATTRIBUTE_UNUSED, + PRUint32 *childrenSize ATTRIBUTE_UNUSED, + IMedium ***children ATTRIBUTE_UNUSED) +{ + vboxUnsupported(); + return 0; +} + +static nsresult _mediumGetFormat(IMedium *medium ATTRIBUTE_UNUSED, + PRUnichar **format ATTRIBUTE_UNUSED) +{ + vboxUnsupported(); + return 0; +} + +static nsresult _mediumDeleteStorage(IMedium *medium ATTRIBUTE_UNUSED, + IProgress **progress ATTRIBUTE_UNUSED) +{ + vboxUnsupported(); + return 0; +} + +#else /* VBOX_API_VERSION >= 3001000 */ + +static nsresult _mediumGetParent(IMedium *medium, + IMedium **parent) +{ + return medium->vtbl->GetParent(medium, parent); +} + +static nsresult _mediumGetChildren(IMedium *medium, + PRUint32 *childrenSize, + IMedium ***children) +{ + return medium->vtbl->GetChildren(medium, childrenSize, children); +} + +static nsresult _mediumGetFormat(IMedium *medium, + PRUnichar **format) +{ + return medium->vtbl->GetFormat(medium, format); +} + +static nsresult _mediumDeleteStorage(IMedium *medium, + IProgress **progress) +{ + return medium->vtbl->DeleteStorage(medium, progress); +} + +#endif /* VBOX_API_VERSION >= 3001000 */ + static nsresult _mediumRelease(IMedium *medium) { return medium->vtbl->nsisupports.Release((nsISupports *)medium); } +static nsresult _mediumClose(IMedium *medium) +{ + return medium->vtbl->Close(medium); +} static nsresult _mediumSetType(IMedium *medium ATTRIBUTE_UNUSED, PRUint32 type ATTRIBUTE_UNUSED) @@ -9028,6 +9155,27 @@ static nsresult _mediumSetType(IMedium *medium ATTRIBUTE_UNUSED, #endif } +static nsresult +_mediumCreateDiffStorage(IMedium *medium ATTRIBUTE_UNUSED, + IMedium *target ATTRIBUTE_UNUSED, + PRUint32 variantSize ATTRIBUTE_UNUSED, + PRUint32 *variant ATTRIBUTE_UNUSED, + IProgress **progress ATTRIBUTE_UNUSED) +{ +#if VBOX_API_VERSION < 3001000 + vboxUnsupported(); + return 0; +#elif VBOX_API_VERSION < 4003000 + if (variantSize == 0) + return 0; + if (variantSize > 1) + VIR_WARN("Only one variant is avaible in current version"); + return medium->vtbl->CreateDiffStorage(medium, target, variant[0], progress); +#else /* VBOX_API_VERSION >= 4003000 */ + return medium->vtbl->CreateDiffStorage(medium, target, variantSize, variant, progress); +#endif /* VBOX_API_VERSION >= 4003000 */ +} + static nsresult _mediumAttachmentGetMedium(IMediumAttachment *mediumAttachment ATTRIBUTE_UNUSED, IMedium **medium ATTRIBUTE_UNUSED) @@ -9146,6 +9294,7 @@ static vboxUniformedIID _UIID = { .vboxIIDFromUUID = _vboxIIDFromUUID, .vboxIIDIsEqual = _vboxIIDIsEqual, .vboxIIDFromArrayItem = _vboxIIDFromArrayItem, + .vboxIIDToUtf8 = _vboxIIDToUtf8, .DEBUGIID = _DEBUGIID, }; @@ -9165,8 +9314,10 @@ static vboxUniformednsISupports _nsUISupports = { static vboxUniformedIVirtualBox _UIVirtualBox = { .GetVersion = _virtualboxGetVersion, .GetMachine = _virtualboxGetMachine, + .OpenMachine = _virtualboxOpenMachine, .GetSystemProperties = _virtualboxGetSystemProperties, .CreateMachine = _virtualboxCreateMachine, + .CreateHardDiskMedium = _virtualboxCreateHardDiskMedium, .RegisterMachine = _virtualboxRegisterMachine, .FindMedium = _virtualboxFindMedium, .OpenMedium = _virtualboxOpenMedium, @@ -9179,6 +9330,7 @@ static vboxUniformedIMachine _UIMachine = { .CreateSharedFolder = _machineCreateSharedFolder, .RemoveSharedFolder = _machineRemoveSharedFolder, .LaunchVMProcess = _machineLaunchVMProcess, + .Unregister = _machineUnregister, .GetAccessible = _machineGetAccessible, .GetState = _machineGetState, .GetName = _machineGetName, @@ -9191,6 +9343,8 @@ static vboxUniformedIMachine _UIMachine = { .GetParallelPort = _machineGetParallelPort, .GetVRDxServer = _machineGetVRDxServer, .GetUSBCommon = _machineGetUSBCommon, + .GetCurrentSnapshot = _machineGetCurrentSnapshot, + .GetSettingsFilePath = _machineGetSettingsFilePath, .GetCPUCount = _machineGetCPUCount, .SetCPUCount = _machineSetCPUCount, .GetMemorySize = _machineGetMemorySize, @@ -9227,6 +9381,7 @@ static vboxUniformedIConsole _UIConsole = { .PowerButton = _consolePowerButton, .PowerDown = _consolePowerDown, .Reset = _consoleReset, + .TakeSnapshot = _consoleTakeSnapshot, }; static vboxUniformedIProgress _UIProgress = { @@ -9337,8 +9492,14 @@ static vboxUniformedIMedium _UIMedium = { .GetId = _mediumGetId, .GetLocation = _mediumGetLocation, .GetReadOnly = _mediumGetReadOnly, + .GetParent = _mediumGetParent, + .GetChildren = _mediumGetChildren, + .GetFormat = _mediumGetFormat, + .DeleteStorage = _mediumDeleteStorage, .Release = _mediumRelease, + .Close = _mediumClose, .SetType = _mediumSetType, + .CreateDiffStorage = _mediumCreateDiffStorage, }; static vboxUniformedIMediumAttachment _UIMediumAttachment = { @@ -9446,6 +9607,12 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI) pVBoxAPI->accelerate2DVideo = 0; pVBoxAPI->oldMediumInterface = 1; #endif /* VBOX_API_VERSION < 3001000 */ + +#if VBOX_API_VERSION >= 4002000 + pVBoxAPI->vboxSnapshotRedefine = 1; +#else /* VBOX_API_VERSION < 4002000 */ + pVBoxAPI->vboxSnapshotRedefine = 0; +#endif /* VBOX_API_VERSION < 4002000 */ } /** diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 48c2973e9818362825fd86b5b5aff5dc9ea2609e..b36e1548c02f303b74d8aead6d42669d1f078167 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -159,6 +159,7 @@ typedef struct { void (*vboxIIDFromUUID)(vboxGlobalData *data, vboxIIDUnion *iidu, const unsigned char *uuid); bool (*vboxIIDIsEqual)(vboxGlobalData *data, vboxIIDUnion *iidu1, vboxIIDUnion *iidu2); void (*vboxIIDFromArrayItem)(vboxGlobalData *data, vboxIIDUnion *iidu, vboxArray *array, int idx); + void (*vboxIIDToUtf8)(vboxGlobalData *data, vboxIIDUnion *iidu, char **utf8); void (*DEBUGIID)(const char *msg, vboxIIDUnion *iidu); } vboxUniformedIID; @@ -182,8 +183,10 @@ typedef struct { typedef struct { nsresult (*GetVersion)(IVirtualBox *vboxObj, PRUnichar **versionUtf16); nsresult (*GetMachine)(IVirtualBox *vboxObj, vboxIIDUnion *iidu, IMachine **machine); + nsresult (*OpenMachine)(IVirtualBox *vboxObj, PRUnichar *settingsFile, IMachine **machine); nsresult (*GetSystemProperties)(IVirtualBox *vboxObj, ISystemProperties **systemProperties); nsresult (*CreateMachine)(vboxGlobalData *data, virDomainDefPtr def, IMachine **machine, char *uuidstr); + nsresult (*CreateHardDiskMedium)(IVirtualBox *vboxObj, PRUnichar *format, PRUnichar *location, IMedium **medium); nsresult (*RegisterMachine)(IVirtualBox *vboxObj, IMachine *machine); nsresult (*FindMedium)(IVirtualBox *vboxObj, PRUnichar *location, PRUint32 deviceType, PRUint32 accessMode, IMedium **medium); nsresult (*OpenMedium)(IVirtualBox *vboxObj, PRUnichar *location, PRUint32 deviceType, PRUint32 accessMode, IMedium **medium); @@ -206,6 +209,8 @@ typedef struct { vboxIIDUnion *iidu, PRUnichar *sessionType, PRUnichar *env, IProgress **progress); + nsresult (*Unregister)(IMachine *machine, PRUint32 cleanupMode, + PRUint32 *aMediaSize, IMedium ***aMedia); nsresult (*GetAccessible)(IMachine *machine, PRBool *isAccessible); nsresult (*GetState)(IMachine *machine, PRUint32 *state); nsresult (*GetName)(IMachine *machine, PRUnichar **name); @@ -218,6 +223,8 @@ typedef struct { nsresult (*GetParallelPort)(IMachine *machine, PRUint32 slot, IParallelPort **port); nsresult (*GetVRDxServer)(IMachine *machine, IVRDxServer **VRDxServer); nsresult (*GetUSBCommon)(IMachine *machine, IUSBCommon **USBCommon); + nsresult (*GetCurrentSnapshot)(IMachine *machine, ISnapshot **currentSnapshot); + nsresult (*GetSettingsFilePath)(IMachine *machine, PRUnichar **settingsFilePath); nsresult (*GetCPUCount)(IMachine *machine, PRUint32 *CPUCount); nsresult (*SetCPUCount)(IMachine *machine, PRUint32 CPUCount); nsresult (*GetMemorySize)(IMachine *machine, PRUint32 *memorySize); @@ -256,6 +263,8 @@ typedef struct { nsresult (*PowerButton)(IConsole *console); nsresult (*PowerDown)(IConsole *console); nsresult (*Reset)(IConsole *console); + nsresult (*TakeSnapshot)(IConsole *console, PRUnichar *name, + PRUnichar *description, IProgress **progress); } vboxUniformedIConsole; /* Functions for IProgress */ @@ -385,8 +394,15 @@ typedef struct { nsresult (*GetId)(IMedium *medium, vboxIIDUnion *iidu); nsresult (*GetLocation)(IMedium *medium, PRUnichar **location); nsresult (*GetReadOnly)(IMedium *medium, PRBool *readOnly); + nsresult (*GetParent)(IMedium *medium, IMedium **parent); + nsresult (*GetChildren)(IMedium *medium, PRUint32 *childrenSize, IMedium ***children); + nsresult (*GetFormat)(IMedium *medium, PRUnichar **format); + nsresult (*DeleteStorage)(IMedium *medium, IProgress **progress); nsresult (*Release)(IMedium *medium); + nsresult (*Close)(IMedium *medium); nsresult (*SetType)(IMedium *medium, PRUint32 type); + nsresult (*CreateDiffStorage)(IMedium *medium, IMedium *target, PRUint32 variantSize, + PRUint32 *variant, IProgress **progress); } vboxUniformedIMedium; /* Functions for IMediumAttachment */ @@ -471,6 +487,7 @@ typedef struct { bool accelerate2DVideo; bool vboxAttachDrivesUseOld; bool oldMediumInterface; + bool vboxSnapshotRedefine; } vboxUniformedAPI; /* libvirt API