[libvirt] [PATCH 06/19] vbox: Rewrite vboxStoragePoolListVolumes

Taowei Luo uaedante at gmail.com
Fri Oct 24 01:46:40 UTC 2014


---
 src/vbox/vbox_storage.c       |   56 +++++++++++++++++++++++++++++++++++++++++
 src/vbox/vbox_tmpl.c          |   54 +++++----------------------------------
 src/vbox/vbox_uniformed_api.h |    2 ++
 3 files changed, 64 insertions(+), 48 deletions(-)

diff --git a/src/vbox/vbox_storage.c b/src/vbox/vbox_storage.c
index 804f723..ffa91a9 100644
--- a/src/vbox/vbox_storage.c
+++ b/src/vbox/vbox_storage.c
@@ -147,3 +147,59 @@ int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool)
 
     return ret;
 }
+
+int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames)
+{
+    vboxGlobalData *data = pool->conn->privateData;
+    vboxArray hardDisks = VBOX_ARRAY_INITIALIZER;
+    PRUint32 numActive = 0;
+    nsresult rc;
+    size_t i;
+    int ret = -1;
+
+    if (!data->vboxObj) {
+        return ret;
+    }
+
+    rc = gVBoxAPI.UArray.vboxArrayGet(&hardDisks, data->vboxObj,
+                                      gVBoxAPI.UArray.handleGetHardDisks(data->vboxObj));
+    if (NS_FAILED(rc)) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("could not get the volume list in the pool: %s, rc=%08x"),
+                       pool->name, (unsigned)rc);
+        return ret;
+    }
+
+    for (i = 0; i < hardDisks.count && numActive < nnames; ++i) {
+        IHardDisk *hardDisk = hardDisks.items[i];
+        PRUint32 hddstate;
+        char *nameUtf8 = NULL;
+        PRUnichar *nameUtf16 = NULL;
+
+        if (!hardDisk)
+            continue;
+
+        gVBoxAPI.UIMedium.GetState(hardDisk, &hddstate);
+        if (hddstate == MediaState_Inaccessible)
+            continue;
+
+        gVBoxAPI.UIMedium.GetName(hardDisk, &nameUtf16);
+
+        VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8);
+        VBOX_UTF16_FREE(nameUtf16);
+
+        if (!nameUtf8)
+            continue;
+
+        VIR_DEBUG("nnames[%d]: %s", numActive, nameUtf8);
+        if (VIR_STRDUP(names[numActive], nameUtf8) > 0)
+            numActive++;
+
+        VBOX_UTF8_FREE(nameUtf8);
+    }
+
+    gVBoxAPI.UArray.vboxArrayRelease(&hardDisks);
+    ret = numActive;
+
+    return ret;
+}
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index c78cd44..ac712d8 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -2033,54 +2033,6 @@ _registerDomainEvent(virHypervisorDriverPtr driver)
  * The Storage Functions here on
  */
 
-static int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames) {
-    VBOX_OBJECT_CHECK(pool->conn, int, -1);
-    vboxArray hardDisks = VBOX_ARRAY_INITIALIZER;
-    PRUint32 numActive     = 0;
-    nsresult rc;
-    size_t i;
-
-    rc = vboxArrayGet(&hardDisks, data->vboxObj, data->vboxObj->vtbl->GetHardDisks);
-    if (NS_SUCCEEDED(rc)) {
-        for (i = 0; i < hardDisks.count && numActive < nnames; ++i) {
-            IHardDisk *hardDisk = hardDisks.items[i];
-
-            if (hardDisk) {
-                PRUint32 hddstate;
-                char      *nameUtf8  = NULL;
-                PRUnichar *nameUtf16 = NULL;
-
-                VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetState, &hddstate);
-                if (hddstate != MediaState_Inaccessible) {
-                    VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetName, &nameUtf16);
-
-                    VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8);
-                    VBOX_UTF16_FREE(nameUtf16);
-
-                    if (nameUtf8) {
-                        VIR_DEBUG("nnames[%d]: %s", numActive, nameUtf8);
-                        if (VIR_STRDUP(names[numActive], nameUtf8) > 0)
-                            numActive++;
-
-                        VBOX_UTF8_FREE(nameUtf8);
-                    }
-                }
-            }
-        }
-
-        vboxArrayRelease(&hardDisks);
-
-        ret = numActive;
-    } else {
-        ret = -1;
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("could not get the volume list in the pool: %s, rc=%08x"),
-                       pool->name, (unsigned)rc);
-    }
-
-    return ret;
-}
-
 static virStorageVolPtr
 vboxStorageVolLookupByName(virStoragePoolPtr pool, const char *name)
 {
@@ -4904,6 +4856,11 @@ static nsresult _mediumGetState(IMedium *medium, PRUint32 *state)
     return medium->vtbl->GetState(medium, state);
 }
 
+static nsresult _mediumGetName(IMedium *medium, PRUnichar **name)
+{
+    return medium->vtbl->GetName(medium, name);
+}
+
 static nsresult _mediumGetReadOnly(IMedium *medium ATTRIBUTE_UNUSED,
                                    PRBool *readOnly ATTRIBUTE_UNUSED)
 {
@@ -5626,6 +5583,7 @@ static vboxUniformedIMedium _UIMedium = {
     .GetId = _mediumGetId,
     .GetLocation = _mediumGetLocation,
     .GetState = _mediumGetState,
+    .GetName = _mediumGetName,
     .GetReadOnly = _mediumGetReadOnly,
     .GetParent = _mediumGetParent,
     .GetChildren = _mediumGetChildren,
diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h
index 4c17051..4a6ec33 100644
--- a/src/vbox/vbox_uniformed_api.h
+++ b/src/vbox/vbox_uniformed_api.h
@@ -409,6 +409,7 @@ typedef struct {
     nsresult (*GetId)(IMedium *medium, vboxIIDUnion *iidu);
     nsresult (*GetLocation)(IMedium *medium, PRUnichar **location);
     nsresult (*GetState)(IMedium *medium, PRUint32 *state);
+    nsresult (*GetName)(IMedium *medium, PRUnichar **name);
     nsresult (*GetReadOnly)(IMedium *medium, PRBool *readOnly);
     nsresult (*GetParent)(IMedium *medium, IMedium **parent);
     nsresult (*GetChildren)(IMedium *medium, PRUint32 *childrenSize, IMedium ***children);
@@ -595,6 +596,7 @@ int vboxConnectNumOfStoragePools(virConnectPtr conn);
 int vboxConnectListStoragePools(virConnectPtr conn, char **const names, int nnames);
 virStoragePoolPtr vboxStoragePoolLookupByName(virConnectPtr conn, const char *name);
 int vboxStoragePoolNumOfVolumes(virStoragePoolPtr pool);
+int vboxStoragePoolListVolumes(virStoragePoolPtr pool, char **const names, int nnames);
 
 /* Version specified functions for installing uniformed API */
 void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);
-- 
1.7.9.5




More information about the libvir-list mailing list