VirtualBox

Ignore:
Timestamp:
Jul 9, 2019 8:14:01 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
131932
Message:

Shared Clipboard/URI: Update.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp

    r79497 r79630  
    4141extern PFNHGCMSVCEXT g_pfnExtension;
    4242extern void *g_pvExtension;
     43extern PVBOXHGCMSVCHELPERS g_pHelpers;
    4344
    4445extern ClipboardClientQueue g_listClientsDeferred;
     46
     47
     48/*********************************************************************************************************************************
     49*   Prototypes                                                                                                                   *
     50*********************************************************************************************************************************/
     51int VBoxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     52                                   PVBOXCLIPBOARDLISTOPENPARMS pOpenParms);
    4553
    4654
     
    6674
    6775DECLCALLBACK(int) vboxSvcClipboardURIListOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
    68                                               PVBOXCLIPBOARDLISTHDR pListHdr, PVBOXCLIPBOARDLISTHANDLE phList)
    69 {
    70     RT_NOREF(pCtx, pListHdr, phList);
    71 
    72     LogFlowFuncEnter();
    73 
    74     int rc = VINF_SUCCESS;
    75 
    76     LogFlowFuncLeaveRC(rc);
    77     return rc;
    78 }
    79 
    80 DECLCALLBACK(int) vboxSvcClipboardURIListClose(PSHAREDCLIPBOARDPROVIDERCTX pCtx, VBOXCLIPBOARDLISTHANDLE hList)
    81 {
    82     RT_NOREF(pCtx, hList);
    83 
    84     LogFlowFuncEnter();
    85 
    86     int rc = VINF_SUCCESS;
    87 
    88     LogFlowFuncLeaveRC(rc);
    89     return rc;
    90 }
    91 
    92 DECLCALLBACK(int) vboxSvcClipboardURIListHdrRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
    93                                                  VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr)
    94 {
    95     RT_NOREF(pCtx, hList, pListHdr);
     76                                              PVBOXCLIPBOARDLISTOPENPARMS pOpenParms, PSHAREDCLIPBOARDLISTHANDLE phList)
     77{
     78    RT_NOREF(phList);
    9679
    9780    LogFlowFuncEnter();
     
    10285    int rc;
    10386
    104     PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ,
    105                                                             VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR_READ);
     87    PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN,
     88                                                            VBOX_SHARED_CLIPBOARD_CPARMS_LIST_OPEN);
    10689    if (pMsg)
    10790    {
    108         rc = vboxSvcClipboardMsgAdd(&pClient->pData->State, pMsg, true /* fAppend */);
    109         if (RT_SUCCESS(rc))
    110             rc = vboxSvcClipboardClientDeferredComplete(pClient, VINF_SUCCESS);
     91        rc = VBoxSvcClipboardURISetListOpen(pMsg->m_cParms, pMsg->m_paParms, pOpenParms);
     92        if (RT_SUCCESS(rc))
     93        {
     94            rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsg, true /* fAppend */);
     95            if (RT_SUCCESS(rc))
     96            {
     97                int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN);
     98                AssertRC(rc2);
     99
     100                vboxSvcClipboardClientWakeup(pClient);
     101            }
     102        }
    111103    }
    112104    else
     
    116108    {
    117109        PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    118         rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_READ,
     110        rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN,
    119111                                                 30 * 1000 /* Timeout in ms */, &pPayload);
    120112        if (RT_SUCCESS(rc))
    121113        {
     114            Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDREPLY));
     115
     116            PVBOXCLIPBOARDREPLY pReply = (PVBOXCLIPBOARDREPLY)pPayload->pvData;
     117            AssertPtr(pReply);
     118
     119            Assert(pReply->uType == VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN);
     120
     121            *phList = pReply->u.ListOpen.uHandle;
     122
     123            SharedClipboardURITransferPayloadFree(pPayload);
     124        }
     125    }
     126
     127    LogFlowFuncLeaveRC(rc);
     128    return rc;
     129}
     130
     131DECLCALLBACK(int) vboxSvcClipboardURIListClose(PSHAREDCLIPBOARDPROVIDERCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList)
     132{
     133    RT_NOREF(pCtx, hList);
     134
     135    LogFlowFuncEnter();
     136
     137    int rc = VINF_SUCCESS;
     138
     139    LogFlowFuncLeaveRC(rc);
     140    return rc;
     141}
     142
     143DECLCALLBACK(int) vboxSvcClipboardURIListHdrRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
     144                                                 SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr)
     145{
     146    LogFlowFuncEnter();
     147
     148    PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)pCtx->pvUser;
     149    AssertPtr(pClient);
     150
     151    int rc;
     152
     153    PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ,
     154                                                            VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR_READ_REQ);
     155    if (pMsg)
     156    {
     157        HGCMSvcSetU32(&pMsg->m_paParms[0], 0 /* uContextID */);
     158        HGCMSvcSetU64(&pMsg->m_paParms[1], hList);
     159        HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fFlags */);
     160
     161        rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsg, true /* fAppend */);
     162        if (RT_SUCCESS(rc))
     163        {
     164            int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE);
     165            AssertRC(rc2);
     166
     167            vboxSvcClipboardClientWakeup(pClient);
     168        }
     169    }
     170    else
     171        rc = VERR_NO_MEMORY;
     172
     173    if (RT_SUCCESS(rc))
     174    {
     175        PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     176        rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE,
     177                                                 30 * 1000 /* Timeout in ms */, &pPayload);
     178        if (RT_SUCCESS(rc))
     179        {
    122180            Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTHDR));
    123             //*ppListHdr = (PVBOXCLIPBOARDLISTHDR)pPayload->pvData;
    124 
    125             RTMemFree(pPayload);
     181
     182            *pListHdr = *(PVBOXCLIPBOARDLISTHDR)pPayload->pvData;
     183
     184            SharedClipboardURITransferPayloadFree(pPayload);
    126185        }
    127186    }
     
    132191
    133192DECLCALLBACK(int) vboxSvcClipboardURIListHdrWrite(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
    134                                                   VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr)
     193                                                  SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr)
    135194{
    136195    RT_NOREF(pCtx, hList, pListHdr);
     
    142201
    143202DECLCALLBACK(int) vboxSvcClipboardURIListEntryRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
    144                                                    VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry)
    145 {
    146     RT_NOREF(pCtx, hList, pListEntry);
    147 
    148     LogFlowFuncEnter();
    149 
    150     PVBOXCLIPBOARDCLIENTDATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pCtx->pvUser;
    151     AssertPtr(pClientData);
    152 
    153     PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    154     int rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_READ,
     203                                                   SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry)
     204{
     205    LogFlowFuncEnter();
     206
     207    PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)pCtx->pvUser;
     208    AssertPtr(pClient);
     209
     210    int rc;
     211
     212    PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ,
     213                                                            VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ_REQ);
     214    if (pMsg)
     215    {
     216        HGCMSvcSetU32(&pMsg->m_paParms[0], 0 /* uContextID */);
     217        HGCMSvcSetU64(&pMsg->m_paParms[1], hList);
     218        HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fInfo */);
     219
     220        rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsg, true /* fAppend */);
     221        if (RT_SUCCESS(rc))
     222        {
     223            int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE);
     224            if (rc2 == VERR_ALREADY_EXISTS)
     225                rc2 = VINF_SUCCESS;
     226            AssertRC(rc2);
     227
     228            vboxSvcClipboardClientWakeup(pClient);
     229        }
     230    }
     231    else
     232        rc = VERR_NO_MEMORY;
     233
     234    if (RT_SUCCESS(rc))
     235    {
     236        PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     237        rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE,
    155238                                                 30 * 1000 /* Timeout in ms */, &pPayload);
    156     if (RT_SUCCESS(rc))
    157     {
    158         Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTENTRY));
    159 
    160         PVBOXCLIPBOARDLISTENTRY pListEntry = (PVBOXCLIPBOARDLISTENTRY)pPayload->pvData;
    161         AssertPtr(pListEntry);
    162 
    163    /*     const uint32_t cbToRead = RT_MIN(cbChunk, pListEntry->cbData);
    164 
    165         memcpy(pvChunk, pListEntry->pvData, cbToRead);*/
    166 
    167         SharedClipboardURITransferPayloadFree(pPayload);
    168 
    169 /*        if (pcbRead)
    170             *pcbRead = cbToRead;*/
     239        if (RT_SUCCESS(rc))
     240        {
     241            Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTENTRY));
     242
     243            rc = SharedClipboardURIListEntryCopy(pListEntry, (PVBOXCLIPBOARDLISTENTRY)pPayload->pvData);
     244
     245            SharedClipboardURITransferPayloadFree(pPayload);
     246        }
    171247    }
    172248
     
    176252
    177253DECLCALLBACK(int) vboxSvcClipboardURIListEntryWrite(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
    178                                                     VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry)
     254                                                    SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry)
    179255{
    180256    RT_NOREF(pCtx, hList, pListEntry);
     
    237313DECLCALLBACK(void) VBoxSvcClipboardURITransferPrepareCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData)
    238314{
    239     LogFlowFuncEnter();
    240 
    241     AssertPtrReturnVoid(pData);
    242 
    243     PVBOXCLIPBOARDCLIENTDATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pData->pvUser;
    244     AssertPtrReturnVoid(pClientData);
    245 
    246     PSHAREDCLIPBOARDURITRANSFER pTransfer = pData->pTransfer;
    247     AssertPtrReturnVoid(pTransfer);
    248 
    249     /* Register needed events. */
    250     int rc2 = SharedClipboardURITransferEventRegister(pData->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_READ);
    251     AssertRC(rc2);
    252     rc2 = SharedClipboardURITransferEventRegister(pData->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_READ);
    253     AssertRC(rc2);
    254 
    255 #if 0
    256     /* Tell the guest that it can start sending URI data. */
    257     rc2 = vboxSvcClipboardReportMsg(pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START,
    258                                     0 /* u32Formats == 0 means reading data */);
    259     AssertRC(rc2);
    260 #endif
     315    RT_NOREF(pData);
     316
     317    LogFlowFuncEnter();
    261318}
    262319
    263320DECLCALLBACK(void) VBoxSvcClipboardURITransferCompleteCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData, int rc)
    264321{
    265     LogFlowFuncEnter();
    266 
    267322    RT_NOREF(pData, rc);
    268323
     324    LogFlowFuncEnter();
     325
    269326    LogRel2(("Shared Clipboard: Transfer complete\n"));
    270327}
     
    286343
    287344    LogRel(("Shared Clipboard: Transfer failed with %Rrc\n", rc));
     345}
     346
     347/**
     348 * Gets an URI message reply from HGCM service parameters.
     349 *
     350 * @returns VBox status code.
     351 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
     352 * @param   paParms             Array of HGCM parameters.
     353 * @param   pReply              Where to store the reply.
     354 */
     355int VBoxSvcClipboardURIGetReply(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     356                                PVBOXCLIPBOARDREPLY pReply)
     357{
     358    int rc;
     359
     360    if (cParms >= VBOX_SHARED_CLIPBOARD_CPARMS_REPLY_MIN)
     361    {
     362        uint32_t cbPayload = 0;
     363
     364        /* Note: Context ID (paParms[0]) not used yet. */
     365        rc = HGCMSvcGetU32(&paParms[1], &pReply->uType);
     366        if (RT_SUCCESS(rc))
     367            rc = HGCMSvcGetU32(&paParms[2], &pReply->rc);
     368        if (RT_SUCCESS(rc))
     369            rc = HGCMSvcGetU32(&paParms[3], &cbPayload);
     370        if (RT_SUCCESS(rc))
     371        {
     372            rc = HGCMSvcGetPv(&paParms[4], &pReply->pvPayload, &pReply->cbPayload);
     373            AssertReturn(cbPayload == pReply->cbPayload, VERR_INVALID_PARAMETER);
     374        }
     375
     376        if (RT_SUCCESS(rc))
     377        {
     378            switch (pReply->uType)
     379            {
     380                case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN:
     381                {
     382                    if (cParms >= 6)
     383                    {
     384                        rc = HGCMSvcGetU64(&paParms[5], &pReply->u.ListOpen.uHandle);
     385                    }
     386                    else
     387                        rc = VERR_INVALID_PARAMETER;
     388                    break;
     389                }
     390
     391                case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_OBJ_OPEN:
     392                {
     393                    if (cParms >= 6)
     394                    {
     395                        rc = HGCMSvcGetU64(&paParms[5], &pReply->u.ObjOpen.uHandle);
     396                    }
     397                    else
     398                        rc = VERR_INVALID_PARAMETER;
     399                    break;
     400                }
     401
     402                default:
     403                    break;
     404            }
     405        }
     406    }
     407    else
     408        rc = VERR_INVALID_PARAMETER;
     409
     410    LogFlowFuncLeaveRC(rc);
     411    return rc;
     412}
     413
     414/**
     415 * Gets an URI list open request from HGCM service parameters.
     416 *
     417 * @returns VBox status code.
     418 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
     419 * @param   paParms             Array of HGCM parameters.
     420 * @param   pOpenParms          Where to store the open parameters of the request.
     421 */
     422int VBoxSvcClipboardURIGetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     423                                   PVBOXCLIPBOARDLISTOPENPARMS pOpenParms)
     424{
     425    int rc;
     426
     427    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_OPEN)
     428    {
     429        uint32_t cbPath   = 0;
     430        uint32_t cbFilter = 0;
     431
     432        /* Note: Context ID (paParms[0]) not used yet. */
     433        rc = HGCMSvcGetU32(&paParms[1], &pOpenParms->fList);
     434        if (RT_SUCCESS(rc))
     435            rc = HGCMSvcGetU32(&paParms[2], &cbPath);
     436        if (RT_SUCCESS(rc))
     437        {
     438            rc = HGCMSvcGetStr(&paParms[3], &pOpenParms->pszPath, &pOpenParms->cbPath);
     439            AssertReturn(cbPath == pOpenParms->cbPath, VERR_INVALID_PARAMETER);
     440        }
     441        if (RT_SUCCESS(rc))
     442            rc = HGCMSvcGetU32(&paParms[4], &cbFilter);
     443        if (RT_SUCCESS(rc))
     444        {
     445            rc = HGCMSvcGetStr(&paParms[5], &pOpenParms->pszFilter, &pOpenParms->cbFilter);
     446            AssertReturn(cbFilter == pOpenParms->cbFilter, VERR_INVALID_PARAMETER);
     447        }
     448
     449        if (RT_SUCCESS(rc))
     450        {
     451            /** @todo Some more validation. */
     452        }
     453    }
     454    else
     455        rc = VERR_INVALID_PARAMETER;
     456
     457    LogFlowFuncLeaveRC(rc);
     458    return rc;
     459}
     460
     461int VBoxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     462                                   PVBOXCLIPBOARDLISTOPENPARMS pOpenParms)
     463{
     464    int rc;
     465
     466    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_OPEN)
     467    {
     468        HGCMSvcSetU32(&paParms[0], 0 /* uContextID */);
     469        HGCMSvcSetU32(&paParms[1], pOpenParms->fList);
     470        HGCMSvcSetU32(&paParms[2], pOpenParms->cbFilter);
     471        HGCMSvcSetPv (&paParms[3], pOpenParms->pszFilter, pOpenParms->cbFilter);
     472        HGCMSvcSetU32(&paParms[4], pOpenParms->cbPath);
     473        HGCMSvcSetPv (&paParms[5], pOpenParms->pszPath, pOpenParms->cbPath);
     474        HGCMSvcSetU64(&paParms[6], 0); /* OUT: uHandle */
     475
     476        rc = VINF_SUCCESS;
     477    }
     478    else
     479        rc = VERR_INVALID_PARAMETER;
     480
     481    LogFlowFuncLeaveRC(rc);
     482    return rc;
    288483}
    289484
     
    298493 */
    299494int VBoxSvcClipboardURIGetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    300                                   PVBOXCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr)
     495                                  PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr)
    301496{
    302497    int rc;
    303498
    304     if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR_WRITE)
     499    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR)
    305500    {
    306501        /* Note: Context ID (paParms[0]) not used yet. */
    307502        rc = HGCMSvcGetU64(&paParms[1], phList);
    308         if (RT_SUCCESS(rc))
    309             rc = HGCMSvcGetU64(&paParms[2], &pListHdr->cTotalObjects);
    310         if (RT_SUCCESS(rc))
    311             rc = HGCMSvcGetU64(&paParms[3], &pListHdr->cbTotalSize);
    312         if (RT_SUCCESS(rc))
    313             rc = HGCMSvcGetU32(&paParms[4], &pListHdr->enmCompression);
    314         if (RT_SUCCESS(rc))
    315             rc = HGCMSvcGetU32(&paParms[5], (uint32_t *)&pListHdr->enmChecksumType);
     503        /* Note: Flags (paParms[2]) not used here. */
     504        if (RT_SUCCESS(rc))
     505            rc = HGCMSvcGetU32(&paParms[3], &pListHdr->fFeatures);
     506        if (RT_SUCCESS(rc))
     507            rc = HGCMSvcGetU64(&paParms[4], &pListHdr->cTotalObjects);
     508        if (RT_SUCCESS(rc))
     509            rc = HGCMSvcGetU64(&paParms[5], &pListHdr->cbTotalSize);
     510        if (RT_SUCCESS(rc))
     511            rc = HGCMSvcGetU32(&paParms[6], &pListHdr->enmCompression);
     512        if (RT_SUCCESS(rc))
     513            rc = HGCMSvcGetU32(&paParms[7], (uint32_t *)&pListHdr->enmChecksumType);
    316514
    317515        if (RT_SUCCESS(rc))
     
    340538    int rc;
    341539
    342     if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR_READ)
     540    if (   cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR
     541        || cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR)
    343542    {
    344543        /** @todo Set pvMetaFmt + cbMetaFmt. */
    345544        /** @todo Calculate header checksum. */
    346545
    347         /* Note: Context ID (paParms[0]) not used yet. */
    348         HGCMSvcSetU32(&paParms[1], pListHdr->fList);
    349         HGCMSvcSetU32(&paParms[2], pListHdr->fFeatures);
    350         HGCMSvcSetU32(&paParms[3], pListHdr->cbFilter);
    351         HGCMSvcSetPv (&paParms[4], pListHdr->pszFilter, pListHdr->cbFilter);
    352         HGCMSvcSetU64(&paParms[5], pListHdr->cTotalObjects);
    353         HGCMSvcSetU64(&paParms[6], pListHdr->cbTotalSize);
    354         HGCMSvcSetU32(&paParms[7], pListHdr->enmCompression);
    355         HGCMSvcSetU32(&paParms[8], (uint32_t)pListHdr->enmChecksumType);
     546        HGCMSvcSetU32(&paParms[0], 0 /* uContextID */);
     547        HGCMSvcSetU32(&paParms[1], pListHdr->fFeatures);
     548        HGCMSvcSetU32(&paParms[2], 0 /* Features, will be returned on success */);
     549        HGCMSvcSetU64(&paParms[3], pListHdr->cTotalObjects);
     550        HGCMSvcSetU64(&paParms[4], pListHdr->cbTotalSize);
     551        HGCMSvcSetU32(&paParms[5], pListHdr->enmCompression);
     552        HGCMSvcSetU32(&paParms[6], pListHdr->enmChecksumType);
    356553
    357554        rc = VINF_SUCCESS;
     
    374571 */
    375572int VBoxSvcClipboardURIGetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    376                                     PVBOXCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTENTRY pListEntry)
     573                                    PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTENTRY pListEntry)
    377574{
    378575    int rc;
    379576
    380     if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_WRITE)
     577    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY)
    381578    {
    382579        /* Note: Context ID (paParms[0]) not used yet. */
     
    414611    int rc;
    415612
    416     if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ)
     613    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY)
    417614    {
    418615        /** @todo Calculate chunk checksum. */
    419616
    420         /* Note: Context ID (paParms[0]) not used yet. */
     617        HGCMSvcSetU32(&paParms[0], 0 /* uContextID */);
    421618        HGCMSvcSetU32(&paParms[1], pListEntry->fInfo);
    422619        HGCMSvcSetU32(&paParms[2], pListEntry->cbInfo);
     
    432629}
    433630
     631/**
     632 * Gets an URI error from HGCM service parameters.
     633 *
     634 * @returns VBox status code.
     635 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
     636 * @param   paParms             Array of HGCM parameters.
     637 * @param   pRc                 Where to store the received error code.
     638 */
    434639int VBoxSvcClipboardURIGetError(uint32_t cParms, VBOXHGCMSVCPARM paParms[], int *pRc)
    435640{
     
    446651    else
    447652        rc = VERR_INVALID_PARAMETER;
     653
     654    LogFlowFuncLeaveRC(rc);
     655    return rc;
     656}
     657
     658int VBoxSvcClipboardURITransferHandleReply(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer,
     659                                           uint32_t cParms, VBOXHGCMSVCPARM paParms[])
     660{
     661    RT_NOREF(pClient);
     662
     663    int rc;
     664
     665    uint32_t            cbReply = sizeof(VBOXCLIPBOARDREPLY);
     666    PVBOXCLIPBOARDREPLY pReply  = (PVBOXCLIPBOARDREPLY)RTMemAlloc(cbReply);
     667    if (pReply)
     668    {
     669        rc = VBoxSvcClipboardURIGetReply(cParms, paParms, pReply);
     670        if (RT_SUCCESS(rc))
     671        {
     672            PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload
     673                = (PSHAREDCLIPBOARDURITRANSFERPAYLOAD)RTMemAlloc(sizeof(SHAREDCLIPBOARDURITRANSFERPAYLOAD));
     674            if (pPayload)
     675            {
     676                pPayload->pvData = pReply;
     677                pPayload->cbData = cbReply;
     678
     679                switch (pReply->uType)
     680                {
     681                    case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN:
     682                    {
     683                        rc = SharedClipboardURITransferEventSignal(pTransfer,
     684                                                                   SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN, pPayload);
     685                        break;
     686                    }
     687
     688                    default:
     689                        rc = VERR_NOT_FOUND;
     690                        break;
     691                }
     692
     693                if (RT_FAILURE(rc))
     694                {
     695                    if (pPayload)
     696                        RTMemFree(pPayload);
     697                }
     698            }
     699            else
     700                rc = VERR_NO_MEMORY;
     701        }
     702    }
     703    else
     704        rc = VERR_NO_MEMORY;
     705
     706    if (RT_FAILURE(rc))
     707    {
     708        if (pReply)
     709            RTMemFree(pReply);
     710    }
    448711
    449712    LogFlowFuncLeaveRC(rc);
     
    471734    RT_NOREF(paParms, tsArrival);
    472735
    473     LogFlowFunc(("uClient=%RU32, u32Function=%RU32, cParms=%RU32, g_pfnExtension=%p\n",
    474                  pClient->uClientID, u32Function, cParms, g_pfnExtension));
     736    LogFlowFunc(("uClient=%RU32, u32Function=%RU32 (%s), cParms=%RU32, g_pfnExtension=%p\n",
     737                 pClient->uClientID, u32Function, VBoxSvcClipboardGuestMsgToStr(u32Function), cParms, g_pfnExtension));
    475738
    476739    const PVBOXCLIPBOARDCLIENTDATA pClientData = pClient->pData;
     
    503766    switch (u32Function)
    504767    {
    505         case VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG:
     768        case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT:
    506769            RT_FALL_THROUGH();
    507         case VBOX_SHARED_CLIPBOARD_GUEST_FN_TRANSFER_REPORT:
     770        case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT:
     771            RT_FALL_THROUGH();
     772        case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET:
     773            RT_FALL_THROUGH();
     774        case VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS:
    508775            break;
    509776        default:
     
    535802    switch (u32Function)
    536803    {
    537         case VBOX_SHARED_CLIPBOARD_GUEST_FN_TRANSFER_REPORT:
    538         {
    539             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_TRANSFER_REPORT\n"));
    540 
    541             if (!SharedClipboardURICtxTransfersMaximumReached(&pClientData->URI))
     804        case VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS:
     805        {
     806            LogFlowFunc(("[Client %RU32] VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS\n", pClient->uClientID));
     807
     808            if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_STATUS)
     809                break;
     810
     811            SHAREDCLIPBOARDURITRANSFERSTATUS uStatus = SHAREDCLIPBOARDURITRANSFERSTATUS_NONE;
     812            rc = HGCMSvcGetU32(&paParms[1], &uStatus);
     813            if (RT_FAILURE(rc))
     814                break;
     815
     816            LogFlowFunc(("uStatus: %RU32\n", uStatus));
     817
     818            if (   uStatus == SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING
     819                && !SharedClipboardURICtxTransfersMaximumReached(&pClientData->URI))
    542820            {
    543821                SharedClipboardURICtxTransfersCleanup(&pClientData->URI);
     
    592870                        SharedClipboardURITransferSetCallbacks(pTransfer, &Callbacks);
    593871
    594                         rc = SharedClipboardURITransferProviderCreate(pTransfer, &creationCtx);
     872                        rc = SharedClipboardURITransferSetInterface(pTransfer, &creationCtx);
    595873                        if (RT_SUCCESS(rc))
    596874                            rc = SharedClipboardURICtxTransferAdd(&pClientData->URI, pTransfer);
     
    614892                rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED;
    615893
    616             LogFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_TRANSFER_REPORT: %Rrc\n", rc));
     894            LogFlowFunc(("[Client %RU32] VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS: %Rrc\n", pClient->uClientID, rc));
    617895
    618896            if (RT_FAILURE(rc))
     
    622900        }
    623901
    624         case VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG:
    625         {
    626             if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_GET_HOST_MSG)
    627             {
    628                 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG\n"));
    629                 rc = vboxSvcClipboardMsgGetNextInfo(&pClientData->State,
    630                                                     &paParms[0].u.uint32 /* uMsg */, &paParms[1].u.uint32 /* cParms */);
    631 
    632                 /* No (new) messages available or some error occurred? */
    633                 if (   rc == VERR_NO_DATA
    634                     || RT_FAILURE(rc))
     902        case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT:
     903        {
     904            rc = vboxSvcClipboardMsgPeek(pClient, callHandle, cParms, paParms, false /*fWait*/);
     905            break;
     906        }
     907
     908        case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT:
     909        {
     910            rc = vboxSvcClipboardMsgPeek(pClient, callHandle, cParms, paParms, true /*fWait*/);
     911            break;
     912        }
     913
     914        case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET:
     915        {
     916            rc = vboxSvcClipboardMsgGet(pClient, callHandle, cParms, paParms);
     917            break;
     918        }
     919
     920        case VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY:
     921        {
     922            rc = VBoxSvcClipboardURITransferHandleReply(pClient, pTransfer, cParms, paParms);
     923            break;
     924        }
     925
     926        case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN:
     927        {
     928            VBOXCLIPBOARDLISTOPENPARMS listOpenParms;
     929            rc = VBoxSvcClipboardURIGetListOpen(cParms, paParms, &listOpenParms);
     930            if (RT_SUCCESS(rc))
     931            {
     932                SHAREDCLIPBOARDLISTHANDLE hList;
     933                rc = SharedClipboardURITransferListOpen(pTransfer, &listOpenParms, &hList);
     934                if (RT_SUCCESS(rc))
    635935                {
    636                     uint32_t fFlags = 0;
    637                     int rc2 = HGCMSvcGetU32(&paParms[2], &fFlags);
    638                     if (   RT_SUCCESS(rc2)
    639                         && fFlags) /* Blocking flag set? */
    640                     {
    641                         /* Defer client returning. */
    642                         rc = VINF_HGCM_ASYNC_EXECUTE;
    643                     }
    644                     else
    645                         rc = VERR_INVALID_PARAMETER;
    646 
    647                     LogFlowFunc(("Message queue is empty, returning %Rrc to guest\n", rc));
     936                    /* Return list handle. */
     937                    HGCMSvcSetU32(&paParms[1], hList);
    648938                }
    649939            }
     
    651941        }
    652942
    653         case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN:
    654         {
    655             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN\n"));
    656             rc = VINF_SUCCESS;
    657             break;
    658         }
    659 
    660943        case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE:
    661944        {
    662             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE\n"));
    663             rc = VINF_SUCCESS;
     945            if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_LIST_CLOSE)
     946                break;
     947
     948            SHAREDCLIPBOARDLISTHANDLE hList;
     949            /* Note: Context ID (paParms[0]) not used yet. */
     950            rc = HGCMSvcGetU64(&paParms[1], &hList);
     951            if (RT_SUCCESS(rc))
     952            {
     953                rc = SharedClipboardURITransferListClose(pTransfer, hList);
     954            }
    664955            break;
    665956        }
     
    667958        case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ:
    668959        {
    669             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_LIST_HDR\n"));
    670 
    671             VBOXCLIPBOARDLISTHANDLE hList;
    672             VBOXCLIPBOARDLISTHDR    hdrList;
    673             rc = VBoxSvcClipboardURIGetListHdr(cParms, paParms, &hList, &hdrList);
     960            if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR)
     961                break;
     962
     963            SHAREDCLIPBOARDLISTHANDLE hList;
     964            /* Note: Context ID (paParms[0]) not used yet. */
     965            rc = HGCMSvcGetU64(&paParms[1], &hList); /* Get list handle. */
    674966            if (RT_SUCCESS(rc))
    675967            {
     968                VBOXCLIPBOARDLISTHDR hdrList;
     969                rc = SharedClipboardURITransferListGetHeader(pTransfer, hList, &hdrList);
    676970                if (RT_SUCCESS(rc))
    677971                    rc = VBoxSvcClipboardURISetListHdr(cParms, paParms, &hdrList);
     
    682976        case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE:
    683977        {
    684             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_LIST_HDR\n"));
    685 
    686978            VBOXCLIPBOARDLISTHDR hdrList;
    687979            rc = SharedClipboardURIListHdrInit(&hdrList);
    688980            if (RT_SUCCESS(rc))
    689981            {
    690                 VBOXCLIPBOARDLISTHANDLE hList;
     982                SHAREDCLIPBOARDLISTHANDLE hList;
    691983                rc = VBoxSvcClipboardURIGetListHdr(cParms, paParms, &hList, &hdrList);
    692984                if (RT_SUCCESS(rc))
     
    696988
    697989                    PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    698                     rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_READ,
     990                    rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE,
    699991                                                                pvData, cbData, &pPayload);
    700992                    if (RT_SUCCESS(rc))
    701993                    {
    702                         rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_READ,
     994                        rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE,
    703995                                                                   pPayload);
    704996                    }
     
    7101002        case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ:
    7111003        {
    712             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_LIST_ENTRY\n"));
     1004            if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY)
     1005                break;
     1006
     1007            SHAREDCLIPBOARDLISTHANDLE hList;
     1008            /* Note: Context ID (paParms[0]) not used yet. */
     1009            rc = HGCMSvcGetU64(&paParms[1], &hList); /* Get list handle. */
     1010            if (RT_SUCCESS(rc))
     1011            {
     1012                VBOXCLIPBOARDLISTENTRY entryList;
     1013                rc = SharedClipboardURITransferListRead(pTransfer, hList, &entryList);
     1014            }
    7131015            break;
    7141016        }
     
    7161018        case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE:
    7171019        {
    718             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_LIST_ENTRY\n"));
    719 
    7201020            VBOXCLIPBOARDLISTENTRY entryList;
    7211021            rc = SharedClipboardURIListEntryInit(&entryList);
    7221022            if (RT_SUCCESS(rc))
    7231023            {
    724                 VBOXCLIPBOARDLISTHANDLE hList;
     1024                SHAREDCLIPBOARDLISTHANDLE hList;
    7251025                rc = VBoxSvcClipboardURIGetListEntry(cParms, paParms, &hList, &entryList);
    7261026                if (RT_SUCCESS(rc))
     
    7301030
    7311031                    PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    732                     rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_READ,
     1032                    rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE,
    7331033                                                                pvData, cbData, &pPayload);
    7341034                    if (RT_SUCCESS(rc))
    7351035                    {
    736                         rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_READ,
     1036                        rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE,
    7371037                                                                   pPayload);
    7381038                    }
     
    7421042            break;
    7431043        }
    744 #if 0
     1044
     1045    #if 0
    7451046        case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DIR:
    7461047        {
     
    9131214#endif
    9141215        case VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL:
    915             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_CANCEL\n"));
    916 
     1216        {
    9171217            LogRel2(("Shared Clipboard: Transfer canceled\n"));
    9181218            break;
     1219        }
    9191220
    9201221        case VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR:
    9211222        {
    922             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_ERROR\n"));
    923 
    9241223            int rcGuest;
    9251224            rc = VBoxSvcClipboardURIGetError(cParms,paParms, &rcGuest);
     
    9301229
    9311230        default:
    932             AssertMsgFailed(("Not implemented\n"));
    933             break;
    934     }
    935 
    936     if (rc == VINF_HGCM_ASYNC_EXECUTE)
    937     {
    938         try
    939         {
    940             vboxSvcClipboardClientDefer(pClient, callHandle, u32Function, cParms, paParms);
    941             g_listClientsDeferred.push_back(pClient->uClientID);
    942         }
    943         catch (std::bad_alloc &)
    944         {
    945             rc = VERR_NO_MEMORY;
    946             /* Don't report to guest. */
    947         }
    948     }
    949     else if (pClient)
    950     {
    951         int rc2 = vboxSvcClipboardClientComplete(pClient, callHandle, rc);
    952         AssertRC(rc2);
    953     }
    954 
    955     LogFlowFunc(("Returning uClient=%RU32, rc=%Rrc\n", pClient->uClientID, rc));
     1231            LogFunc(("Not implemented\n"));
     1232            break;
     1233    }
     1234
     1235    if (rc != VINF_HGCM_ASYNC_EXECUTE)
     1236    {
     1237        /* Tell the client that the call is complete (unblocks waiting). */
     1238        LogFlowFunc(("[Client %RU32] Calling pfnCallComplete w/ rc=%Rrc\n", pClient->uClientID, rc));
     1239        AssertPtr(g_pHelpers);
     1240        g_pHelpers->pfnCallComplete(callHandle, rc);
     1241    }
     1242
     1243    LogFlowFunc(("[Client %RU32] Returning rc=%Rrc\n", pClient->uClientID, rc));
    9561244    return rc;
    9571245}
Note: See TracChangeset for help on using the changeset viewer.

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