]> xenbits.xensource.com Git - libvirt.git/commitdiff
vbox: Make FindMedium support old vbox versions
authorTaowei Luo <uaedante@gmail.com>
Fri, 24 Oct 2014 01:46:43 +0000 (09:46 +0800)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 29 Oct 2014 00:21:40 +0000 (01:21 +0100)
In old version, function FindMedium in UIVirtualBox doesn't work
for vbox2.2 and 3.0. We assume it will not be used when vbox in
these versions.

But when rewriting vboxStorageVolLookupByPath, we found it was
compatibe to use FindMedium to get a IHardDisk object, even in
vbox old versions. To achieve this, first make FindMedium call
FindHardDisk when VBOX_API_VERSION < 4000000.
Then change the argument type **IMedium to **IHardDisk. (As the
rules in heriachy, we can't transfer a IHardDisk to match
IMedium in output)

In vbox 2.2 and 3.0, the caller must be aware that they will get
a IHardDisk object in return.

src/vbox/vbox_common.c
src/vbox/vbox_tmpl.c
src/vbox/vbox_uniformed_api.h

index 22f3198a9681ad80ba6113c6a80f15908a52c929..e0836ec0c46ffd6df54f3f2caed612b48558daa2 100644 (file)
@@ -1081,8 +1081,8 @@ vboxAttachDrivesNew(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine
                 continue;
             }
 
-            gVBoxAPI.UIVirtualBox.FindMedium(data->vboxObj, mediumFileUtf16,
-                                             deviceType, accessMode, &medium);
+            gVBoxAPI.UIVirtualBox.FindHardDisk(data->vboxObj, mediumFileUtf16,
+                                               deviceType, accessMode, &medium);
 
             if (!medium) {
                 PRUnichar *mediumEmpty = NULL;
index e8cfa98b6bc6801569f071ef0db09f550b23bc4b..6c4cd734af19cc72cf17ab1151367c4628ed4c94 100644 (file)
@@ -3553,22 +3553,23 @@ _virtualboxRegisterMachine(IVirtualBox *vboxObj, IMachine *machine)
 }
 
 static nsresult
-_virtualboxFindMedium(IVirtualBox *vboxObj ATTRIBUTE_UNUSED,
-                      PRUnichar *location ATTRIBUTE_UNUSED,
-                      PRUint32 deviceType ATTRIBUTE_UNUSED,
-                      PRUint32 accessMode ATTRIBUTE_UNUSED,
-                      IMedium **medium ATTRIBUTE_UNUSED)
+_virtualboxFindHardDisk(IVirtualBox *vboxObj, PRUnichar *location,
+                        PRUint32 deviceType ATTRIBUTE_UNUSED,
+                        PRUint32 accessMode ATTRIBUTE_UNUSED,
+                        IHardDisk **hardDisk)
 {
-#if VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 4002000
+    /* 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 < 4000000
+    return vboxObj->vtbl->FindHardDisk(vboxObj, location, hardDisk);
+#elif VBOX_API_VERSION < 4002000
     return vboxObj->vtbl->FindMedium(vboxObj, location,
-                                     deviceType, medium);
-#elif VBOX_API_VERSION >= 4002000
+                                     deviceType, hardDisk);
+#else /* VBOX_API_VERSION >= 4002000 */
     return vboxObj->vtbl->OpenMedium(vboxObj, location,
-                                     deviceType, accessMode, PR_FALSE, medium);
-#else
-    vboxUnsupported();
-    return 0;
-#endif
+                                     deviceType, accessMode, PR_FALSE, hardDisk);
+#endif /* VBOX_API_VERSION >= 4002000 */
 }
 
 static nsresult
@@ -5287,7 +5288,7 @@ static vboxUniformedIVirtualBox _UIVirtualBox = {
     .CreateMachine = _virtualboxCreateMachine,
     .CreateHardDiskMedium = _virtualboxCreateHardDiskMedium,
     .RegisterMachine = _virtualboxRegisterMachine,
-    .FindMedium = _virtualboxFindMedium,
+    .FindHardDisk = _virtualboxFindHardDisk,
     .OpenMedium = _virtualboxOpenMedium,
     .GetHardDiskByIID = _virtualboxGetHardDiskByIID,
     .FindDHCPServerByNetworkName = _virtualboxFindDHCPServerByNetworkName,
index cdc2ebef47f74d62655681bb7bbba6d1a805f306..385502f491d108b543ebcd9cace7da993e9fcee5 100644 (file)
@@ -196,7 +196,8 @@ typedef struct {
     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 (*FindHardDisk)(IVirtualBox *vboxObj, PRUnichar *location, PRUint32 deviceType,
+                             PRUint32 accessMode, IHardDisk **hardDisk);
     nsresult (*OpenMedium)(IVirtualBox *vboxObj, PRUnichar *location, PRUint32 deviceType, PRUint32 accessMode, IMedium **medium);
     nsresult (*GetHardDiskByIID)(IVirtualBox *vboxObj, vboxIIDUnion *iidu, IHardDisk **hardDisk);
     nsresult (*FindDHCPServerByNetworkName)(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer **server);