vbox: Rewrite vboxNetworkLookupByUUID

This commit is contained in:
Taowei 2014-10-02 11:30:32 +08:00 committed by Michal Privoznik
parent 85a3cd993a
commit e4f24f892f
3 changed files with 86 additions and 44 deletions

View File

@ -61,6 +61,19 @@ VIR_LOG_INIT("vbox.vbox_network");
} \
} while (0)
#define vboxIIDUnalloc(iid) gVBoxAPI.UIID.vboxIIDUnalloc(data, iid)
#define vboxIIDToUUID(iid, uuid) gVBoxAPI.UIID.vboxIIDToUUID(data, iid, uuid)
#define vboxIIDFromUUID(iid, uuid) gVBoxAPI.UIID.vboxIIDFromUUID(data, iid, uuid)
#define vboxIIDIsEqual(iid1, iid2) gVBoxAPI.UIID.vboxIIDIsEqual(data, iid1, iid2)
#define DEBUGIID(msg, iid) gVBoxAPI.UIID.DEBUGIID(msg, iid)
#define vboxIIDFromArrayItem(iid, array, idx) \
gVBoxAPI.UIID.vboxIIDFromArrayItem(data, iid, array, idx)
#define VBOX_IID_INITIALIZE(iid) gVBoxAPI.UIID.vboxIIDInitialize(iid)
#define ARRAY_GET_MACHINES \
(gVBoxAPI.UArray.handleGetMachines(data->vboxObj))
static vboxUniformedAPI gVBoxAPI;
/**
@ -299,3 +312,55 @@ int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int n
return ret;
}
virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
{
vboxGlobalData *data = conn->privateData;
PRUint32 interfaceType = 0;
char *nameUtf8 = NULL;
PRUnichar *nameUtf16 = NULL;
IHostNetworkInterface *networkInterface = NULL;
vboxIIDUnion iid;
IHost *host = NULL;
virNetworkPtr ret = NULL;
if (!data->vboxObj)
return ret;
gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host);
if (!host)
return ret;
VBOX_IID_INITIALIZE(&iid);
vboxIIDFromUUID(&iid, uuid);
/* TODO: "internal" networks are just strings and
* thus can't do much with them
*/
gVBoxAPI.UIHost.FindHostNetworkInterfaceById(host, &iid,
&networkInterface);
if (!networkInterface)
goto cleanup;
gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType);
if (interfaceType != HostNetworkInterfaceType_HostOnly)
goto cleanup;
gVBoxAPI.UIHNInterface.GetName(networkInterface, &nameUtf16);
VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8);
ret = virGetNetwork(conn, nameUtf8, uuid);
VIR_DEBUG("Network Name: %s", nameUtf8);
DEBUGIID("Network UUID", &iid);
VBOX_UTF8_FREE(nameUtf8);
VBOX_UTF16_FREE(nameUtf16);
cleanup:
VBOX_RELEASE(networkInterface);
VBOX_RELEASE(host);
vboxIIDUnalloc(&iid);
return ret;
}

View File

@ -2060,50 +2060,6 @@ _registerDomainEvent(virDriverPtr driver)
* The Network Functions here on
*/
static virNetworkPtr
vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
{
VBOX_OBJECT_HOST_CHECK(conn, virNetworkPtr, NULL);
vboxIID iid = VBOX_IID_INITIALIZER;
vboxIIDFromUUID(&iid, uuid);
/* TODO: "internal" networks are just strings and
* thus can't do much with them
*/
IHostNetworkInterface *networkInterface = NULL;
host->vtbl->FindHostNetworkInterfaceById(host, iid.value, &networkInterface);
if (networkInterface) {
PRUint32 interfaceType = 0;
networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType);
if (interfaceType == HostNetworkInterfaceType_HostOnly) {
char *nameUtf8 = NULL;
PRUnichar *nameUtf16 = NULL;
networkInterface->vtbl->GetName(networkInterface, &nameUtf16);
VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8);
ret = virGetNetwork(conn, nameUtf8, uuid);
VIR_DEBUG("Network Name: %s", nameUtf8);
DEBUGIID("Network UUID", iid.value);
VBOX_UTF8_FREE(nameUtf8);
VBOX_UTF16_FREE(nameUtf16);
}
VBOX_RELEASE(networkInterface);
}
VBOX_RELEASE(host);
vboxIIDUnalloc(&iid);
return ret;
}
static virNetworkPtr
vboxNetworkLookupByName(virConnectPtr conn, const char *name)
{
@ -5896,6 +5852,14 @@ _displayTakeScreenShotPNGToArray(IDisplay *display ATTRIBUTE_UNUSED,
#endif /* VBOX_API_VERSION >= 4000000 */
}
static nsresult
_hostFindHostNetworkInterfaceById(IHost *host, vboxIIDUnion *iidu,
IHostNetworkInterface **networkInterface)
{
return host->vtbl->FindHostNetworkInterfaceById(host, IID_MEMBER(value),
networkInterface);
}
static nsresult
_hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType)
{
@ -6217,6 +6181,10 @@ static vboxUniformedIDisplay _UIDisplay = {
.TakeScreenShotPNGToArray = _displayTakeScreenShotPNGToArray,
};
static vboxUniformedIHost _UIHost = {
.FindHostNetworkInterfaceById = _hostFindHostNetworkInterfaceById,
};
static vboxUniformedIHNInterface _UIHNInterface = {
.GetInterfaceType = _hnInterfaceGetInterfaceType,
.GetStatus = _hnInterfaceGetStatus,
@ -6276,6 +6244,7 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI)
pVBoxAPI->UISharedFolder = _UISharedFolder;
pVBoxAPI->UISnapshot = _UISnapshot;
pVBoxAPI->UIDisplay = _UIDisplay;
pVBoxAPI->UIHost = _UIHost;
pVBoxAPI->UIHNInterface = _UIHNInterface;
pVBoxAPI->machineStateChecker = _machineStateChecker;

View File

@ -466,6 +466,12 @@ typedef struct {
PRUint8** screenData);
} vboxUniformedIDisplay;
/* Functions for IHost */
typedef struct {
nsresult (*FindHostNetworkInterfaceById)(IHost *host, vboxIIDUnion *iidu,
IHostNetworkInterface **networkInterface);
} vboxUniformedIHost;
/* Functions for IHostNetworkInterface */
typedef struct {
nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType);
@ -527,6 +533,7 @@ typedef struct {
vboxUniformedISharedFolder UISharedFolder;
vboxUniformedISnapshot UISnapshot;
vboxUniformedIDisplay UIDisplay;
vboxUniformedIHost UIHost;
vboxUniformedIHNInterface UIHNInterface;
uniformedMachineStateChecker machineStateChecker;
/* vbox API features */
@ -552,6 +559,7 @@ int vboxConnectNumOfNetworks(virConnectPtr conn);
int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames);
int vboxConnectNumOfDefinedNetworks(virConnectPtr conn);
int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames);
virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid);
/* Version specified functions for installing uniformed API */
void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);