VirtualBox

Changeset 47211 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Jul 17, 2013 12:33:23 PM (11 years ago)
Author:
vboxsync
Message:

VBoxTray/IPC: Update, now supports retrieving last user input from current session (untested).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxIPC.cpp

    r47195 r47211  
    3131#include <iprt/mem.h>
    3232#include <VBoxGuestInternal.h>
    33 
    34 
    3533
    3634
     
    7371} VBOXIPCSESSION, *PVBOXIPCSESSION;
    7472
    75 int vboxIPCSessionDestroyLocked(PVBOXIPCCONTEXT pCtx, PVBOXIPCSESSION pSession);
     73int vboxIPCSessionDestroyLocked(PVBOXIPCSESSION pSession);
     74
     75static int vboxIPCHandleVBoxTrayRestart(RTLOCALIPCSESSION hSession, PVBOXTRAYIPCHEADER pHdr)
     76{
     77    AssertPtrReturn(pHdr, VERR_INVALID_POINTER);
     78
     79    /** @todo Not implemented yet; don't return an error here. */
     80    return VINF_SUCCESS;
     81}
     82
     83static int vboxIPCHandleShowBalloonMsg(RTLOCALIPCSESSION hSession, PVBOXTRAYIPCHEADER pHdr)
     84{
     85    AssertPtrReturn(pHdr, VERR_INVALID_POINTER);
     86    AssertReturn(pHdr->uMsgLen > 0, VERR_INVALID_PARAMETER);
     87
     88    VBOXTRAYIPCMSG_SHOWBALLOONMSG ipcMsg;
     89    int rc = RTLocalIpcSessionRead(hSession, &ipcMsg, pHdr->uMsgLen,
     90                                   NULL /* Exact read, blocking */);
     91    if (RT_SUCCESS(rc))
     92    {
     93        /* Showing the balloon tooltip is not critical. */
     94        int rc2 = hlpShowBalloonTip(ghInstance, ghwndToolWindow, ID_TRAYICON,
     95                                    ipcMsg.szMsgContent, ipcMsg.szMsgTitle,
     96                                    ipcMsg.uShowMS, ipcMsg.uType);
     97        LogFlowFunc(("Showing \"%s\" - \"%s\" (type %RU32, %RU32ms), rc=%Rrc\n",
     98                     ipcMsg.szMsgTitle, ipcMsg.szMsgContent,
     99                     ipcMsg.uType, ipcMsg.uShowMS, rc2));
     100    }
     101
     102    return rc;
     103}
     104
     105static int vboxIPCHandleUserLastInput(RTLOCALIPCSESSION hSession, PVBOXTRAYIPCHEADER pHdr)
     106{
     107    AssertPtrReturn(pHdr, VERR_INVALID_POINTER);
     108    /* No actual message from client. */
     109
     110    int rc = VINF_SUCCESS;
     111
     112    LASTINPUTINFO lastInput;
     113    lastInput.cbSize = sizeof(LASTINPUTINFO);
     114    BOOL fRc = GetLastInputInfo(&lastInput);
     115    if (fRc)
     116    {
     117        VBOXTRAYIPCRES_USERLASTINPUT ipcRes;
     118        ipcRes.uTickCount = lastInput.dwTime; /** @sa GetTickCount(). */
     119        rc = RTLocalIpcSessionWrite(hSession, &ipcRes, sizeof(ipcRes));
     120    }
     121    else
     122        rc = RTErrConvertFromWin32(GetLastError());
     123
     124    return rc;
     125}
    76126
    77127/**
     
    99149    if (RT_SUCCESS(rc))
    100150    {
    101         rc = RTLocalIpcServerCreate(&gCtx.hServer, "VBoxTrayIPCSvc", RTLOCALIPC_FLAGS_MULTI_SESSION);
     151        rc = RTLocalIpcServerCreate(&gCtx.hServer, VBOXTRAY_IPC_PIPENAME,
     152                                    RTLOCALIPC_FLAGS_MULTI_SESSION);
    102153        if (RT_FAILURE(rc))
    103154        {
     
    116167void VBoxIPCStop(const VBOXSERVICEENV *pEnv, void *pInstance)
    117168{
    118     AssertPtr(pEnv);
    119     AssertPtr(pInstance);
     169    AssertPtrReturnVoid(pEnv);
     170    AssertPtrReturnVoid(pInstance);
    120171
    121172    LogFunc(("Stopping pInstance=%p\n", pInstance));
     
    148199        RTListForEach(&pCtx->SessionList, pSession, VBOXIPCSESSION, Node)
    149200        {
    150             int rc2 = vboxIPCSessionDestroyLocked(pCtx, pSession);
     201            int rc2 = vboxIPCSessionDestroyLocked(pSession);
    151202            if (RT_FAILURE(rc2))
    152203            {
     
    186237    LogFunc(("pThis=%p\n", pThis));
    187238
     239    int rc = VINF_SUCCESS;
     240
    188241    /*
    189242     * Process client requests until it quits or we're cancelled on termination.
    190243     */
    191     while (!ASMAtomicUoReadBool(&pThis->fTerminate))
    192     {
    193         int rc = RTLocalIpcSessionWaitForData(hSession, 1000 /* Timeout in ms. */);
     244    while (   !ASMAtomicUoReadBool(&pThis->fTerminate)
     245           && RT_SUCCESS(rc))
     246    {
     247        /* The next call will be cancelled via VBoxIPCStop if needed. */
     248        rc = RTLocalIpcSessionWaitForData(hSession, RT_INDEFINITE_WAIT);
    194249        if (RT_FAILURE(rc))
    195250        {
    196251            if (rc == VERR_CANCELLED)
    197252            {
    198                 LogFunc(("Waiting for data cancelled\n"));
     253                LogFunc(("Session %p: Waiting for data cancelled\n", pThis));
    199254                rc = VINF_SUCCESS;
    200255                break;
    201256            }
    202             else if (rc != VERR_TIMEOUT)
    203             {
    204                 LogFunc(("Waiting for data failed, rc=%Rrc\n", rc));
    205                 break;
    206             }
    207         }
    208 
    209         /** @todo Implement handler. */
    210     }
     257            else
     258                LogRelFunc(("Session %p: Waiting for session data failed with rc=%Rrc\n",
     259                            pThis, rc));
     260        }
     261        else
     262        {
     263            VBOXTRAYIPCHEADER ipcHdr;
     264            rc = RTLocalIpcSessionRead(hSession, &ipcHdr, sizeof(ipcHdr),
     265                                       NULL /* Exact read, blocking */);
     266            if (RT_SUCCESS(rc))
     267            {
     268                switch (ipcHdr.uMsgType)
     269                {
     270                    case VBOXTRAYIPCMSGTYPE_RESTART:
     271                        rc = vboxIPCHandleVBoxTrayRestart(hSession, &ipcHdr);
     272                        break;
     273
     274                    case VBOXTRAYIPCMSGTYPE_SHOWBALLOONMSG:
     275                        rc = vboxIPCHandleShowBalloonMsg(hSession, &ipcHdr);
     276                        break;
     277
     278                    case VBOXTRAYIPCMSGTYPE_USERLASTINPUT:
     279                        rc = vboxIPCHandleUserLastInput(hSession, &ipcHdr);
     280                        break;
     281
     282                    default:
     283                    {
     284                        static int s_cRejectedCmds = 0;
     285                        if (++s_cRejectedCmds <= 3)
     286                        {
     287                            LogRelFunc(("Session %p: Received unknown command %RU32 (%RU32 bytes), rejecting (%RU32/3)\n",
     288                                        pThis, ipcHdr.uMsgType, ipcHdr.uMsgLen, s_cRejectedCmds + 1));
     289                            if (ipcHdr.uMsgLen)
     290                            {
     291                                /* Get and discard payload data. */
     292                                size_t cbRead;
     293                                uint8_t devNull[_1K];
     294                                while (ipcHdr.uMsgLen)
     295                                {
     296                                    rc = RTLocalIpcSessionRead(hSession, &devNull, sizeof(devNull), &cbRead);
     297                                    if (RT_FAILURE(rc))
     298                                        break;
     299                                    AssertRelease(cbRead <= ipcHdr.uMsgLen);
     300                                    ipcHdr.uMsgLen -= (uint32_t)cbRead;
     301                                }
     302                            }
     303                        }
     304                        else
     305                            rc = VERR_INVALID_PARAMETER; /* Enough fun, bail out. */
     306                        break;
     307                    }
     308
     309                    if (RT_FAILURE(rc))
     310                        LogFunc(("Session %p: Handling command %RU32 failed with rc=%Rrc\n",
     311                                 pThis, ipcHdr.uMsgType, rc));
     312                }
     313            }
     314        }
     315    }
     316
     317    LogRelFunc(("Session %p: Handler ended with rc=%Rrc\n", rc));
    211318
    212319    /*
     
    214321     */
    215322    PVBOXIPCCONTEXT pCtx = ASMAtomicReadPtrT(&pThis->pCtx, PVBOXIPCCONTEXT);
    216     if (pCtx)
    217         RTCritSectEnter(&pCtx->CritSect);
    218     else
    219         AssertMsgFailed(("Session %p: No context found\n", pThis));
    220 
    221     ASMAtomicXchgHandle(&pThis->hSession, NIL_RTLOCALIPCSESSION, &hSession);
    222     if (hSession != NIL_RTLOCALIPCSESSION)
    223         RTLocalIpcSessionClose(hSession);
    224     else
    225         AssertMsgFailed(("Session %p: No/invalid session handle\n", pThis));
    226 
    227     if (pCtx)
    228     {
    229         //RTSemEventSignal(pCtx->hSessionEvent);
    230         RTCritSectLeave(&pCtx->CritSect);
    231     }
    232 
    233     LogFunc(("pThis=%p terminated\n", pThis));
    234     return VINF_SUCCESS;
     323    AssertMsg(pCtx, ("Session %p: No context found\n", pThis));
     324    rc = RTCritSectEnter(&pCtx->CritSect);
     325    if (RT_SUCCESS(rc))
     326    {
     327        rc = vboxIPCSessionDestroyLocked(pThis);
     328
     329        int rc2 = RTCritSectLeave(&pCtx->CritSect);
     330        if (RT_SUCCESS(rc))
     331            rc = rc2;
     332    }
     333
     334    LogFunc(("Session %p: Terminated\n", pThis));
     335    return rc;
    235336}
    236337
     
    280381}
    281382
    282 static int vboxIPCSessionDestroyLocked(PVBOXIPCCONTEXT pCtx, PVBOXIPCSESSION pSession)
    283 {
    284     AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
     383static int vboxIPCSessionDestroyLocked(PVBOXIPCSESSION pSession)
     384{
    285385    AssertPtrReturn(pSession, VERR_INVALID_POINTER);
    286 
    287386    pSession->hThread = NIL_RTTHREAD;
    288387
    289388    RTLOCALIPCSESSION hSession;
    290389    ASMAtomicXchgHandle(&pSession->hSession, NIL_RTLOCALIPCSESSION, &hSession);
    291     if (hSession != NIL_RTLOCALIPCSESSION)
    292         RTLocalIpcSessionClose(hSession);
     390    int rc = RTLocalIpcSessionClose(hSession);
    293391
    294392    RTListNodeRemove(&pSession->Node);
     
    297395    pSession = NULL;
    298396
    299     return VINF_SUCCESS;
     397    return rc;
    300398}
    301399
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette