[libvirt] [PATCH 03/13] vbox: Rewrite vboxConnectNumOfNetworks

Taowei uaedante at gmail.com
Wed Aug 20 00:17:11 UTC 2014


---
 src/vbox/vbox_common.c        |   46 +++++++++++++++++++++++++++++
 src/vbox/vbox_common.h        |   15 ++++++++++
 src/vbox/vbox_tmpl.c          |   65 ++++++++++++++++++++---------------------
 src/vbox/vbox_uniformed_api.h |   10 +++++++
 4 files changed, 102 insertions(+), 34 deletions(-)

diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 4f11b7d..7aeb3b9 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -104,6 +104,17 @@ type ret = value;\
 if (!data->vboxObj) {\
     return ret;\
 }
+#define VBOX_OBJECT_HOST_CHECK(conn, type, value) \
+vboxGlobalData *data = conn->privateData;\
+type ret = value;\
+IHost *host = NULL;\
+if (!data->vboxObj) {\
+    return ret;\
+}\
+gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host);\
+if (!host) {\
+    return ret;\
+}
 
 #define vboxIIDUnalloc(iid)                     gVBoxAPI.UIID.vboxIIDUnalloc(data, iid)
 #define vboxIIDToUUID(iid, uuid)                gVBoxAPI.UIID.vboxIIDToUUID(data, iid, uuid)
@@ -7487,6 +7498,41 @@ int vboxNetworkClose(virConnectPtr conn)
     return 0;
 }
 
+int vboxConnectNumOfNetworks(virConnectPtr conn)
+{
+    VBOX_OBJECT_HOST_CHECK(conn, int, 0);
+    vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER;
+    size_t i = 0;
+
+    gVBoxAPI.UArray.vboxArrayGet(&networkInterfaces, host,
+                                 gVBoxAPI.UArray.handleHostGetNetworkInterfaces(host));
+
+    for (i = 0; i < networkInterfaces.count; i++) {
+        IHostNetworkInterface *networkInterface = networkInterfaces.items[i];
+        PRUint32 status = HostNetworkInterfaceStatus_Unknown;
+        PRUint32 interfaceType = 0;
+
+        if (!networkInterface)
+            continue;
+
+        gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType);
+        if (interfaceType != HostNetworkInterfaceType_HostOnly)
+            continue;
+
+        gVBoxAPI.UIHNInterface.GetStatus(networkInterface, &status);
+
+        if (status == HostNetworkInterfaceStatus_Up)
+            ret++;
+    }
+
+    gVBoxAPI.UArray.vboxArrayRelease(&networkInterfaces);
+
+    VBOX_RELEASE(host);
+
+    VIR_DEBUG("numActive: %d", ret);
+    return ret;
+}
+
 /**
  * Function Tables
  */
diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h
index b5a0353..9f5385b 100644
--- a/src/vbox/vbox_common.h
+++ b/src/vbox/vbox_common.h
@@ -265,6 +265,19 @@ enum MediumVariant
     MediumVariant_Diff = 0x20000
 };
 
+enum HostNetworkInterfaceStatus
+{
+    HostNetworkInterfaceStatus_Unknown = 0,
+    HostNetworkInterfaceStatus_Up = 1,
+    HostNetworkInterfaceStatus_Down = 2
+};
+
+enum HostNetworkInterfaceType
+{
+    HostNetworkInterfaceType_Bridged = 1,
+    HostNetworkInterfaceType_HostOnly = 2
+};
+
 # define VBOX_E_OBJECT_NOT_FOUND 0x80BB0001
 # define VBOX_E_INVALID_VM_STATE 0x80BB0002
 # define VBOX_E_VM_ERROR 0x80BB0003
@@ -302,5 +315,7 @@ typedef nsISupports IStorageController;
 typedef nsISupports ISharedFolder;
 typedef nsISupports ISnapshot;
 typedef nsISupports IDisplay;
+typedef nsISupports IHost;
+typedef nsISupports IHostNetworkInterface;
 
 #endif /* VBOX_COMMON_H */
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 7b4be00..f24be07 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -2060,40 +2060,6 @@ _registerDomainEvent(virDriverPtr driver)
  * The Network Functions here on
  */
 
-static int vboxConnectNumOfNetworks(virConnectPtr conn)
-{
-    VBOX_OBJECT_HOST_CHECK(conn, int, 0);
-    vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER;
-    size_t i = 0;
-
-    vboxArrayGet(&networkInterfaces, host, host->vtbl->GetNetworkInterfaces);
-
-    for (i = 0; i < networkInterfaces.count; i++) {
-        IHostNetworkInterface *networkInterface = networkInterfaces.items[i];
-
-        if (networkInterface) {
-            PRUint32 interfaceType = 0;
-
-            networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType);
-            if (interfaceType == HostNetworkInterfaceType_HostOnly) {
-                PRUint32 status = HostNetworkInterfaceStatus_Unknown;
-
-                networkInterface->vtbl->GetStatus(networkInterface, &status);
-
-                if (status == HostNetworkInterfaceStatus_Up)
-                    ret++;
-            }
-        }
-    }
-
-    vboxArrayRelease(&networkInterfaces);
-
-    VBOX_RELEASE(host);
-
-    VIR_DEBUG("numActive: %d", ret);
-    return ret;
-}
-
 static int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) {
     VBOX_OBJECT_HOST_CHECK(conn, int, 0);
     vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER;
@@ -4500,6 +4466,11 @@ static void* _handleMediumGetSnapshotIds(IMedium *medium)
     return medium->vtbl->GetSnapshotIds;
 }
 
+static void* _handleHostGetNetworkInterfaces(IHost *host)
+{
+    return host->vtbl->GetNetworkInterfaces;
+}
+
 static nsresult _nsisupportsRelease(nsISupports *nsi)
 {
     return nsi->vtbl->Release(nsi);
@@ -4547,6 +4518,12 @@ _virtualboxGetSystemProperties(IVirtualBox *vboxObj, ISystemProperties **systemP
 }
 
 static nsresult
+_virtualboxGetHost(IVirtualBox *vboxObj, IHost **host)
+{
+    return vboxObj->vtbl->GetHost(vboxObj, host);
+}
+
+static nsresult
 _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **machine, char *uuidstr ATTRIBUTE_UNUSED)
 {
     vboxIID iid = VBOX_IID_INITIALIZER;
@@ -6042,6 +6019,18 @@ _displayTakeScreenShotPNGToArray(IDisplay *display ATTRIBUTE_UNUSED,
 #endif /* VBOX_API_VERSION >= 4000000 */
 }
 
+static nsresult
+_hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType)
+{
+    return hni->vtbl->GetInterfaceType(hni, interfaceType);
+}
+
+static nsresult
+_hnInterfaceGetStatus(IHostNetworkInterface *hni, PRUint32 *status)
+{
+    return hni->vtbl->GetStatus(hni, status);
+}
+
 static bool _machineStateOnline(PRUint32 state)
 {
     return ((state >= MachineState_FirstOnline) &&
@@ -6108,6 +6097,7 @@ static vboxUniformedArray _UArray = {
     .handleSnapshotGetChildren = _handleSnapshotGetChildren,
     .handleMediumGetChildren = _handleMediumGetChildren,
     .handleMediumGetSnapshotIds = _handleMediumGetSnapshotIds,
+    .handleHostGetNetworkInterfaces = _handleHostGetNetworkInterfaces,
 };
 
 static vboxUniformednsISupports _nsUISupports = {
@@ -6120,6 +6110,7 @@ static vboxUniformedIVirtualBox _UIVirtualBox = {
     .GetMachine = _virtualboxGetMachine,
     .OpenMachine = _virtualboxOpenMachine,
     .GetSystemProperties = _virtualboxGetSystemProperties,
+    .GetHost = _virtualboxGetHost,
     .CreateMachine = _virtualboxCreateMachine,
     .CreateHardDiskMedium = _virtualboxCreateHardDiskMedium,
     .RegisterMachine = _virtualboxRegisterMachine,
@@ -6343,6 +6334,11 @@ static vboxUniformedIDisplay _UIDisplay = {
     .TakeScreenShotPNGToArray = _displayTakeScreenShotPNGToArray,
 };
 
+static vboxUniformedIHNInterface _UIHNInterface = {
+    .GetInterfaceType = _hnInterfaceGetInterfaceType,
+    .GetStatus = _hnInterfaceGetStatus,
+};
+
 static uniformedMachineStateChecker _machineStateChecker = {
     .Online = _machineStateOnline,
     .Inactive = _machineStateInactive,
@@ -6396,6 +6392,7 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
     pVBoxAPI->UISharedFolder = _UISharedFolder;
     pVBoxAPI->UISnapshot = _UISnapshot;
     pVBoxAPI->UIDisplay = _UIDisplay;
+    pVBoxAPI->UIHNInterface = _UIHNInterface;
     pVBoxAPI->machineStateChecker = _machineStateChecker;
 
 #if VBOX_API_VERSION <= 2002000 || VBOX_API_VERSION >= 4000000
diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h
index 8552efb..9644f61 100644
--- a/src/vbox/vbox_uniformed_api.h
+++ b/src/vbox/vbox_uniformed_api.h
@@ -176,6 +176,7 @@ typedef struct {
     void* (*handleSnapshotGetChildren)(ISnapshot *snapshot);
     void* (*handleMediumGetChildren)(IMedium *medium);
     void* (*handleMediumGetSnapshotIds)(IMedium *medium);
+    void* (*handleHostGetNetworkInterfaces)(IHost *host);
 } vboxUniformedArray;
 
 /* Functions for nsISupports */
@@ -190,6 +191,7 @@ typedef struct {
     nsresult (*GetMachine)(IVirtualBox *vboxObj, vboxIIDUnion *iidu, IMachine **machine);
     nsresult (*OpenMachine)(IVirtualBox *vboxObj, PRUnichar *settingsFile, IMachine **machine);
     nsresult (*GetSystemProperties)(IVirtualBox *vboxObj, ISystemProperties **systemProperties);
+    nsresult (*GetHost)(IVirtualBox *vboxObj, IHost **host);
     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);
@@ -464,6 +466,12 @@ typedef struct {
                                          PRUint8** screenData);
 } vboxUniformedIDisplay;
 
+/* Functions for IHostNetworkInterface */
+typedef struct {
+    nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType);
+    nsresult (*GetStatus)(IHostNetworkInterface *hni, PRUint32 *status);
+} vboxUniformedIHNInterface;
+
 typedef struct {
     bool (*Online)(PRUint32 state);
     bool (*Inactive)(PRUint32 state);
@@ -518,6 +526,7 @@ typedef struct {
     vboxUniformedISharedFolder UISharedFolder;
     vboxUniformedISnapshot UISnapshot;
     vboxUniformedIDisplay UIDisplay;
+    vboxUniformedIHNInterface UIHNInterface;
     uniformedMachineStateChecker machineStateChecker;
     /* vbox API features */
     bool domainEventCallbacks;
@@ -538,6 +547,7 @@ virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn,
                                  virConnectAuthPtr auth,
                                  unsigned int flags);
 int vboxNetworkClose(virConnectPtr conn);
+int vboxConnectNumOfNetworks(virConnectPtr conn);
 
 /* Version specified functions for installing uniformed API */
 void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);
-- 
1.7.9.5




More information about the libvir-list mailing list