diff options
Diffstat (limited to 'src/VBox/Main/src-client/VMMDevInterface.cpp')
-rw-r--r-- | src/VBox/Main/src-client/VMMDevInterface.cpp | 120 |
1 files changed, 70 insertions, 50 deletions
diff --git a/src/VBox/Main/src-client/VMMDevInterface.cpp b/src/VBox/Main/src-client/VMMDevInterface.cpp index 5c3809fe..b4f4da47 100644 --- a/src/VBox/Main/src-client/VMMDevInterface.cpp +++ b/src/VBox/Main/src-client/VMMDevInterface.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2012 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -178,6 +178,30 @@ DECLCALLBACK(void) vmmdevUpdateGuestStatus(PPDMIVMMDEVCONNECTOR pInterface, uint /** + * @interface_method_impl{PDMIVMMDEVCONNECTOR,pfnUpdateGuestUserState} + */ +DECLCALLBACK(void) vmmdevUpdateGuestUserState(PPDMIVMMDEVCONNECTOR pInterface, + const char *pszUser, const char *pszDomain, + uint32_t uState, + const uint8_t *puDetails, uint32_t cbDetails) +{ + PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface); + AssertPtr(pDrv); + Console *pConsole = pDrv->pVMMDev->getParent(); + AssertPtr(pConsole); + + /* Store that information in IGuest. */ + Guest* pGuest = pConsole->getGuest(); + AssertPtr(pGuest); + if (!pGuest) + return; + + pGuest->onUserStateChange(Bstr(pszUser), Bstr(pszDomain), (VBoxGuestUserState)uState, + puDetails, cbDetails); +} + + +/** * Reports Guest Additions API and OS version. * * Called whenever the Additions issue a guest version report request or the VM @@ -745,44 +769,39 @@ DECLCALLBACK(void *) VMMDev::drvQueryInterface(PPDMIBASE pInterface, const char } /** - * Destruct a VMMDev driver instance. - * - * @returns VBox status. - * @param pDrvIns The driver instance data. + * @interface_method_impl{PDMDRVREG,pfnReset} */ -DECLCALLBACK(void) VMMDev::drvDestruct(PPDMDRVINS pDrvIns) +DECLCALLBACK(void) VMMDev::drvReset(PPDMDRVINS pDrvIns) { - PDRVMAINVMMDEV pData = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV); - LogFlow(("VMMDev::drvDestruct: iInstance=%d\n", pDrvIns->iInstance)); + LogFlow(("VMMDev::drvReset: iInstance=%d\n", pDrvIns->iInstance)); #ifdef VBOX_WITH_HGCM - /* HGCM is shut down on the VMMDev destructor. */ + HGCMHostReset (); #endif /* VBOX_WITH_HGCM */ - if (pData->pVMMDev) - pData->pVMMDev->mpDrv = NULL; } /** - * Reset notification. - * - * @returns VBox status. - * @param pDrvIns The driver instance data. + * @interface_method_impl{PDMDRVREG,pfnDestruct} */ -DECLCALLBACK(void) VMMDev::drvReset(PPDMDRVINS pDrvIns) +DECLCALLBACK(void) VMMDev::drvDestruct(PPDMDRVINS pDrvIns) { - LogFlow(("VMMDev::drvReset: iInstance=%d\n", pDrvIns->iInstance)); + PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns); + PDRVMAINVMMDEV pThis = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV); + LogFlow(("VMMDev::drvDestruct: iInstance=%d\n", pDrvIns->iInstance)); + #ifdef VBOX_WITH_HGCM - HGCMHostReset (); + /* HGCM is shut down on the VMMDev destructor. */ #endif /* VBOX_WITH_HGCM */ + if (pThis->pVMMDev) + pThis->pVMMDev->mpDrv = NULL; } /** - * Construct a VMMDev driver instance. - * - * @copydoc FNPDMDRVCONSTRUCT + * @interface_method_impl{PDMDRVREG,pfnConstruct} */ DECLCALLBACK(int) VMMDev::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags) { - PDRVMAINVMMDEV pData = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV); + PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns); + PDRVMAINVMMDEV pThis = PDMINS_2_DATA(pDrvIns, PDRVMAINVMMDEV); LogFlow(("Keyboard::drvConstruct: iInstance=%d\n", pDrvIns->iInstance)); /* @@ -799,39 +818,40 @@ DECLCALLBACK(int) VMMDev::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, */ pDrvIns->IBase.pfnQueryInterface = VMMDev::drvQueryInterface; - pData->Connector.pfnUpdateGuestStatus = vmmdevUpdateGuestStatus; - pData->Connector.pfnUpdateGuestInfo = vmmdevUpdateGuestInfo; - pData->Connector.pfnUpdateGuestInfo2 = vmmdevUpdateGuestInfo2; - pData->Connector.pfnUpdateGuestCapabilities = vmmdevUpdateGuestCapabilities; - pData->Connector.pfnUpdateMouseCapabilities = vmmdevUpdateMouseCapabilities; - pData->Connector.pfnUpdatePointerShape = vmmdevUpdatePointerShape; - pData->Connector.pfnVideoAccelEnable = iface_VideoAccelEnable; - pData->Connector.pfnVideoAccelFlush = iface_VideoAccelFlush; - pData->Connector.pfnVideoModeSupported = vmmdevVideoModeSupported; - pData->Connector.pfnGetHeightReduction = vmmdevGetHeightReduction; - pData->Connector.pfnSetCredentialsJudgementResult = vmmdevSetCredentialsJudgementResult; - pData->Connector.pfnSetVisibleRegion = vmmdevSetVisibleRegion; - pData->Connector.pfnQueryVisibleRegion = vmmdevQueryVisibleRegion; - pData->Connector.pfnReportStatistics = vmmdevReportStatistics; - pData->Connector.pfnQueryStatisticsInterval = vmmdevQueryStatisticsInterval; - pData->Connector.pfnQueryBalloonSize = vmmdevQueryBalloonSize; - pData->Connector.pfnIsPageFusionEnabled = vmmdevIsPageFusionEnabled; + pThis->Connector.pfnUpdateGuestStatus = vmmdevUpdateGuestStatus; + pThis->Connector.pfnUpdateGuestUserState = vmmdevUpdateGuestUserState; + pThis->Connector.pfnUpdateGuestInfo = vmmdevUpdateGuestInfo; + pThis->Connector.pfnUpdateGuestInfo2 = vmmdevUpdateGuestInfo2; + pThis->Connector.pfnUpdateGuestCapabilities = vmmdevUpdateGuestCapabilities; + pThis->Connector.pfnUpdateMouseCapabilities = vmmdevUpdateMouseCapabilities; + pThis->Connector.pfnUpdatePointerShape = vmmdevUpdatePointerShape; + pThis->Connector.pfnVideoAccelEnable = iface_VideoAccelEnable; + pThis->Connector.pfnVideoAccelFlush = iface_VideoAccelFlush; + pThis->Connector.pfnVideoModeSupported = vmmdevVideoModeSupported; + pThis->Connector.pfnGetHeightReduction = vmmdevGetHeightReduction; + pThis->Connector.pfnSetCredentialsJudgementResult = vmmdevSetCredentialsJudgementResult; + pThis->Connector.pfnSetVisibleRegion = vmmdevSetVisibleRegion; + pThis->Connector.pfnQueryVisibleRegion = vmmdevQueryVisibleRegion; + pThis->Connector.pfnReportStatistics = vmmdevReportStatistics; + pThis->Connector.pfnQueryStatisticsInterval = vmmdevQueryStatisticsInterval; + pThis->Connector.pfnQueryBalloonSize = vmmdevQueryBalloonSize; + pThis->Connector.pfnIsPageFusionEnabled = vmmdevIsPageFusionEnabled; #ifdef VBOX_WITH_HGCM - pData->HGCMConnector.pfnConnect = iface_hgcmConnect; - pData->HGCMConnector.pfnDisconnect = iface_hgcmDisconnect; - pData->HGCMConnector.pfnCall = iface_hgcmCall; + pThis->HGCMConnector.pfnConnect = iface_hgcmConnect; + pThis->HGCMConnector.pfnDisconnect = iface_hgcmDisconnect; + pThis->HGCMConnector.pfnCall = iface_hgcmCall; #endif /* * Get the IVMMDevPort interface of the above driver/device. */ - pData->pUpPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIVMMDEVPORT); - AssertMsgReturn(pData->pUpPort, ("Configuration error: No VMMDev port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE); + pThis->pUpPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIVMMDEVPORT); + AssertMsgReturn(pThis->pUpPort, ("Configuration error: No VMMDev port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE); #ifdef VBOX_WITH_HGCM - pData->pHGCMPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIHGCMPORT); - AssertMsgReturn(pData->pHGCMPort, ("Configuration error: No HGCM port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE); + pThis->pHGCMPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIHGCMPORT); + AssertMsgReturn(pThis->pHGCMPort, ("Configuration error: No HGCM port interface above!\n"), VERR_PDM_MISSING_INTERFACE_ABOVE); #endif /* @@ -845,13 +865,13 @@ DECLCALLBACK(int) VMMDev::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, return rc; } - pData->pVMMDev = (VMMDev*)pv; /** @todo Check this cast! */ - pData->pVMMDev->mpDrv = pData; + pThis->pVMMDev = (VMMDev*)pv; /** @todo Check this cast! */ + pThis->pVMMDev->mpDrv = pThis; #ifdef VBOX_WITH_HGCM - rc = pData->pVMMDev->hgcmLoadService(VBOXSHAREDFOLDERS_DLL, + rc = pThis->pVMMDev->hgcmLoadService(VBOXSHAREDFOLDERS_DLL, "VBoxSharedFolders"); - pData->pVMMDev->fSharedFolderActive = RT_SUCCESS(rc); + pThis->pVMMDev->fSharedFolderActive = RT_SUCCESS(rc); if (RT_SUCCESS(rc)) { PPDMLED pLed; |