VirtualBox

Ignore:
Timestamp:
Aug 15, 2019 8:47:23 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
132738
Message:

Shared Clipboard/URI: Update; more work on root list handling.

Location:
trunk/src/VBox/HostServices/SharedClipboard
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-internal.h

    r79631 r80283  
    222222                                      PVBOXCLIPBOARDLISTENTRY pListEntry);
    223223
    224 int vboxSvcClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const char *pszPath,
    225                                PVBOXCLIPBOARDCREATEPARMS pCreateParms, PSHAREDCLIPBOARDOBJHANDLE phObj);
     224int vboxSvcClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms,
     225                               PSHAREDCLIPBOARDOBJHANDLE phObj);
    226226int vboxSvcClipboardURIObjClose(PSHAREDCLIPBOARDPROVIDERCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj);
    227227int vboxSvcClipboardURIObjRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx, SHAREDCLIPBOARDOBJHANDLE hObj,
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp

    r79704 r80283  
    2525#include <VBox/err.h>
    2626
     27#include <VBox/GuestHost/clipboard-helper.h>
    2728#include <VBox/HostServices/VBoxClipboardSvc.h>
    2829#include <VBox/HostServices/VBoxClipboardExt.h>
     
    4950*   Prototypes                                                                                                                   *
    5051*********************************************************************************************************************************/
    51 int VBoxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    52                                    PVBOXCLIPBOARDLISTOPENPARMS pOpenParms);
    53 int VBoxSvcClipboardURISetListClose(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    54                                     SHAREDCLIPBOARDLISTHANDLE hList);
     52static int vboxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     53                                          PVBOXCLIPBOARDLISTOPENPARMS pOpenParms);
     54static int vboxSvcClipboardURISetListClose(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     55                                           SHAREDCLIPBOARDLISTHANDLE hList);
    5556
    5657
     
    7576}
    7677
    77 DECLCALLBACK(int) vboxSvcClipboardURIGetRoots(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
    78                                               char **ppapszRoots, uint32_t *pcRoots)
     78DECLCALLBACK(int) vboxSvcClipboardURIGetRoots(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDROOTLIST *ppRootList)
    7979{
    8080    LogFlowFuncEnter();
     
    8585    int rc;
    8686
    87     size_t   cbRootsRecv = 0;
    88 
    89     char    *pszRoots = NULL;
    90     uint32_t cRoots   = 0;
    91 
    92     /* There might be more than one message needed for retrieving all root items. */
    93     for (;;)
    94     {
    95         PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOTS,
    96                                                                 VBOX_SHARED_CLIPBOARD_CPARMS_ROOTS);
    97         if (pMsg)
    98         {
    99             HGCMSvcSetU32(&pMsg->m_paParms[0], 0 /* uContextID */);
    100             HGCMSvcSetU32(&pMsg->m_paParms[1], 0 /* fRoots */);
    101             HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fMore */);
    102             HGCMSvcSetU32(&pMsg->m_paParms[3], 0 /* cRoots */);
    103 
    104             uint32_t  cbData = _64K;
    105             void     *pvData = RTMemAlloc(cbData);
    106             AssertPtrBreakStmt(pvData, rc = VERR_NO_MEMORY);
    107 
    108             HGCMSvcSetU32(&pMsg->m_paParms[4], cbData);
    109             HGCMSvcSetPv (&pMsg->m_paParms[5], pvData, cbData);
    110 
    111             rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsg, true /* fAppend */);
    112             if (RT_SUCCESS(rc))
    113             {
    114                 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer,
    115                                                                   SHAREDCLIPBOARDURITRANSFEREVENTTYPE_GET_ROOTS);
    116                 AssertRC(rc2);
    117 
    118                 vboxSvcClipboardClientWakeup(pClient);
    119             }
    120         }
    121         else
    122             rc = VERR_NO_MEMORY;
    123 
    124         if (RT_SUCCESS(rc))
    125         {
    126             PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    127             rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_GET_ROOTS,
    128                                                      30 * 1000 /* Timeout in ms */, &pPayload);
    129             if (RT_SUCCESS(rc))
    130             {
    131                 PVBOXCLIPBOARDROOTS pRoots = (PVBOXCLIPBOARDROOTS)pPayload->pvData;
    132                 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDROOTS));
    133 
    134                 LogFlowFunc(("cbRoots=%RU32, fRoots=%RU32, fMore=%RTbool\n", pRoots->cbRoots, pRoots->fRoots, pRoots->fMore));
    135 
    136                 if (!pRoots->cbRoots)
    137                     break;
    138                 AssertPtr(pRoots->pszRoots);
    139 
    140                 if (pszRoots == NULL)
    141                     pszRoots = (char *)RTMemDup((void *)pRoots->pszRoots, pRoots->cbRoots);
    142                 else
    143                     pszRoots = (char *)RTMemRealloc(pszRoots, cbRootsRecv + pRoots->cbRoots);
    144 
    145                 AssertPtrBreakStmt(pszRoots, rc = VERR_NO_MEMORY);
    146 
    147                 cbRootsRecv += pRoots->cbRoots;
    148 
    149                 if (cbRootsRecv > _32M) /* Don't allow more than 32MB root entries for now. */
     87    PVBOXCLIPBOARDCLIENTMSG pMsgHdr = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_HDR_READ,
     88                                                               VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR_READ);
     89    if (pMsgHdr)
     90    {
     91        uint16_t uEventHdrRead = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer);
     92
     93        HGCMSvcSetU32(&pMsgHdr->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEventHdrRead));
     94        HGCMSvcSetU32(&pMsgHdr->m_paParms[1], 0 /* fRoots */);
     95
     96        rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsgHdr, true /* fAppend */);
     97        if (RT_SUCCESS(rc))
     98        {
     99            int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEventHdrRead);
     100            AssertRC(rc2);
     101
     102            rc = vboxSvcClipboardClientWakeup(pClient);
     103            if (RT_SUCCESS(rc))
     104            {
     105                PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayloadHdr;
     106                rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEventHdrRead,
     107                                                         pCtx->pTransfer->uTimeoutMs, &pPayloadHdr);
     108                if (RT_SUCCESS(rc))
    150109                {
    151                     rc = VERR_ALLOCATION_TOO_BIG; /** @todo Find a better rc. */
    152                     break;
     110                    PVBOXCLIPBOARDROOTLISTHDR pSrcRootListHdr = (PVBOXCLIPBOARDROOTLISTHDR)pPayloadHdr->pvData;
     111                    Assert(pPayloadHdr->cbData == sizeof(VBOXCLIPBOARDROOTLISTHDR));
     112
     113                    LogFlowFunc(("cRoots=%RU32, fRoots=0x%x\n", pSrcRootListHdr->cRoots, pSrcRootListHdr->fRoots));
     114
     115                    PVBOXCLIPBOARDROOTLIST pRootList = SharedClipboardURIRootListAlloc();
     116                    if (pRootList)
     117                    {
     118                        if (pSrcRootListHdr->cRoots)
     119                        {
     120                            pRootList->paEntries =
     121                                (PVBOXCLIPBOARDROOTLISTENTRY)RTMemAllocZ(pSrcRootListHdr->cRoots * sizeof(VBOXCLIPBOARDROOTLISTENTRY));
     122
     123                            if (pRootList->paEntries)
     124                            {
     125                                for (uint32_t i = 0; i < pSrcRootListHdr->cRoots; i++)
     126                                {
     127                                    PVBOXCLIPBOARDCLIENTMSG pMsgEntry = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_ROOT_LIST_ENTRY_READ,
     128                                                                                                 VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_ENTRY_READ_REQ);
     129
     130                                    uint16_t uEventEntryRead = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer);
     131
     132                                    HGCMSvcSetU32(&pMsgEntry->m_paParms[0],
     133                                                  VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEventEntryRead));
     134                                    HGCMSvcSetU32(&pMsgEntry->m_paParms[1], 0 /* fRoots */);
     135                                    HGCMSvcSetU32(&pMsgEntry->m_paParms[2], i /* uIndex */);
     136
     137                                    int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEventEntryRead);
     138                                    AssertRC(rc2);
     139
     140                                    rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsgEntry, true /* fAppend */);
     141                                    if (RT_FAILURE(rc))
     142                                        break;
     143
     144                                    PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayloadEntry;
     145                                    rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEventEntryRead,
     146                                                                             pCtx->pTransfer->uTimeoutMs, &pPayloadEntry);
     147                                    if (RT_FAILURE(rc))
     148                                        break;
     149
     150                                    PVBOXCLIPBOARDROOTLISTENTRY pSrcRootListEntry = (PVBOXCLIPBOARDROOTLISTENTRY)pPayloadEntry->pvData;
     151                                    Assert(pPayloadEntry->cbData == sizeof(VBOXCLIPBOARDROOTLISTENTRY));
     152
     153                                    rc = SharedClipboardURIListEntryCopy(&pRootList->paEntries[i], pSrcRootListEntry);
     154
     155                                    SharedClipboardURITransferPayloadFree(pPayloadEntry);
     156
     157                                    SharedClipboardURITransferEventUnregister(pCtx->pTransfer, uEventEntryRead);
     158
     159                                    if (RT_FAILURE(rc))
     160                                        break;
     161                                }
     162                            }
     163                            else
     164                                rc = VERR_NO_MEMORY;
     165                        }
     166
     167                        if (RT_SUCCESS(rc))
     168                        {
     169                            pRootList->Hdr.cRoots = pSrcRootListHdr->cRoots;
     170                            pRootList->Hdr.fRoots = 0; /** @todo Implement this. */
     171
     172                            *ppRootList = pRootList;
     173                        }
     174                        else
     175                            SharedClipboardURIRootListFree(pRootList);
     176
     177                        SharedClipboardURITransferPayloadFree(pPayloadHdr);
     178                    }
     179                    else
     180                        rc = VERR_NO_MEMORY;
    153181                }
    154 
    155                 cRoots += pRoots->cRoots;
    156 
    157                 const bool fDone = !RT_BOOL(pRoots->fMore); /* More root entries to be retrieved? Otherwise bail out. */
    158 
    159                 SharedClipboardURITransferPayloadFree(pPayload);
    160 
    161                 if (fDone)
    162                     break;
    163             }
    164         }
    165 
    166         if (RT_FAILURE(rc))
    167             break;
    168     }
    169 
    170     if (RT_SUCCESS(rc))
    171     {
    172         LogFlowFunc(("cRoots=%RU32\n", cRoots));
    173 
    174         *ppapszRoots = pszRoots;
    175         *pcRoots     = cRoots;
     182            }
     183
     184            SharedClipboardURITransferEventUnregister(pCtx->pTransfer, uEventHdrRead);
     185        }
    176186    }
    177187    else
    178     {
    179         RTMemFree(pszRoots);
    180         pszRoots = NULL;
    181     }
     188        rc = VERR_NO_MEMORY;
    182189
    183190    LogFlowFuncLeave();
     
    199206    if (pMsg)
    200207    {
    201         rc = VBoxSvcClipboardURISetListOpen(pMsg->m_cParms, pMsg->m_paParms, pOpenParms);
     208        rc = vboxSvcClipboardURISetListOpen(pMsg->m_cParms, pMsg->m_paParms, pOpenParms);
    202209        if (RT_SUCCESS(rc))
    203210        {
     
    205212            if (RT_SUCCESS(rc))
    206213            {
    207                 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN);
     214                uint16_t uEvent = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer);
     215
     216                int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEvent);
    208217                AssertRC(rc2);
    209218
    210                 vboxSvcClipboardClientWakeup(pClient);
     219                rc = vboxSvcClipboardClientWakeup(pClient);
     220                if (RT_SUCCESS(rc))
     221                {
     222                    PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     223                    rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);
     224                    if (RT_SUCCESS(rc))
     225                    {
     226                        Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDREPLY));
     227
     228                        PVBOXCLIPBOARDREPLY pReply = (PVBOXCLIPBOARDREPLY)pPayload->pvData;
     229                        AssertPtr(pReply);
     230
     231                        Assert(pReply->uType == VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN);
     232
     233                        *phList = pReply->u.ListOpen.uHandle;
     234
     235                        SharedClipboardURITransferPayloadFree(pPayload);
     236                    }
     237                }
     238
     239                SharedClipboardURITransferEventUnregister(pCtx->pTransfer, uEvent);
    211240            }
    212241        }
     
    214243    else
    215244        rc = VERR_NO_MEMORY;
    216 
    217     if (RT_SUCCESS(rc))
    218     {
    219         PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    220         rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN,
    221                                                  30 * 1000 /* Timeout in ms */, &pPayload);
    222         if (RT_SUCCESS(rc))
    223         {
    224             Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDREPLY));
    225 
    226             PVBOXCLIPBOARDREPLY pReply = (PVBOXCLIPBOARDREPLY)pPayload->pvData;
    227             AssertPtr(pReply);
    228 
    229             Assert(pReply->uType == VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN);
    230 
    231             *phList = pReply->u.ListOpen.uHandle;
    232 
    233             SharedClipboardURITransferPayloadFree(pPayload);
    234         }
    235     }
    236245
    237246    LogFlowFuncLeaveRC(rc);
     
    252261    if (pMsg)
    253262    {
    254         rc = VBoxSvcClipboardURISetListClose(pMsg->m_cParms, pMsg->m_paParms, hList);
     263        rc = vboxSvcClipboardURISetListClose(pMsg->m_cParms, pMsg->m_paParms, hList);
    255264        if (RT_SUCCESS(rc))
    256265        {
     
    258267            if (RT_SUCCESS(rc))
    259268            {
    260                 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_CLOSE);
     269                uint16_t uEvent = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer);
     270
     271                int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEvent);
    261272                AssertRC(rc2);
    262273
    263                 vboxSvcClipboardClientWakeup(pClient);
     274                rc = vboxSvcClipboardClientWakeup(pClient);
     275                if (RT_SUCCESS(rc))
     276                {
     277                    PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     278                    rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);
     279                    if (RT_SUCCESS(rc))
     280                        SharedClipboardURITransferPayloadFree(pPayload);
     281                }
     282
     283                SharedClipboardURITransferEventUnregister(pCtx->pTransfer, uEvent);
    264284            }
    265285        }
     
    267287    else
    268288        rc = VERR_NO_MEMORY;
    269 
    270     if (RT_SUCCESS(rc))
    271     {
    272         PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    273         rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_CLOSE,
    274                                                  30 * 1000 /* Timeout in ms */, &pPayload);
    275         if (RT_SUCCESS(rc))
    276             SharedClipboardURITransferPayloadFree(pPayload);
    277     }
    278289
    279290    LogFlowFuncLeaveRC(rc);
     
    302313        if (RT_SUCCESS(rc))
    303314        {
    304             int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE);
     315            uint16_t uEvent = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer);
     316
     317            int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEvent);
    305318            AssertRC(rc2);
    306319
    307             vboxSvcClipboardClientWakeup(pClient);
     320            rc = vboxSvcClipboardClientWakeup(pClient);
     321            if (RT_SUCCESS(rc))
     322            {
     323                PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     324                rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEvent,
     325                                                         pCtx->pTransfer->uTimeoutMs, &pPayload);
     326                if (RT_SUCCESS(rc))
     327                {
     328                    Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTHDR));
     329
     330                    *pListHdr = *(PVBOXCLIPBOARDLISTHDR)pPayload->pvData;
     331
     332                    SharedClipboardURITransferPayloadFree(pPayload);
     333                }
     334            }
    308335        }
    309336    }
     
    311338        rc = VERR_NO_MEMORY;
    312339
    313     if (RT_SUCCESS(rc))
    314     {
    315         PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    316         rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE,
    317                                                  30 * 1000 /* Timeout in ms */, &pPayload);
    318         if (RT_SUCCESS(rc))
    319         {
    320             Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTHDR));
    321 
    322             *pListHdr = *(PVBOXCLIPBOARDLISTHDR)pPayload->pvData;
    323 
    324             SharedClipboardURITransferPayloadFree(pPayload);
    325         }
    326     }
    327 
    328340    LogFlowFuncLeaveRC(rc);
    329341    return rc;
     
    351363
    352364    PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ,
    353                                                             VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ_REQ);
     365                                                            VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ);
    354366    if (pMsg)
    355367    {
    356         HGCMSvcSetU32(&pMsg->m_paParms[0], 0 /* uContextID */);
     368        uint16_t uEvent = SharedClipboardURITransferEventIDGenerate(pCtx->pTransfer);
     369
     370        HGCMSvcSetU32(&pMsg->m_paParms[0], VBOX_SHARED_CLIPBOARD_CONTEXTID_MAKE(pCtx->pTransfer->State.uID, uEvent));
    357371        HGCMSvcSetU64(&pMsg->m_paParms[1], hList);
    358372        HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fInfo */);
     
    361375        if (RT_SUCCESS(rc))
    362376        {
    363             int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE);
    364             if (rc2 == VERR_ALREADY_EXISTS)
    365                 rc2 = VINF_SUCCESS;
     377            int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, uEvent);
    366378            AssertRC(rc2);
    367379
    368             vboxSvcClipboardClientWakeup(pClient);
     380            rc = vboxSvcClipboardClientWakeup(pClient);
     381            if (RT_SUCCESS(rc))
     382            {
     383                PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     384                rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, uEvent, pCtx->pTransfer->uTimeoutMs, &pPayload);
     385                if (RT_SUCCESS(rc))
     386                {
     387                    Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTENTRY));
     388
     389                    rc = SharedClipboardURIListEntryCopy(pListEntry, (PVBOXCLIPBOARDLISTENTRY)pPayload->pvData);
     390
     391                    SharedClipboardURITransferPayloadFree(pPayload);
     392                }
     393            }
    369394        }
    370395    }
     
    372397        rc = VERR_NO_MEMORY;
    373398
    374     if (RT_SUCCESS(rc))
    375     {
    376         PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    377         rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE,
    378                                                  30 * 1000 /* Timeout in ms */, &pPayload);
    379         if (RT_SUCCESS(rc))
    380         {
    381             Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTENTRY));
    382 
    383             rc = SharedClipboardURIListEntryCopy(pListEntry, (PVBOXCLIPBOARDLISTENTRY)pPayload->pvData);
    384 
    385             SharedClipboardURITransferPayloadFree(pPayload);
    386         }
    387     }
    388 
    389399    LogFlowFuncLeaveRC(rc);
    390400    return rc;
     
    401411}
    402412
    403 int vboxSvcClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const char *pszPath,
    404                                PVBOXCLIPBOARDCREATEPARMS pCreateParms, PSHAREDCLIPBOARDOBJHANDLE phObj)
    405 {
    406     RT_NOREF(pCtx, pszPath, pCreateParms, phObj);
     413int vboxSvcClipboardURIObjOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDOBJOPENCREATEPARMS pCreateParms,
     414                               PSHAREDCLIPBOARDOBJHANDLE phObj)
     415{
     416    RT_NOREF(pCtx, pCreateParms, phObj);
    407417
    408418    LogFlowFuncEnter();
     
    413423    AssertPtr(pThisCtx);
    414424
     425    RT_NOREF(pThisCtx);
     426
    415427    LogFlowFuncLeaveRC(rc);
    416428    return rc;
     
    427439    PVBOXCLIPBOARDCONTEXT pThisCtx = (PVBOXCLIPBOARDCONTEXT)pCtx->pvUser;
    428440    AssertPtr(pThisCtx);
     441
     442    RT_NOREF(pThisCtx);
    429443
    430444    LogFlowFuncLeaveRC(rc);
     
    509523 * @param   pReply              Where to store the reply.
    510524 */
    511 int VBoxSvcClipboardURIGetReply(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    512                                 PVBOXCLIPBOARDREPLY pReply)
     525static int vboxSvcClipboardURIGetReply(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     526                                       PVBOXCLIPBOARDREPLY pReply)
    513527{
    514528    int rc;
     
    518532        uint32_t cbPayload = 0;
    519533
    520         /* Note: Context ID (paParms[0]) not used yet. */
    521534        rc = HGCMSvcGetU32(&paParms[1], &pReply->uType);
    522535        if (RT_SUCCESS(rc))
     
    569582
    570583/**
    571  * Gets the URI root entries from HGCM service parameters.
     584 * Gets an URI root list header from HGCM service parameters.
    572585 *
    573586 * @returns VBox status code.
    574587 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
    575588 * @param   paParms             Array of HGCM parameters.
    576  * @param   pRoots              Where to store the URI root entries on success.
    577  */
    578 int VBoxSvcClipboardURIGetRoots(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    579                                 PVBOXCLIPBOARDROOTS pRoots)
     589 * @param   pRootLstHdr         Where to store the URI root list header on success.
     590 */
     591static int vboxSvcClipboardURIGetRootListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     592                                             PVBOXCLIPBOARDROOTLISTHDR pRootLstHdr)
    580593{
    581594    int rc;
    582595
    583     if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_ROOTS)
    584     {
    585         /* Note: Context ID (paParms[0]) not used yet. */
    586         rc = HGCMSvcGetU32(&paParms[1], &pRoots->fRoots);
    587         if (RT_SUCCESS(rc))
    588         {
    589             uint32_t fMore;
    590             rc = HGCMSvcGetU32(&paParms[2], &fMore);
    591             if (RT_SUCCESS(rc))
    592                 pRoots->fMore = RT_BOOL(fMore);
    593         }
    594         if (RT_SUCCESS(rc))
    595             rc = HGCMSvcGetU32(&paParms[3], &pRoots->cRoots);
    596         if (RT_SUCCESS(rc))
    597         {
    598             uint32_t cbRoots;
    599             rc = HGCMSvcGetU32(&paParms[4], &cbRoots);
    600             if (RT_SUCCESS(rc))
    601                 rc = HGCMSvcGetPv(&paParms[5], (void **)&pRoots->pszRoots, &pRoots->cbRoots);
    602 
    603             AssertReturn(cbRoots == pRoots->cbRoots, VERR_INVALID_PARAMETER);
     596    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_HDR)
     597    {
     598        rc = HGCMSvcGetU32(&paParms[1], &pRootLstHdr->fRoots);
     599        if (RT_SUCCESS(rc))
     600            rc = HGCMSvcGetU32(&paParms[2], &pRootLstHdr->cRoots);
     601    }
     602    else
     603        rc = VERR_INVALID_PARAMETER;
     604
     605    LogFlowFuncLeaveRC(rc);
     606    return rc;
     607}
     608
     609/**
     610 * Gets an URI root list entry from HGCM service parameters.
     611 *
     612 * @returns VBox status code.
     613 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
     614 * @param   paParms             Array of HGCM parameters.
     615 * @param   pListEntry          Where to store the root list entry.
     616 */
     617static int vboxSvcClipboardURIGetRootListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     618                                               PVBOXCLIPBOARDROOTLISTENTRY pListEntry)
     619{
     620    int rc;
     621
     622    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_ROOT_LIST_ENTRY)
     623    {
     624        rc = HGCMSvcGetU32(&paParms[1], &pListEntry->fInfo);
     625        /* Note: paParms[2] contains the entry index, currently being ignored. */
     626        if (RT_SUCCESS(rc))
     627            rc = HGCMSvcGetPv(&paParms[3], (void **)&pListEntry->pszName, &pListEntry->cbName);
     628        if (RT_SUCCESS(rc))
     629        {
     630            uint32_t cbInfo;
     631            rc = HGCMSvcGetU32(&paParms[4], &cbInfo);
     632            if (RT_SUCCESS(rc))
     633            {
     634                rc = HGCMSvcGetPv(&paParms[5], &pListEntry->pvInfo, &pListEntry->cbInfo);
     635                AssertReturn(cbInfo == pListEntry->cbInfo, VERR_INVALID_PARAMETER);
     636            }
    604637        }
    605638    }
     
    619652 * @param   pOpenParms          Where to store the open parameters of the request.
    620653 */
    621 int VBoxSvcClipboardURIGetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    622                                    PVBOXCLIPBOARDLISTOPENPARMS pOpenParms)
     654static int vboxSvcClipboardURIGetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     655                                          PVBOXCLIPBOARDLISTOPENPARMS pOpenParms)
    623656{
    624657    int rc;
     
    629662        uint32_t cbFilter = 0;
    630663
    631         /* Note: Context ID (paParms[0]) not used yet. */
    632664        rc = HGCMSvcGetU32(&paParms[1], &pOpenParms->fList);
    633665        if (RT_SUCCESS(rc))
     
    666698 * @param   pOpenParms          List open parameters to set.
    667699 */
    668 int VBoxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    669                                    PVBOXCLIPBOARDLISTOPENPARMS pOpenParms)
     700static int vboxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     701                                          PVBOXCLIPBOARDLISTOPENPARMS pOpenParms)
    670702{
    671703    int rc;
     
    698730 * @param   hList               Handle of list to close.
    699731 */
    700 int VBoxSvcClipboardURISetListClose(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    701                                     SHAREDCLIPBOARDLISTHANDLE hList)
     732static int vboxSvcClipboardURISetListClose(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     733                                           SHAREDCLIPBOARDLISTHANDLE hList)
    702734{
    703735    int rc;
     
    726758 * @param   pListHdr            Where to store the list header.
    727759 */
    728 int VBoxSvcClipboardURIGetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    729                                   PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr)
     760static int vboxSvcClipboardURIGetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     761                                         PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr)
    730762{
    731763    int rc;
     
    733765    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR)
    734766    {
    735         /* Note: Context ID (paParms[0]) not used yet. */
    736767        rc = HGCMSvcGetU64(&paParms[1], phList);
    737768        /* Note: Flags (paParms[2]) not used here. */
     
    768799 * @param   pListHdr            Pointer to data to set to the HGCM parameters.
    769800 */
    770 int VBoxSvcClipboardURISetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTHDR pListHdr)
     801static int vboxSvcClipboardURISetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTHDR pListHdr)
    771802{
    772803    int rc;
     
    804835 * @param   pListEntry          Where to store the list entry.
    805836 */
    806 int VBoxSvcClipboardURIGetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
    807                                     PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTENTRY pListEntry)
     837static int vboxSvcClipboardURIGetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[],
     838                                           PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTENTRY pListEntry)
    808839{
    809840    int rc;
     
    811842    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY)
    812843    {
    813         /* Note: Context ID (paParms[0]) not used yet. */
    814844        rc = HGCMSvcGetU64(&paParms[1], phList);
    815845        if (RT_SUCCESS(rc))
     
    849879 * @param   pListEntry          Pointer to data to set to the HGCM parameters.
    850880 */
    851 int VBoxSvcClipboardURISetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTENTRY pListEntry)
     881static int vboxSvcClipboardURISetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDLISTENTRY pListEntry)
    852882{
    853883    int rc;
     
    879909 * @param   pRc                 Where to store the received error code.
    880910 */
    881 int VBoxSvcClipboardURIGetError(uint32_t cParms, VBOXHGCMSVCPARM paParms[], int *pRc)
     911static int vboxSvcClipboardURIGetError(uint32_t cParms, VBOXHGCMSVCPARM paParms[], int *pRc)
    882912{
    883913    AssertPtrReturn(paParms, VERR_INVALID_PARAMETER);
     
    888918    if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_ERROR)
    889919    {
    890         /* Note: Context ID (paParms[0]) not used yet. */
    891920        rc = HGCMSvcGetU32(&paParms[1], (uint32_t *)pRc); /** @todo int vs. uint32_t !!! */
    892921    }
     
    907936 * @param   paParms             Array function parameters supplied.
    908937 */
    909 int VBoxSvcClipboardURITransferHandleReply(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer,
    910                                            uint32_t cParms, VBOXHGCMSVCPARM paParms[])
     938static int vboxSvcClipboardURITransferHandleReply(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer,
     939                                                  uint32_t cParms, VBOXHGCMSVCPARM paParms[])
    911940{
    912941    RT_NOREF(pClient);
     
    918947    if (pReply)
    919948    {
    920         rc = VBoxSvcClipboardURIGetReply(cParms, paParms, pReply);
     949        rc = vboxSvcClipboardURIGetReply(cParms, paParms, pReply);
    921950        if (RT_SUCCESS(rc))
    922951        {
     
    931960                {
    932961                    case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN:
    933                     {
    934                         rc = SharedClipboardURITransferEventSignal(pTransfer,
    935                                                                    SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN, pPayload);
    936                         break;
    937                     }
    938 
     962                        RT_FALL_THROUGH();
    939963                    case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_CLOSE:
    940                     {
    941                         rc = SharedClipboardURITransferEventSignal(pTransfer,
    942                                                                    SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_CLOSE, pPayload);
    943                         break;
    944                     }
    945 
     964                        RT_FALL_THROUGH();
    946965                    case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_OBJ_OPEN:
    947                     {
    948                         rc = SharedClipboardURITransferEventSignal(pTransfer,
    949                                                                    SHAREDCLIPBOARDURITRANSFEREVENTTYPE_OBJ_OPEN, pPayload);
    950                         break;
    951                     }
    952 
     966                        RT_FALL_THROUGH();
    953967                    case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_OBJ_CLOSE:
    954968                    {
    955                         rc = SharedClipboardURITransferEventSignal(pTransfer,
    956                                                                    SHAREDCLIPBOARDURITRANSFEREVENTTYPE_OBJ_CLOSE, pPayload);
     969                        uint32_t uCID;
     970                        rc = HGCMSvcGetU32(&paParms[0], &uCID);
     971                        if (RT_SUCCESS(rc))
     972                        {
     973                            const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID);
     974                            rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload);
     975                        }
    957976                        break;
    958977                    }
     
    10071026
    10081027    LogFlowFunc(("uClient=%RU32, u32Function=%RU32 (%s), cParms=%RU32, g_pfnExtension=%p\n",
    1009                  pClient->uClientID, u32Function, VBoxSvcClipboardGuestMsgToStr(u32Function), cParms, g_pfnExtension));
     1028                 pClient->uClientID, u32Function, VBoxClipboardGuestMsgToStr(u32Function), cParms, g_pfnExtension));
    10101029
    10111030    const PVBOXCLIPBOARDCLIENTDATA pClientData = pClient->pData;
     
    11931212        case VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY:
    11941213        {
    1195             rc = VBoxSvcClipboardURITransferHandleReply(pClient, pTransfer, cParms, paParms);
    1196             break;
    1197         }
    1198 
    1199         case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOTS:
    1200         {
    1201             VBOXCLIPBOARDROOTS Roots;
    1202             rc = VBoxSvcClipboardURIGetRoots(cParms, paParms, &Roots);
    1203             if (RT_SUCCESS(rc))
    1204             {
    1205                 void    *pvData = SharedClipboardURIRootsDup(&Roots);
    1206                 uint32_t cbData = sizeof(VBOXCLIPBOARDROOTS);
     1214            rc = vboxSvcClipboardURITransferHandleReply(pClient, pTransfer, cParms, paParms);
     1215            break;
     1216        }
     1217
     1218        case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_READ:
     1219        {
     1220            break;
     1221        }
     1222
     1223        case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_HDR_WRITE:
     1224        {
     1225            VBOXCLIPBOARDROOTLISTHDR lstHdr;
     1226            rc = vboxSvcClipboardURIGetRootListHdr(cParms, paParms, &lstHdr);
     1227            if (RT_SUCCESS(rc))
     1228            {
     1229                void    *pvData = SharedClipboardURIRootListHdrDup(&lstHdr);
     1230                uint32_t cbData = sizeof(VBOXCLIPBOARDROOTLISTHDR);
     1231
     1232                uint32_t uCID;
     1233                rc = HGCMSvcGetU32(&paParms[0], &uCID);
     1234                if (RT_SUCCESS(rc))
     1235                {
     1236                    const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID);
     1237
     1238                    PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     1239                    rc = SharedClipboardURITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload);
     1240                    if (RT_SUCCESS(rc))
     1241                        rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload);
     1242                }
     1243            }
     1244            break;
     1245        }
     1246
     1247        case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_READ:
     1248        {
     1249    #if 0
     1250            VBOXCLIPBOARDROOTLISTENTRY lstEntry;
     1251            rc = VBoxSvcClipboardURIGetRootListEntry(cParms, paParms, &lstEntry);
     1252            if (RT_SUCCESS(rc))
     1253            {
     1254                void    *pvData = SharedClipboardURIRootListEntryDup(&lstEntry);
     1255                uint32_t cbData = sizeof(VBOXCLIPBOARDROOTLISTENTRY);
    12071256
    12081257                PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    1209                 rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_GET_ROOTS,
     1258                rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_ROOT_LIST_HDR_READ,
    12101259                                                            pvData, cbData, &pPayload);
    12111260                if (RT_SUCCESS(rc))
    1212                     rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_GET_ROOTS,
     1261                    rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_ROOT_LIST_HDR_READ,
    12131262                                                               pPayload);
    12141263            }
    12151264            break;
     1265    #endif
     1266        }
     1267
     1268        case VBOX_SHARED_CLIPBOARD_GUEST_FN_ROOT_LIST_ENTRY_WRITE:
     1269        {
     1270            VBOXCLIPBOARDROOTLISTENTRY lstEntry;
     1271            rc = vboxSvcClipboardURIGetRootListEntry(cParms, paParms, &lstEntry);
     1272            if (RT_SUCCESS(rc))
     1273            {
     1274                void    *pvData = SharedClipboardURIRootListEntryDup(&lstEntry);
     1275                uint32_t cbData = sizeof(VBOXCLIPBOARDROOTLISTENTRY);
     1276
     1277                uint32_t uCID;
     1278                rc = HGCMSvcGetU32(&paParms[0], &uCID);
     1279                if (RT_SUCCESS(rc))
     1280                {
     1281                    const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID);
     1282
     1283                    PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     1284                    rc = SharedClipboardURITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload);
     1285                    if (RT_SUCCESS(rc))
     1286                        rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload);
     1287                }
     1288            }
     1289            break;
    12161290        }
    12171291
     
    12191293        {
    12201294            VBOXCLIPBOARDLISTOPENPARMS listOpenParms;
    1221             rc = VBoxSvcClipboardURIGetListOpen(cParms, paParms, &listOpenParms);
     1295            rc = vboxSvcClipboardURIGetListOpen(cParms, paParms, &listOpenParms);
    12221296            if (RT_SUCCESS(rc))
    12231297            {
     
    12391313
    12401314            SHAREDCLIPBOARDLISTHANDLE hList;
    1241             /* Note: Context ID (paParms[0]) not used yet. */
    12421315            rc = HGCMSvcGetU64(&paParms[1], &hList);
    12431316            if (RT_SUCCESS(rc))
     
    12541327
    12551328            SHAREDCLIPBOARDLISTHANDLE hList;
    1256             /* Note: Context ID (paParms[0]) not used yet. */
    12571329            rc = HGCMSvcGetU64(&paParms[1], &hList); /* Get list handle. */
    12581330            if (RT_SUCCESS(rc))
     
    12611333                rc = SharedClipboardURITransferListGetHeader(pTransfer, hList, &hdrList);
    12621334                if (RT_SUCCESS(rc))
    1263                     rc = VBoxSvcClipboardURISetListHdr(cParms, paParms, &hdrList);
     1335                    rc = vboxSvcClipboardURISetListHdr(cParms, paParms, &hdrList);
    12641336            }
    12651337            break;
     
    12731345            {
    12741346                SHAREDCLIPBOARDLISTHANDLE hList;
    1275                 rc = VBoxSvcClipboardURIGetListHdr(cParms, paParms, &hList, &hdrList);
     1347                rc = vboxSvcClipboardURIGetListHdr(cParms, paParms, &hList, &hdrList);
    12761348                if (RT_SUCCESS(rc))
    12771349                {
     
    12791351                    uint32_t cbData = sizeof(VBOXCLIPBOARDLISTHDR);
    12801352
    1281                     PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    1282                     rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE,
    1283                                                                 pvData, cbData, &pPayload);
     1353                    uint32_t uCID;
     1354                    rc = HGCMSvcGetU32(&paParms[0], &uCID);
    12841355                    if (RT_SUCCESS(rc))
    12851356                    {
    1286                         rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE,
    1287                                                                    pPayload);
     1357                        const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID);
     1358
     1359                        PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     1360                        rc = SharedClipboardURITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload);
     1361                        if (RT_SUCCESS(rc))
     1362                            rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload);
    12881363                    }
    12891364                }
     
    12981373
    12991374            SHAREDCLIPBOARDLISTHANDLE hList;
    1300             /* Note: Context ID (paParms[0]) not used yet. */
    13011375            rc = HGCMSvcGetU64(&paParms[1], &hList); /* Get list handle. */
    13021376            if (RT_SUCCESS(rc))
     
    13151389            {
    13161390                SHAREDCLIPBOARDLISTHANDLE hList;
    1317                 rc = VBoxSvcClipboardURIGetListEntry(cParms, paParms, &hList, &entryList);
     1391                rc = vboxSvcClipboardURIGetListEntry(cParms, paParms, &hList, &entryList);
    13181392                if (RT_SUCCESS(rc))
    13191393                {
     
    13211395                    uint32_t cbData = sizeof(VBOXCLIPBOARDLISTENTRY);
    13221396
    1323                     PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
    1324                     rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE,
    1325                                                                 pvData, cbData, &pPayload);
     1397                    uint32_t uCID;
     1398                    rc = HGCMSvcGetU32(&paParms[0], &uCID);
    13261399                    if (RT_SUCCESS(rc))
    13271400                    {
    1328                         rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE,
    1329                                                                    pPayload);
     1401                        const uint16_t uEvent = VBOX_SHARED_CLIPBOARD_CONTEXTID_GET_EVENT(uCID);
     1402
     1403                        PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload;
     1404                        rc = SharedClipboardURITransferPayloadAlloc(uEvent, pvData, cbData, &pPayload);
     1405                        if (RT_SUCCESS(rc))
     1406                            rc = SharedClipboardURITransferEventSignal(pTransfer, uEvent, pPayload);
    13301407                    }
    1331 
    13321408                }
    13331409            }
     
    15141590        {
    15151591            int rcGuest;
    1516             rc = VBoxSvcClipboardURIGetError(cParms,paParms, &rcGuest);
     1592            rc = vboxSvcClipboardURIGetError(cParms,paParms, &rcGuest);
    15171593            if (RT_SUCCESS(rc))
    15181594                LogRel(("Shared Clipboard: Transfer error: %Rrc\n", rcGuest));
     
    15811657int vboxSvcClipboardURIAreaRegister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer)
    15821658{
     1659    RT_NOREF(pClientState);
     1660
    15831661    LogFlowFuncEnter();
    15841662
     
    16281706int vboxSvcClipboardURIAreaUnregister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer)
    16291707{
     1708    RT_NOREF(pClientState);
     1709
    16301710    LogFlowFuncEnter();
    16311711
     
    16751755                                  SHAREDCLIPBOARDAREAID uID)
    16761756{
     1757    RT_NOREF(pClientState);
     1758
    16771759    LogFlowFuncEnter();
    16781760
     
    17201802int vboxSvcClipboardURIAreaDetach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer)
    17211803{
     1804    RT_NOREF(pClientState);
     1805
    17221806    LogFlowFuncEnter();
    17231807
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-utils.cpp

    r79630 r80283  
    143143    }
    144144
    145 #if 1
    146     int rc = 0;
    147 #else
    148     /* Sanity. */
    149     Assert(pTransfer->State.enmDir == SHAREDCLIPBOARDURITRANSFERDIR_READ);
    150 
    151     int rc;
    152 
    153     /* Note: Message priority / order is taken into account here. */
    154     if (pTransfer->State.pHeader)
    155     {
    156         LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_HDR\n"));
    157         rc = VBoxSvcClipboardURIWriteListHdr(cParms, paParms, pTransfer->State.pHeader);
    158         if (RT_SUCCESS(rc))
    159         {
    160             /* We're done witht the data header, destroy it. */
    161             SharedClipboardURIListHdrFree(pTransfer->State.pHeader);
    162             pTransfer->State.pHeader = NULL;
    163 
    164             fHandled = true;
    165         }
    166     }
    167     else if (pTransfer->State.pMeta)
    168     {
    169         LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_CHUNK\n"));
    170 
    171         uint32_t cbBuf = _64K;
    172         uint8_t  pvBuf[_64K]; /** @todo Improve */
    173 
    174         uint32_t cbRead;
    175         rc = SharedClipboardMetaDataRead(pTransfer->State.pMeta, pvBuf, cbBuf, &cbRead);
    176         if (RT_SUCCESS(rc))
    177         {
    178             Assert(cbRead <= cbBuf);
    179 
    180             VBOXCLIPBOARDListEntry ListEntry;
    181             RT_ZERO(ListEntry);
    182             ListEntry.pvData = pvBuf;
    183             ListEntry.cbData = cbRead;
    184 
    185             rc = VBoxSvcClipboardURIWriteListEntry(cParms, paParms, &ListEntry);
    186         }
    187 
    188         /* Has all meta data been read? */
    189         if (RT_SUCCESS(rc))
    190         {
    191             if (SharedClipboardMetaDataGetUsed(pTransfer->State.pMeta) == 0)
    192             {
    193                 SharedClipboardMetaDataFree(pTransfer->State.pMeta);
    194                 pTransfer->State.pMeta = NULL;
    195             }
    196 
    197             fHandled = true;
    198         }
    199     }
    200     else if (pTransfer->pURIList)
    201     {
    202         PSHAREDCLIPBOARDCLIENTURIOBJCTX pObjCtx = SharedClipboardURITransferGetCurrentObjCtx(pTransfer);
    203         if (!SharedClipboardURIObjCtxIsValid(pObjCtx))
    204         {
    205             if (!pTransfer->pURIList->IsEmpty())
    206                 pObjCtx->pObj = pTransfer->pURIList->First();
    207         }
    208 
    209         if (   pObjCtx
    210             && pObjCtx->pObj)
    211         {
    212             switch (pObjCtx->pObj->GetType())
    213             {
    214                 case SharedClipboardURIObject::Type_Directory:
    215                 {
    216                     rc = VBoxSvcClipboardURIWriteDir(cParms, paParms, &ListEntry);
    217                     break;
    218                 }
    219             }
    220         }
    221 
    222         if (0)
    223         {
    224             delete pTransfer->pURIList;
    225             pTransfer->pURIList = NULL;
    226         }
    227 
    228         fHandled = true;
    229     }
    230     else
    231         rc = VERR_WRONG_ORDER;
    232 #endif
    233 
    234     LogFlowFunc(("rc=%Rrc, fHandled=%RTbool\n", rc, fHandled));
     145    LogFlowFunc(("fHandled=%RTbool\n", fHandled));
    235146    return fHandled;
    236147}
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp

    r79705 r80283  
    177177
    178178#include <VBox/AssertGuest.h>
     179#include <VBox/GuestHost/clipboard-helper.h>
    179180#include <VBox/HostServices/Service.h>
    180181#include <VBox/HostServices/VBoxClipboardSvc.h>
     
    471472            vboxSvcClipboardMsgSetPeekReturn(pFirstMsg, paParms, cParms);
    472473            LogFlowFunc(("[Client %RU32] VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_XXX -> VINF_SUCCESS (idMsg=%u (%s), cParms=%u)\n",
    473                          pClient->uClientID, pFirstMsg->m_uMsg, VBoxSvcClipboardHostMsgToStr(pFirstMsg->m_uMsg),
     474                         pClient->uClientID, pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg),
    474475                         pFirstMsg->m_cParms));
    475476            return VINF_SUCCESS;
     
    535536        {
    536537            LogFlowFunc(("First message is: %RU32 %s (%RU32 parms)\n",
    537                          pFirstMsg->m_uMsg, VBoxSvcClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms));
     538                         pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms));
    538539
    539540            ASSERT_GUEST_MSG_RETURN(pFirstMsg->m_uMsg == idMsgExpected || idMsgExpected == UINT32_MAX,
    540541                                    ("idMsg=%u (%s) cParms=%u, caller expected %u (%s) and %u\n",
    541                                      pFirstMsg->m_uMsg, VBoxSvcClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms,
    542                                      idMsgExpected, VBoxSvcClipboardHostMsgToStr(idMsgExpected), cParms),
     542                                     pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms,
     543                                     idMsgExpected, VBoxClipboardHostMsgToStr(idMsgExpected), cParms),
    543544                                    VERR_MISMATCH);
    544545            ASSERT_GUEST_MSG_RETURN(pFirstMsg->m_cParms == cParms,
    545546                                    ("idMsg=%u (%s) cParms=%u, caller expected %u (%s) and %u\n",
    546                                      pFirstMsg->m_uMsg, VBoxSvcClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms,
    547                                      idMsgExpected, VBoxSvcClipboardHostMsgToStr(idMsgExpected), cParms),
     547                                     pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg), pFirstMsg->m_cParms,
     548                                     idMsgExpected, VBoxClipboardHostMsgToStr(idMsgExpected), cParms),
    548549                                    VERR_WRONG_PARAMETER_COUNT);
    549550
     
    552553                ASSERT_GUEST_MSG_RETURN(pFirstMsg->m_paParms[i].type == paParms[i].type,
    553554                                        ("param #%u: type %u, caller expected %u (idMsg=%u %s)\n", i, pFirstMsg->m_paParms[i].type,
    554                                          paParms[i].type, pFirstMsg->m_uMsg, VBoxSvcClipboardHostMsgToStr(pFirstMsg->m_uMsg)),
     555                                         paParms[i].type, pFirstMsg->m_uMsg, VBoxClipboardHostMsgToStr(pFirstMsg->m_uMsg)),
    555556                                        VERR_WRONG_PARAMETER_TYPE);
    556557            /*
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