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
typedef nsISupports ISharedFolder;
typedef nsISupports ISnapshot;
typedef nsISupports IDisplay;
+typedef nsISupports IHost;
+typedef nsISupports IHostNetworkInterface;
#endif /* VBOX_COMMON_H */
VIR_LOG_INIT("vbox.vbox_network");
+#define VBOX_RELEASE(arg) \
+ do { \
+ if (arg) { \
+ gVBoxAPI.nsUISupports.Release((void *)arg); \
+ (arg) = NULL; \
+ } \
+ } while (0)
+
+static vboxUniformedAPI gVBoxAPI;
+
/**
* The Network Functions here on
*/
conn->networkPrivateData = NULL;
return 0;
}
+
+int vboxConnectNumOfNetworks(virConnectPtr conn)
+{
+ vboxGlobalData *data = conn->privateData;
+ vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER;
+ IHost *host = NULL;
+ size_t i = 0;
+ int ret = -1;
+
+ if (!data->vboxObj)
+ return ret;
+
+ gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host);
+ if (!host)
+ return ret;
+
+ gVBoxAPI.UArray.vboxArrayGet(&networkInterfaces, host,
+ gVBoxAPI.UArray.handleHostGetNetworkInterfaces(host));
+
+ ret = 0;
+ 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;
+}
* 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;
return medium->vtbl->GetSnapshotIds;
}
+static void* _handleHostGetNetworkInterfaces(IHost *host)
+{
+ return host->vtbl->GetNetworkInterfaces;
+}
+
static nsresult _nsisupportsRelease(nsISupports *nsi)
{
return nsi->vtbl->Release(nsi);
return vboxObj->vtbl->GetSystemProperties(vboxObj, systemProperties);
}
+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)
{
#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) &&
.handleSnapshotGetChildren = _handleSnapshotGetChildren,
.handleMediumGetChildren = _handleMediumGetChildren,
.handleMediumGetSnapshotIds = _handleMediumGetSnapshotIds,
+ .handleHostGetNetworkInterfaces = _handleHostGetNetworkInterfaces,
};
static vboxUniformednsISupports _nsUISupports = {
.GetMachine = _virtualboxGetMachine,
.OpenMachine = _virtualboxOpenMachine,
.GetSystemProperties = _virtualboxGetSystemProperties,
+ .GetHost = _virtualboxGetHost,
.CreateMachine = _virtualboxCreateMachine,
.CreateHardDiskMedium = _virtualboxCreateHardDiskMedium,
.RegisterMachine = _virtualboxRegisterMachine,
.TakeScreenShotPNGToArray = _displayTakeScreenShotPNGToArray,
};
+static vboxUniformedIHNInterface _UIHNInterface = {
+ .GetInterfaceType = _hnInterfaceGetInterfaceType,
+ .GetStatus = _hnInterfaceGetStatus,
+};
+
static uniformedMachineStateChecker _machineStateChecker = {
.Online = _machineStateOnline,
.Inactive = _machineStateInactive,
pVBoxAPI->UISharedFolder = _UISharedFolder;
pVBoxAPI->UISnapshot = _UISnapshot;
pVBoxAPI->UIDisplay = _UIDisplay;
+ pVBoxAPI->UIHNInterface = _UIHNInterface;
pVBoxAPI->machineStateChecker = _machineStateChecker;
#if VBOX_API_VERSION <= 2002000 || VBOX_API_VERSION >= 4000000
void* (*handleSnapshotGetChildren)(ISnapshot *snapshot);
void* (*handleMediumGetChildren)(IMedium *medium);
void* (*handleMediumGetSnapshotIds)(IMedium *medium);
+ void* (*handleHostGetNetworkInterfaces)(IHost *host);
} vboxUniformedArray;
/* Functions for nsISupports */
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);
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);
vboxUniformedISharedFolder UISharedFolder;
vboxUniformedISnapshot UISnapshot;
vboxUniformedIDisplay UIDisplay;
+ vboxUniformedIHNInterface UIHNInterface;
uniformedMachineStateChecker machineStateChecker;
/* vbox API features */
bool domainEventCallbacks;
virConnectAuthPtr auth,
unsigned int flags);
int vboxNetworkClose(virConnectPtr conn);
+int vboxConnectNumOfNetworks(virConnectPtr conn);
/* Version specified functions for installing uniformed API */
void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);