As advertised in previous commit that added the SDK header file,
there were some changes to the API:
1) IVirtualBox::OpenMachine() and IVirtualBox::CreateMachine()
now have @password argument to deal with password protected
settings files. Well, we don't have that wired now (and we
don't create such files). If we ever want to support user
settings files that are password protected (e.g. via
virSecret) we can wire this argument. For now, just pass NULL.
2) IMachine::GetAudioAdapter() is gone. But it can be replaced
with IMachine::GetAudioSettings() + IMachine::GetAdapter()
combo.
Resolves:
https://gitlab.com/libvirt/libvirt/-/issues/419
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/vbox/meson.build | 1 +
src/vbox/vbox_V7_0.c | 13 +++++++++++++
src/vbox/vbox_common.h | 2 ++
src/vbox/vbox_storage.c | 2 ++
src/vbox/vbox_tmpl.c | 30 ++++++++++++++++++++++++++++++
src/vbox/vbox_uniformed_api.h | 1 +
6 files changed, 49 insertions(+)
create mode 100644 src/vbox/vbox_V7_0.c
diff --git a/src/vbox/meson.build b/src/vbox/meson.build
index fddf3edf30..1b0dad3336 100644
--- a/src/vbox/meson.build
+++ b/src/vbox/meson.build
@@ -1,5 +1,6 @@
vbox_driver_sources = [
'vbox_V6_1.c',
+ 'vbox_V7_0.c',
'vbox_common.c',
'vbox_driver.c',
'vbox_network.c',
diff --git a/src/vbox/vbox_V7_0.c b/src/vbox/vbox_V7_0.c
new file mode 100644
index 0000000000..32c01111b7
--- /dev/null
+++ b/src/vbox/vbox_V7_0.c
@@ -0,0 +1,13 @@
+/** @file vbox_V7_0.c
+ * C file to include support for multiple versions of VirtualBox
+ * at runtime.
+ */
+
+#include <config.h>
+
+/** The API Version */
+#define VBOX_API_VERSION 7000000
+/** Version specific prefix. */
+#define NAME(name) vbox70##name
+
+#include "vbox_tmpl.c"
diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h
index e56e9c0fc2..ec2f9637dc 100644
--- a/src/vbox/vbox_common.h
+++ b/src/vbox/vbox_common.h
@@ -442,6 +442,8 @@ typedef nsISupports IKeyboard;
result = 0; \
if (uVersion >= 6000051 && uVersion < 6001051) { \
vbox61InstallUniformedAPI(&gVBoxAPI); \
+ } else if (uVersion >= 7000000 && uVersion < 7001000) { \
+ vbox70InstallUniformedAPI(&gVBoxAPI); \
} else { \
result = -1; \
} \
diff --git a/src/vbox/vbox_storage.c b/src/vbox/vbox_storage.c
index 73d8962553..27d8a474f2 100644
--- a/src/vbox/vbox_storage.c
+++ b/src/vbox/vbox_storage.c
@@ -883,6 +883,8 @@ virStorageDriver *vboxGetStorageDriver(uint32_t uVersion)
*/
if (uVersion >= 6000051 && uVersion < 6001051) {
vbox61InstallUniformedAPI(&gVBoxAPI);
+ } else if (uVersion >= 7000000 && uVersion < 7000004) {
+ vbox70InstallUniformedAPI(&gVBoxAPI);
} else {
return NULL;
}
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 3aaa6b4c81..d850fe3fe1 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -46,6 +46,8 @@
/* This one changes from version to version. */
#if VBOX_API_VERSION == 6001000
# include "vbox_CAPI_v6_1.h"
+#elif VBOX_API_VERSION == 7000000
+# include "vbox_CAPI_v7_0.h"
#else
# error "Unsupported VBOX_API_VERSION"
#endif
@@ -584,7 +586,11 @@ _virtualboxGetMachine(IVirtualBox *vboxObj, vboxIID *iid, IMachine
**machine)
static nsresult
_virtualboxOpenMachine(IVirtualBox *vboxObj, PRUnichar *settingsFile, IMachine
**machine)
{
+#if VBOX_API_VERSION >= 7000000
+ return vboxObj->vtbl->OpenMachine(vboxObj, settingsFile, NULL, machine);
+#else
return vboxObj->vtbl->OpenMachine(vboxObj, settingsFile, machine);
+#endif
}
static nsresult
@@ -612,6 +618,19 @@ _virtualboxCreateMachine(struct _vboxDriver *data, virDomainDef *def,
IMachine *
vboxIIDFromUUID(&iid, def->uuid);
createFlags = g_strdup_printf("UUID=%s,forceOverwrite=0", uuidstr);
VBOX_UTF8_TO_UTF16(createFlags, &createFlagsUtf16);
+#if VBOX_API_VERSION >= 7000000
+ rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj,
+ NULL,
+ machineNameUtf16,
+ 0,
+ nsnull,
+ nsnull,
+ createFlagsUtf16,
+ NULL,
+ NULL,
+ NULL,
+ machine);
+#else
rc = data->vboxObj->vtbl->CreateMachine(data->vboxObj,
NULL,
machineNameUtf16,
@@ -620,6 +639,7 @@ _virtualboxCreateMachine(struct _vboxDriver *data, virDomainDef *def,
IMachine *
nsnull,
createFlagsUtf16,
machine);
+#endif
VIR_FREE(createFlags);
VBOX_UTF16_FREE(machineNameUtf16);
vboxIIDUnalloc(&iid);
@@ -801,7 +821,17 @@ _machineGetBIOSSettings(IMachine *machine, IBIOSSettings **bios)
static nsresult
_machineGetAudioAdapter(IMachine *machine, IAudioAdapter **audioadapter)
{
+#if VBOX_API_VERSION >= 7000000
+ IAudioSettings *audioSettings = NULL;
+ nsresult rc;
+
+ rc = machine->vtbl->GetAudioSettings(machine, &audioSettings);
+ if (NS_FAILED(rc))
+ return rc;
+ return audioSettings->vtbl->GetAdapter(audioSettings, audioadapter);
+#else
return machine->vtbl->GetAudioAdapter(machine, audioadapter);
+#endif
}
static nsresult
diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h
index 316f0d8b11..c1a2af1d42 100644
--- a/src/vbox/vbox_uniformed_api.h
+++ b/src/vbox/vbox_uniformed_api.h
@@ -551,3 +551,4 @@ virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn,
/* Version specified functions for installing uniformed API */
void vbox61InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);
+void vbox70InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);
--
2.39.1