VirtualBox

Ignore:
Timestamp:
Jun 26, 2019 9:15:29 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
131579
Message:

Shared Clipboard/URI: Update.

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:mergeinfo
      •  

        old new  
        99/branches/VBox-5.1:112367,115992,116543,116550,116568,116573
        1010/branches/VBox-5.2:119536,120083,120099,120213,120221,120239,123597-123598,123600-123601,123755,124260,124263,124271,124273,124277-124279,124284-124286,124288-124290,125768,125779-125780,125812
        11 /branches/VBox-6.0:130474-130475,130477,130479
         11/branches/VBox-6.0:130474-130475,130477,130479,131352
        1212/branches/aeichner/vbox-chromium-cleanup:129816,129818-129851,129853-129861,129871-129872,129876,129880,129882,130013-130015,130036,130094-130095
        1313/branches/andy/draganddrop:90781-91268
  • trunk/src/VBox/HostServices/SharedClipboard/Makefile.kmk

    r79270 r79347  
    5151        $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardMetaData.cpp \
    5252        $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardPath.cpp \
    53         $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardProvider.cpp \
    54         $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardProvider-HostService.cpp \
    5553        $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardURIList.cpp \
    5654        $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardURIObject.cpp \
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-internal.h

    r79120 r79347  
    8282    uint32_t u32ClientID;
    8383
     84    SHAREDCLIPBOARDSOURCE enmSource;
     85
    8486    /** The guest is waiting for a message. */
    8587    bool fAsync;
     
    9597    struct {
    9698        VBOXHGCMCALLHANDLE callHandle;
     99        uint32_t           cParms;
    97100        VBOXHGCMSVCPARM   *paParms;
    98101    } async;
     
    100103    struct {
    101104        VBOXHGCMCALLHANDLE callHandle;
     105        uint32_t           cParms;
    102106        VBOXHGCMSVCPARM   *paParms;
    103107    } asyncRead;
     
    129133 * The service functions. Locking is between the service thread and the platform-dependent (window) thread.
    130134 */
     135int vboxSvcClipboardCompleteReadData(PVBOXCLIPBOARDCLIENTDATA pClientData, int rc, uint32_t cbActual);
    131136uint32_t vboxSvcClipboardGetMode(void);
    132137int vboxSvcClipboardReportMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t uMsg, uint32_t uFormats);
    133 int vboxSvcClipboardCompleteReadData(PVBOXCLIPBOARDCLIENTDATA pClientData, int rc, uint32_t cbActual);
     138int vboxSvcClipboardSetSource(PVBOXCLIPBOARDCLIENTDATA pClientData, SHAREDCLIPBOARDSOURCE enmSource);
    134139
    135140# ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     
    157162
    158163#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
    159 int VBoxClipboardSvcImplURIReadDir(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData);
    160 int VBoxClipboardSvcImplURIWriteDir(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData);
    161 int VBoxClipboardSvcImplURIReadFileHdr(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr);
    162 int VBoxClipboardSvcImplURIWriteFileHdr(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr);
    163 int VBoxClipboardSvcImplURIReadFileData(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData);
    164 int VBoxClipboardSvcImplURIWriteFileData(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData);
     164int VBoxClipboardSvcImplURITransferCreate(PVBOXCLIPBOARDCLIENTDATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer);
     165int VBoxClipboardSvcImplURITransferDestroy(PVBOXCLIPBOARDCLIENTDATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer);
     166
     167int VBoxClipboardSvcImplURIReadDataHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDDATAHDR *ppDataHdr);
     168int VBoxClipboardSvcImplURIWriteDataHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDDATAHDR pDataHdr);
     169int VBoxClipboardSvcImplURIReadDataChunk(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDDATAHDR pDataHdr, void *pvChunk, uint32_t cbChunk, uint32_t fFlags, uint32_t *pcbRead);
     170int VBoxClipboardSvcImplURIWriteDataChunk(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDDATAHDR pDataHdr, const void *pvChunk, uint32_t cbChunk, uint32_t fFlags, uint32_t *pcbWritten);
     171
     172int VBoxClipboardSvcImplURIReadDir(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDDIRDATA *ppDirData);
     173int VBoxClipboardSvcImplURIWriteDir(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDDIRDATA pDirData);
     174
     175int VBoxClipboardSvcImplURIReadFileHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDFILEHDR *ppFileHdr);
     176int VBoxClipboardSvcImplURIWriteFileHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDFILEHDR pFileHdr);
     177int VBoxClipboardSvcImplURIReadFileData(PSHAREDCLIPBOARDPROVIDERCTX pCtx, void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbRead);
     178int VBoxClipboardSvcImplURIWriteFileData(PSHAREDCLIPBOARDPROVIDERCTX pCtx, void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbWritten);
    165179#endif
    166180
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp

    r79299 r79347  
    4343
    4444
    45 /**
    46  * Reads an URI data header from HGCM service parameters.
     45static DECLCALLBACK(int) vboxSvcClipboardURIProviderImplReadDataHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
     46                                                                    PVBOXCLIPBOARDDATAHDR *ppDataHdr)
     47{
     48    RT_NOREF(pCtx, ppDataHdr);
     49    return VERR_NOT_IMPLEMENTED;
     50}
     51
     52static DECLCALLBACK(int) vboxSvcClipboardURIProviderImplReadObjHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
     53                                                                   PVBOXCLIPBOARDDATAHDR *ppDataHdr)
     54{
     55    RT_NOREF(pCtx, ppDataHdr);
     56    return VERR_NOT_IMPLEMENTED;
     57}
     58
     59static DECLCALLBACK(int) vboxSvcClipboardURIProviderImplReadDir(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
     60                                                                PVBOXCLIPBOARDDIRDATA *ppDirData)
     61{
     62    RT_NOREF(pCtx, ppDirData);
     63    return VERR_NOT_IMPLEMENTED;
     64}
     65
     66static DECLCALLBACK(int) vboxSvcClipboardURIProviderImplReadFileHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx,
     67                                                                    PVBOXCLIPBOARDFILEHDR *ppFileHdr)
     68{
     69    RT_NOREF(pCtx, ppFileHdr);
     70    return VERR_NOT_IMPLEMENTED;
     71}
     72
     73static DECLCALLBACK(int) vboxSvcClipboardURIProviderImplReadFileData(PSHAREDCLIPBOARDPROVIDERCTX pCtX,
     74                                                                     void *pvData, uint32_t cbData, uint32_t fFlags,
     75                                                                     uint32_t *pcbRead)
     76{
     77#if 0
     78    const PVBOXCLIPBOARDCLIENTDATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pCtx->pvUser;
     79
     80    return pObjCtx->pObj->Read(pvBuf, cbBuf, pcbWritten);
     81#endif
     82
     83    RT_NOREF(pCtX, pvData, cbData, fFlags, pcbRead);
     84    return VERR_NOT_IMPLEMENTED;
     85}
     86
     87#if 0
     88int vboxSvcClipboardURIAnnounce(uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
     89{
     90    Provider.pfnReadDataHdr    = vboxSvcClipboardURIProviderImplReadDataHdr;
     91    Provider.pfnReadDataChunk  = vboxSvcClipboardURIProviderImplReadDataChunk;
     92    Provider.pfnReadDir        = vboxSvcClipboardURIProviderImplReadDir;
     93    Provider.pfnReadFileHdr    = vboxSvcClipboardURIProviderImplReadFileHdr;
     94    Provider.pfnReadFileData   = vboxSvcClipboardURIProviderImplReadFileData;
     95
     96    Provider.pvUser =
     97
     98    SharedClipboardURITransferSetProvider(&Provider);
     99
     100    return rc;
     101}
     102#endif
     103
     104/**
     105 * Gets an URI data header from HGCM service parameters.
    47106 *
    48107 * @returns VBox status code.
     
    51110 * @param   pDataHdr            Where to store the result.
    52111 */
    53 int VBoxSvcClipboardURIReadDataHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATAHDR pDataHdr)
     112int VBoxSvcClipboardURIGetDataHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATAHDR pDataHdr)
    54113{
    55114    int rc;
     
    97156
    98157/**
    99  * Reads an URI data header from HGCM service parameters.
     158 * Sets an URI data header to HGCM service parameters.
    100159 *
    101160 * @returns VBox status code.
    102161 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
    103162 * @param   paParms             Array of HGCM parameters.
    104  * @param   pDataHdr            Pointer to data to write the the HGCM parameters.
    105  */
    106 int VBoxSvcClipboardURIWriteDataHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATAHDR pDataHdr)
     163 * @param   pDataHdr            Pointer to data to set to the HGCM parameters.
     164 */
     165int VBoxSvcClipboardURISetDataHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATAHDR pDataHdr)
    107166{
    108167    int rc;
     
    139198
    140199/**
    141  * Reads an URI data chunk from HGCM service parameters.
     200 * Gets an URI data chunk from HGCM service parameters.
    142201 *
    143202 * @returns VBox status code.
     
    146205 * @param   pDataChunk          Where to store the result.
    147206 */
    148 int VBoxSvcClipboardURIReadDataChunk(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATACHUNK pDataChunk)
     207int VBoxSvcClipboardURIGetDataChunk(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATACHUNK pDataChunk)
    149208{
    150209    int rc;
     
    175234
    176235/**
    177  * Writes an URI data chunk to HGCM service parameters.
     236 * Sets an URI data chunk to HGCM service parameters.
    178237 *
    179238 * @returns VBox status code.
    180239 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
    181240 * @param   paParms             Array of HGCM parameters.
    182  * @param   pDataChunk          Pointer to data to write the the HGCM parameters.
    183  */
    184 int VBoxSvcClipboardURIWriteDataChunk(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATACHUNK pDataChunk)
     241 * @param   pDataChunk          Pointer to data to set to the HGCM parameters.
     242 */
     243int VBoxSvcClipboardURISetDataChunk(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDATACHUNK pDataChunk)
    185244{
    186245    int rc;
     
    206265
    207266/**
    208  * Reads an URI directory entry from HGCM service parameters.
     267 * Gets an URI directory entry from HGCM service parameters.
    209268 *
    210269 * @returns VBox status code.
     
    213272 * @param   pDirData            Where to store the result.
    214273 */
    215 int VBoxSvcClipboardURIReadDir(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDIRDATA pDirData)
     274int VBoxSvcClipboardURIGetDir(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDIRDATA pDirData)
    216275{
    217276    int rc;
     
    242301
    243302/**
    244  * Writes an URI directory entry to HGCM service parameters.
     303 * Sets an URI directory entry to HGCM service parameters.
    245304 *
    246305 * @returns VBox status code.
    247306 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
    248307 * @param   paParms             Array of HGCM parameters.
    249  * @param   pDirData            Pointer to data to write the the HGCM parameters.
    250  */
    251 int VBoxSvcClipboardURIWriteDir(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDIRDATA pDirData)
     308 * @param   pDirData            Pointer to data to set to the HGCM parameters.
     309 */
     310int VBoxSvcClipboardURISetDir(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDDIRDATA pDirData)
    252311{
    253312    int rc;
     
    277336 * @param   pFileHdr            Where to store the result.
    278337 */
    279 int VBoxSvcClipboardURIReadFileHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEHDR pFileHdr)
     338int VBoxSvcClipboardURIGetFileHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEHDR pFileHdr)
    280339{
    281340    int rc;
     
    305364
    306365/**
    307  * Writes an URI file header to HGCM service parameters.
     366 * Sets an URI file header to HGCM service parameters.
    308367 *
    309368 * @returns VBox status code.
    310369 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
    311370 * @param   paParms             Array of HGCM parameters.
    312  * @param   pFileHdr            Pointer to data to write the the HGCM parameters.
    313  */
    314 int VBoxSvcClipboardURIWriteFileHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEHDR pFileHdr)
     371 * @param   pFileHdr            Pointer to data to set to the HGCM parameters.
     372 */
     373int VBoxSvcClipboardURISetFileHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEHDR pFileHdr)
    315374{
    316375    int rc;
     
    335394
    336395/**
    337  * Reads an URI file data chunk from HGCM service parameters.
     396 * Gets an URI file data chunk from HGCM service parameters.
    338397 *
    339398 * @returns VBox status code.
     
    342401 * @param   pFileData           Where to store the result.
    343402 */
    344 int VBoxSvcClipboardURIReadFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData)
     403int VBoxSvcClipboardURIGetFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData)
    345404{
    346405    int rc;
     
    367426
    368427/**
    369  * Writes an URI file data chunk to HGCM service parameters.
     428 * Sets an URI file data chunk to HGCM service parameters.
    370429 *
    371430 * @returns VBox status code.
    372431 * @param   cParms              Number of HGCM parameters supplied in \a paParms.
    373432 * @param   paParms             Array of HGCM parameters.
    374  * @param   pFileData           Pointer to data to write the the HGCM parameters.
    375  */
    376 int VBoxSvcClipboardURIWriteFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData)
     433 * @param   pFileData           Pointer to data to set to the HGCM parameters.
     434 */
     435int VBoxSvcClipboardURISetFileData(uint32_t cParms, VBOXHGCMSVCPARM paParms[], PVBOXCLIPBOARDFILEDATA pFileData)
    377436{
    378437    int rc;
     
    438497    }
    439498
    440     if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI))
    441     {
    442         LogFunc(("No active transfers found\n"));
     499    if (!SharedClipboardURICtxGetRunningTransfers(&pClientData->URI))
     500    {
     501        LogFunc(("No running transfers found\n"));
    443502        return VERR_WRONG_ORDER;
    444503    }
     
    462521        {
    463522            LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_HDR\n"));
     523
     524            VBOXCLIPBOARDDATAHDR dataHdr;
     525            rc = VBoxSvcClipboardURISetDataHdr(cParms, paParms, &dataHdr);
    464526            break;
    465527        }
     
    472534            rc = SharedClipboardURIDataHdrInit(&dataHdr);
    473535            if (RT_SUCCESS(rc))
    474                 rc = VBoxSvcClipboardURIReadDataHdr(cParms, paParms, &dataHdr);
    475             if (RT_SUCCESS(rc))
    476             {
    477                 AssertBreakStmt(pTransfer->State.pHeader == NULL, rc = VERR_WRONG_ORDER);
    478                 pTransfer->State.pHeader = SharedClipboardURIDataHdrDup(&dataHdr);
    479                 if (pTransfer->State.pHeader)
    480                 {
    481                     LogFlowFunc(("Meta data size is %RU32\n", pTransfer->State.pHeader->cbMeta));
    482                 }
    483                 else
    484                     rc = VERR_NO_MEMORY;
    485             }
     536                rc = VBoxSvcClipboardURIGetDataHdr(cParms, paParms, &dataHdr);
     537            /*if (RT_SUCCESS(rc))
     538                rc = SharedClipboardURITransferSetDataHeader(&dataHdr);*/
    486539            break;
    487540        }
     
    500553            rc = SharedClipboardURIDataChunkInit(&dataChunk);
    501554            if (RT_SUCCESS(rc))
    502                 rc = VBoxSvcClipboardURIReadDataChunk(cParms, paParms, &dataChunk);
     555                rc = VBoxSvcClipboardURIGetDataChunk(cParms, paParms, &dataChunk);
     556    #if 0
    503557            if (RT_SUCCESS(rc))
    504558            {
    505                 AssertPtrBreakStmt(pTransfer->State.pHeader, rc = VERR_WRONG_ORDER);
    506 
    507                 rc = SharedClipboardURITransferMetaDataAdd(pTransfer, dataChunk.pvData, dataChunk.cbData);
    508                 if (   RT_SUCCESS(rc)
    509                     && SharedClipboardURITransferMetaDataIsComplete(pTransfer)) /* Meta data transfer complete? */
    510                 {
    511                     rc = SharedClipboardURITransferPrepare(pTransfer);
    512                 }
     559                VBOXCLIPBOARDTRANSFEREVENT Event = { &dataChunk, sizeof(dataChunk) };
     560                rc = SharedClipboardURITransferSendEvent(WRITE_DATA_CHUNK, &Event);
    513561            }
    514 
     562        #endif
    515563            break;
    516564        }
     
    519567        {
    520568            LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DIR\n"));
    521             if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_DIR)
    522             {
    523                 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI))
    524                 {
    525                     rc = VERR_WRONG_ORDER;
    526                     break;
    527                 }
    528 
    529                 VBOXCLIPBOARDDIRDATA data;
    530                 rc = VBoxClipboardSvcImplURIReadDir(pClientData, &data);
    531                 if (RT_SUCCESS(rc))
    532                 {
    533                     /* Note: Context ID (paParms[0]) not used yet. */
    534                     HGCMSvcSetPv (&paParms[1], data.pszPath, data.cbPath);
    535                     HGCMSvcSetU32(&paParms[2], data.cbPath);
    536                     HGCMSvcSetU32(&paParms[3], data.fMode);
    537 
    538                     SharedClipboardURIDirDataDestroy(&data);
    539                 }
    540             }
     569
     570            VBOXCLIPBOARDDIRDATA data;
     571            rc = VBoxSvcClipboardURISetDir(cParms, paParms, &data);
    541572            break;
    542573        }
     
    547578
    548579            VBOXCLIPBOARDDIRDATA dirData;
    549             rc = VBoxSvcClipboardURIReadDir(cParms, paParms, &dirData);
     580            rc = VBoxSvcClipboardURIGetDir(cParms, paParms, &dirData);
    550581            if (RT_SUCCESS(rc))
    551582            {
     
    562593                    if (RT_SUCCESS(rc))
    563594                    {
    564                         /* Add for having a proper rollback. */
    565                         int rc2 = pArea->AddDir(pszDir);
     595                        SHAREDCLIPBOARDAREAOBJ Obj = { SHAREDCLIPBOARDAREAOBJTYPE_DIR, SHAREDCLIPBOARDAREAOBJSTATE_COMPLETE };
     596                        int rc2 = pArea->AddObject(pszDir, Obj);
    566597                        AssertRC(rc2);
    567598                    }
     
    578609        {
    579610            LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_FILE_HDR\n"));
    580             if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_FILE_HDR)
    581             {
    582                 VBOXCLIPBOARDFILEHDR hdr;
    583                 rc = VBoxClipboardSvcImplURIReadFileHdr(pClientData, &hdr);
    584                 if (RT_SUCCESS(rc))
    585                 {
    586                     /* Note: Context ID (paParms[0]) not used yet. */
    587                     HGCMSvcSetPv (&paParms[1], hdr.pszFilePath, hdr.cbFilePath);
    588                     HGCMSvcSetU32(&paParms[2], hdr.cbFilePath);
    589                     HGCMSvcSetU32(&paParms[3], hdr.fFlags);
    590                     HGCMSvcSetU32(&paParms[4], hdr.fMode);
    591                     HGCMSvcSetU64(&paParms[5], hdr.cbSize);
    592 
    593                     SharedClipboardURIFileHdrDestroy(&hdr);
    594                 }
    595             }
     611
     612            VBOXCLIPBOARDFILEHDR fileHdr;
     613            rc = VBoxSvcClipboardURISetFileHdr(cParms, paParms, &fileHdr);
    596614            break;
    597615        }
     
    603621            if (!SharedClipboardURIObjCtxIsValid(SharedClipboardURITransferGetCurrentObjCtx(pTransfer)))
    604622            {
    605                 pTransfer->ObjCtx.pObj = new SharedClipboardURIObject(SharedClipboardURIObject::Type_File);
    606                 if (pTransfer->ObjCtx.pObj) /** @todo Can this throw? */
     623                pTransfer->State.ObjCtx.pObj = new SharedClipboardURIObject(SharedClipboardURIObject::Type_File);
     624                if (pTransfer->State.ObjCtx.pObj) /** @todo Can this throw? */
    607625                {
    608626                    rc = VINF_SUCCESS;
     
    618636
    619637            VBOXCLIPBOARDFILEHDR fileHdr;
    620             rc = VBoxSvcClipboardURIReadFileHdr(cParms, paParms, &fileHdr);
     638            rc = VBoxSvcClipboardURIGetFileHdr(cParms, paParms, &fileHdr);
    621639            if (RT_SUCCESS(rc))
    622640            {
     
    659677                                         pObj->GetDestPathAbs().c_str()));
    660678
    661                                 SharedClipboardURIObjCtxDestroy(&pTransfer->ObjCtx);
     679                                SharedClipboardURIObjCtxDestroy(&pTransfer->State.ObjCtx);
    662680                            }
    663681
    664                             /* Add for having a proper rollback. */
    665                             int rc2 = pArea->AddFile(pszPathAbs);
     682                            SHAREDCLIPBOARDAREAOBJ Obj = { SHAREDCLIPBOARDAREAOBJTYPE_FILE, SHAREDCLIPBOARDAREAOBJSTATE_NONE };
     683                            int rc2 = pArea->AddObject(pszPathAbs, Obj);
    666684                            AssertRC(rc2);
    667685                        }
     
    677695        {
    678696            LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_READ_FILE_DATA\n"));
    679             if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_READ_FILE_DATA)
    680             {
    681                 if (!SharedClipboardURICtxGetActiveTransfers(&pClientData->URI))
    682                 {
    683                     rc = VERR_WRONG_ORDER;
    684                     break;
    685                 }
    686 
    687                 VBOXCLIPBOARDFILEDATA data;
    688                 rc = VBoxClipboardSvcImplURIReadFileData(pClientData, &data);
    689                 if (RT_SUCCESS(rc))
    690                 {
    691                     /* Note: Context ID (paParms[0]) not used yet. */
    692                     HGCMSvcSetPv (&paParms[1], data.pvData, data.cbData);
    693                     HGCMSvcSetU32(&paParms[2], data.cbData);
    694                     HGCMSvcSetPv (&paParms[3], data.pvChecksum, data.cbChecksum);
    695                     HGCMSvcSetU32(&paParms[4], data.cbChecksum);
    696 
    697                     SharedClipboardURIFileDataDestroy(&data);
    698                 }
    699             }
     697
     698            VBOXCLIPBOARDFILEDATA fileData;
     699            rc = VBoxSvcClipboardURISetFileData(cParms, paParms, &fileData);
    700700            break;
    701701        }
     
    705705            LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_WRITE_FILE_DATA\n"));
    706706
    707             if (!SharedClipboardURIObjCtxIsValid(&pTransfer->ObjCtx))
     707            if (!SharedClipboardURIObjCtxIsValid(&pTransfer->State.ObjCtx))
    708708            {
    709709                rc = VERR_WRONG_ORDER;
     
    712712
    713713            VBOXCLIPBOARDFILEDATA fileData;
    714             rc = VBoxSvcClipboardURIReadFileData(cParms, paParms, &fileData);
     714            rc = VBoxSvcClipboardURIGetFileData(cParms, paParms, &fileData);
    715715            if (RT_SUCCESS(rc))
    716716            {
     
    734734                    if (   pObj->IsComplete()
    735735                        || RT_FAILURE(rc))
    736                         SharedClipboardURIObjCtxDestroy(&pTransfer->ObjCtx);
     736                        SharedClipboardURIObjCtxDestroy(&pTransfer->State.ObjCtx);
    737737                }
    738738                else
     
    771771            writeParms.u.HostService.paParms = paParms;
    772772
    773             rc = pTransfer->pProvider->OnWrite(&writeParms);
     773            //rc = pTransfer->pProvider->OnWrite(&writeParms);
    774774        }
    775775    }
     
    919919 * @param   pClientState        Client state to use.
    920920 * @param   pTransfer           URI transfer to attach a clipboard area to.
    921  */
    922 int vboxSvcClipboardURIAreaAttach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer)
     921 * @param   uID                 ID of clipboard area to to attach to. Specify 0 to attach to the most recent one.
     922 */
     923int vboxSvcClipboardURIAreaAttach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer,
     924                                  SHAREDCLIPBOARDAREAID uID)
    923925{
    924926    LogFlowFuncEnter();
     
    938940        RT_ZERO(parms);
    939941
    940         parms.uID = 0; /* 0 means most recent clipboard area. */
     942        parms.uID = uID; /* 0 means most recent clipboard area. */
    941943
    942944        /* The client now needs to attach to the most recent clipboard area
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.h

    r79174 r79347  
    2222#endif
    2323
     24//int vboxSvcClipboardURIAnnounce(uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
     25
    2426int vboxSvcClipboardURIHandler(uint32_t u32ClientID, void *pvClient, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[], uint64_t tsArrival, bool *pfAsync);
    2527int vboxSvcClipboardURIHostHandler(uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
     
    2729int vboxSvcClipboardURIAreaRegister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer);
    2830int vboxSvcClipboardURIAreaUnregister(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer);
    29 int vboxSvcClipboardURIAreaAttach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer);
     31int vboxSvcClipboardURIAreaAttach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer, SHAREDCLIPBOARDAREAID uID);
    3032int vboxSvcClipboardURIAreaDetach(PVBOXCLIPBOARDCLIENTSTATE pClientState, PSHAREDCLIPBOARDURITRANSFER pTransfer);
    31 
    32 DECLCALLBACK(int) vboxClipboardSvcReadDataHdrCallback(PSHAREDCLIPBOARDPROVIDERCALLBACKDATA pData);
    3333
    3434#endif /* !VBOX_INCLUDED_SRC_SharedClipboard_VBoxSharedClipboardSvc_uri_h */
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-utils.cpp

    r79267 r79347  
    158158    bool fHandled = false;
    159159
    160 #if 0
     160    /* For now we only support one transfer at a time. */
    161161    PSHAREDCLIPBOARDURITRANSFER pTransfer = SharedClipboardURICtxGetTransfer(&pClientData->URI, 0 /* Index */);
    162     if (pTransfer)
    163     {
    164         if (   !s_fReqHdr
    165             && !pTransfer->State.pHeader)
    166         {
    167             LogFlowFunc(("VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA\n"));
    168 
    169             HGCMSvcSetU32(&paParms[0], VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA);
    170             HGCMSvcSetU32(&paParms[1], VBOX_SHARED_CLIPBOARD_FMT_URI_LIST /* fFormats */);
     162    if (!pTransfer)
     163        return fHandled;
     164
     165#if 1
     166    int rc = 0;
     167#else
     168    /* Sanity. */
     169    Assert(pTransfer->State.enmDir == SHAREDCLIPBOARDURITRANSFERDIR_READ);
     170
     171    int rc;
     172
     173    /* Note: Message priority / order is taken into account here. */
     174    if (pTransfer->State.pHeader)
     175    {
     176        LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_HDR\n"));
     177        rc = VBoxSvcClipboardURIWriteDataHdr(cParms, paParms, pTransfer->State.pHeader);
     178        if (RT_SUCCESS(rc))
     179        {
     180            /* We're done witht the data header, destroy it. */
     181            SharedClipboardURIDataHdrFree(pTransfer->State.pHeader);
     182            pTransfer->State.pHeader = NULL;
     183
    171184            fHandled = true;
    172 
    173             s_fReqHdr = true;
    174         }
    175         else
    176         {
    177         }
    178     }
     185        }
     186    }
     187    else if (pTransfer->State.pMeta)
     188    {
     189        LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_DATA_CHUNK\n"));
     190
     191        uint32_t cbBuf = _64K;
     192        uint8_t  pvBuf[_64K]; /** @todo Improve */
     193
     194        uint32_t cbRead;
     195        rc = SharedClipboardMetaDataRead(pTransfer->State.pMeta, pvBuf, cbBuf, &cbRead);
     196        if (RT_SUCCESS(rc))
     197        {
     198            Assert(cbRead <= cbBuf);
     199
     200            VBOXCLIPBOARDDATACHUNK dataChunk;
     201            RT_ZERO(dataChunk);
     202            dataChunk.pvData = pvBuf;
     203            dataChunk.cbData = cbRead;
     204
     205            rc = VBoxSvcClipboardURIWriteDataChunk(cParms, paParms, &dataChunk);
     206        }
     207
     208        /* Has all meta data been read? */
     209        if (RT_SUCCESS(rc))
     210        {
     211            if (SharedClipboardMetaDataGetUsed(pTransfer->State.pMeta) == 0)
     212            {
     213                SharedClipboardMetaDataFree(pTransfer->State.pMeta);
     214                pTransfer->State.pMeta = NULL;
     215            }
     216
     217            fHandled = true;
     218        }
     219    }
     220    else if (pTransfer->pURIList)
     221    {
     222        PSHAREDCLIPBOARDCLIENTURIOBJCTX pObjCtx = SharedClipboardURITransferGetCurrentObjCtx(pTransfer);
     223        if (!SharedClipboardURIObjCtxIsValid(pObjCtx))
     224        {
     225            if (!pTransfer->pURIList->IsEmpty())
     226                pObjCtx->pObj = pTransfer->pURIList->First();
     227        }
     228
     229        if (   pObjCtx
     230            && pObjCtx->pObj)
     231        {
     232            switch (pObjCtx->pObj->GetType())
     233            {
     234                case SharedClipboardURIObject::Type_Directory:
     235                {
     236                    rc = VBoxSvcClipboardURIWriteDir(cParms, paParms, &dataChunk);
     237                    break;
     238                }
     239            }
     240        }
     241
     242        if (0)
     243        {
     244            delete pTransfer->pURIList;
     245            pTransfer->pURIList = NULL;
     246        }
     247
     248        fHandled = true;
     249    }
     250    else
     251        rc = VERR_WRONG_ORDER;
    179252#endif
    180253
    181     LogFlowFunc(("fHandled=%RTbool\n", fHandled));
     254    LogFlowFunc(("rc=%Rrc, fHandled=%RTbool\n", rc, fHandled));
    182255    return fHandled;
    183256}
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-win.cpp

    r79299 r79347  
    5656*   Internal Functions                                                                                                           *
    5757*********************************************************************************************************************************/
    58 static int vboxClipboardWinSyncInternal(PVBOXCLIPBOARDCONTEXT pCtx);
     58static int vboxClipboardSvcWinSyncInternal(PVBOXCLIPBOARDCONTEXT pCtx);
    5959
    6060struct _VBOXCLIPBOARDCONTEXT
     
    131131 *                              Specify 0 if no waiting is required.
    132132 */
    133 static int vboxClipboardWinRequestData(PVBOXCLIPBOARDCONTEXT pCtx, VBOXCLIPBOARDFORMAT fFormat,
    134                                        RTMSINTERVAL uTimeoutMs)
    135 {
    136     Assert(pCtx->pClientData);
     133static int vboxClipboardSvcWinRequestData(PVBOXCLIPBOARDCONTEXT pCtx, VBOXCLIPBOARDFORMAT fFormat,
     134                                          RTMSINTERVAL uTimeoutMs)
     135{
     136    AssertPtr(pCtx->pClientData);
    137137    Assert(pCtx->hRenderEvent);
    138138    Assert(pCtx->pClientData->State.data.pv == NULL && pCtx->pClientData->State.data.cb == 0 && pCtx->pClientData->State.data.u32Format == 0);
     
    151151}
    152152
    153 static LRESULT CALLBACK vboxClipboardWinWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
     153static LRESULT CALLBACK vboxClipboardSvcWinWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    154154{
    155155    LRESULT lresultRc = 0;
     
    169169
    170170                /* Clipboard was updated by another application, retrieve formats and report back. */
    171                 int rc = vboxClipboardWinSyncInternal(pCtx);
     171                int rc = vboxClipboardSvcWinSyncInternal(pCtx);
    172172                AssertRC(rc);
     173
     174                vboxSvcClipboardSetSource(pCtx->pClientData, SHAREDCLIPBOARDSOURCE_LOCAL);
    173175            }
    174176        } break;
     
    187189            {
    188190                /* Clipboard was updated by another application, retrieve formats and report back. */
    189                 int vboxrc = vboxClipboardWinSyncInternal(pCtx);
    190                 AssertRC(vboxrc);
     191                int rc = vboxClipboardSvcWinSyncInternal(pCtx);
     192                if (RT_SUCCESS(rc))
     193                    vboxSvcClipboardSetSource(pCtx->pClientData, SHAREDCLIPBOARDSOURCE_LOCAL);
    191194            }
    192195
     
    221224            else
    222225            {
    223                 int rc = vboxClipboardWinRequestData(pCtx, fFormat, 30 * 1000 /* 30s timeout */);
     226                int rc = vboxClipboardSvcWinRequestData(pCtx, fFormat, 30 * 1000 /* 30s timeout */);
    224227
    225228                LogFunc(("vboxClipboardReadDataFromClient rc = %Rrc, pv %p, cb %d, u32Format %d\n",
     
    328331                        if (pTransfer)
    329332                        {
    330                             rc = VBoxClipboardWinURIAnnounce(pWinCtx, &pCtx->pClientData->URI, pTransfer);
     333                            rc = VBoxClipboardWinURITransferCreate(pWinCtx, pTransfer);
    331334
    332335                            /* Note: The actual requesting + retrieving of data will be done in the IDataObject implementation
     
    336339                            AssertFailedStmt(rc = VERR_NOT_FOUND);
    337340
    338                         /* Note: VBoxClipboardWinURIAnnounce() takes care of closing the clipboard. */
     341                        /* Note: VBoxClipboardWinURITransferCreate() takes care of closing the clipboard. */
    339342                    }
    340343                    else
     
    376379}
    377380
    378 DECLCALLBACK(int) vboxClipboardWinThread(RTTHREAD hThreadSelf, void *pvUser)
     381DECLCALLBACK(int) vboxClipboardSvcWinThread(RTTHREAD hThreadSelf, void *pvUser)
    379382{
    380383    RT_NOREF(hThreadSelf, pvUser);
     
    395398
    396399    wc.style         = CS_NOCLOSE;
    397     wc.lpfnWndProc   = vboxClipboardWinWndProc;
     400    wc.lpfnWndProc   = vboxClipboardSvcWinWndProc;
    398401    wc.hInstance     = hInstance;
    399402    wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
     
    485488 * @param   pCtx                Clipboard context to synchronize.
    486489 */
    487 static int vboxClipboardWinSyncInternal(PVBOXCLIPBOARDCONTEXT pCtx)
     490static int vboxClipboardSvcWinSyncInternal(PVBOXCLIPBOARDCONTEXT pCtx)
    488491{
    489492    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
     
    521524    if (RT_SUCCESS(rc))
    522525    {
    523         rc = RTThreadCreate(&g_ctx.hThread, vboxClipboardWinThread, NULL, _64K /* Stack size */,
     526        rc = RTThreadCreate(&g_ctx.hThread, vboxClipboardSvcWinThread, NULL, _64K /* Stack size */,
    524527                            RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "SHCLIP");
    525528    }
     
    577580{
    578581    /* Sync the host clipboard content with the client. */
    579     return vboxClipboardWinSyncInternal(pClientData->State.pCtx);
     582    return vboxClipboardSvcWinSyncInternal(pClientData->State.pCtx);
    580583}
    581584
     
    767770
    768771#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
    769 int VBoxClipboardSvcImplURIReadDir(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData)
    770 {
    771     RT_NOREF(pClientData, pDirData);
     772DECLCALLBACK(void) vboxClipboardSvcWinURITransferPrepareCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData)
     773{
     774    LogFlowFuncEnter();
     775
     776    AssertPtrReturnVoid(pData);
     777
     778    PVBOXCLIPBOARDCLIENTDATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pData->pvUser;
     779    AssertPtrReturnVoid(pClientData);
     780
     781    /* Tell the guest that it can start sending URI data. */
     782    int rc2 = vboxSvcClipboardReportMsg(pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA,
     783                                        VBOX_SHARED_CLIPBOARD_FMT_URI_LIST);
     784    AssertRC(rc2);
     785}
     786
     787DECLCALLBACK(void) vboxClipboardSvcWinURIDataCompleteCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData)
     788{
     789    LogFlowFuncEnter();
     790
     791    AssertPtrReturnVoid(pData);
     792
     793    PSHAREDCLIPBOARDURITRANSFER pTransfer = pData->pTransfer;
     794    AssertPtrReturnVoid(pTransfer);
     795
     796    SharedClipboardWinURITransferCtx *pTransferCtx = (SharedClipboardWinURITransferCtx *)pTransfer->pvUser;
     797    AssertPtrReturnVoid(pTransferCtx);
     798
     799    /* Notify the Windows implementation's data object that the meta data has been read successfully. */
     800    if (pTransferCtx->pDataObj)
     801        pTransferCtx->pDataObj->OnMetaDataComplete(pTransfer);
     802}
     803
     804int VBoxClipboardSvcImplURITransferCreate(PVBOXCLIPBOARDCLIENTDATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer)
     805{
     806    LogFlowFuncEnter();
     807
     808    /* Register needed callbacks so that we can wait for the meta data to arrive here. */
     809    SHAREDCLIPBOARDURITRANSFERCALLBACKS Callbacks;
     810    RT_ZERO(Callbacks);
     811
     812    Callbacks.pvUser              = pClientData;
     813    Callbacks.pfnTransferPrepare  = vboxClipboardSvcWinURITransferPrepareCallback;
     814
     815    SharedClipboardURITransferSetCallbacks(pTransfer, &Callbacks);
     816
     817    return VINF_SUCCESS;
     818}
     819
     820int VBoxClipboardSvcImplURITransferDestroy(PVBOXCLIPBOARDCLIENTDATA pClientData, PSHAREDCLIPBOARDURITRANSFER pTransfer)
     821{
     822    LogFlowFuncEnter();
     823
     824    VBoxClipboardWinURITransferDestroy(&pClientData->State.pCtx->Win, pTransfer);
     825
     826    return VINF_SUCCESS;
     827}
     828
     829int VBoxClipboardSvcImplURIReadDataHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDDATAHDR *ppDataHdr)
     830{
     831    RT_NOREF(ppDataHdr);
     832
     833    LogFlowFuncEnter();
     834
     835    PVBOXCLIPBOARDCLIENTDATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pCtx->pvUser;
     836    AssertPtr(pClientData);
     837
     838
    772839    return VERR_NOT_IMPLEMENTED;
    773840}
    774841
    775 int VBoxClipboardSvcImplURIWriteDir(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDDIRDATA pDirData)
    776 {
    777     RT_NOREF(pClientData, pDirData);
     842int VBoxClipboardSvcImplURIWriteDataHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDDATAHDR pDataHdr)
     843{
     844    RT_NOREF(pCtx, pDataHdr);
    778845    return VERR_NOT_IMPLEMENTED;
    779846}
    780847
    781 int VBoxClipboardSvcImplURIReadFileHdr(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr)
    782 {
    783     RT_NOREF(pClientData, pFileHdr);
     848int VBoxClipboardSvcImplURIReadDataChunk(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDDATAHDR pDataHdr,
     849                                         void *pvChunk, uint32_t cbChunk, uint32_t fFlags, uint32_t *pcbRead)
     850{
     851    RT_NOREF(pCtx, pDataHdr, pvChunk, cbChunk, fFlags, pcbRead);
    784852    return VERR_NOT_IMPLEMENTED;
    785853}
    786854
    787 int VBoxClipboardSvcImplURIWriteFileHdr(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDFILEHDR pFileHdr)
    788 {
    789     RT_NOREF(pClientData, pFileHdr);
     855int VBoxClipboardSvcImplURIWriteDataChunk(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDDATAHDR pDataHdr,
     856                                          const void *pvChunk, uint32_t cbChunk, uint32_t fFlags, uint32_t *pcbWritten)
     857{
     858    RT_NOREF(pCtx, pDataHdr, pvChunk, cbChunk, fFlags, pcbWritten);
    790859    return VERR_NOT_IMPLEMENTED;
    791860}
    792861
    793 int VBoxClipboardSvcImplURIReadFileData(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData)
    794 {
    795     RT_NOREF(pClientData, pFileData);
     862int VBoxClipboardSvcImplURIReadDir(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDDIRDATA *ppDirData)
     863{
     864    RT_NOREF(pCtx, ppDirData);
    796865    return VERR_NOT_IMPLEMENTED;
    797866}
    798867
    799 int VBoxClipboardSvcImplURIWriteFileData(PVBOXCLIPBOARDCLIENTDATA pClientData, PVBOXCLIPBOARDFILEDATA pFileData)
    800 {
    801     RT_NOREF(pClientData, pFileData);
     868int VBoxClipboardSvcImplURIWriteDir(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDDIRDATA pDirData)
     869{
     870    RT_NOREF(pCtx, pDirData);
    802871    return VERR_NOT_IMPLEMENTED;
    803872}
     873
     874int VBoxClipboardSvcImplURIReadFileHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx, PVBOXCLIPBOARDFILEHDR *ppFileHdr)
     875{
     876    RT_NOREF(pCtx, ppFileHdr);
     877    return VERR_NOT_IMPLEMENTED;
     878}
     879
     880int VBoxClipboardSvcImplURIWriteFileHdr(PSHAREDCLIPBOARDPROVIDERCTX pCtx, const PVBOXCLIPBOARDFILEHDR pFileHdr)
     881{
     882    RT_NOREF(pCtx, pFileHdr);
     883    return VERR_NOT_IMPLEMENTED;
     884}
     885
     886int VBoxClipboardSvcImplURIReadFileData(PSHAREDCLIPBOARDPROVIDERCTX pCtx, void *pvData, uint32_t cbData, uint32_t fFlags,
     887                                        uint32_t *pcbRead)
     888{
     889    RT_NOREF(pCtx, pvData, cbData, fFlags, pcbRead);
     890    return VERR_NOT_IMPLEMENTED;
     891}
     892
     893int VBoxClipboardSvcImplURIWriteFileData(PSHAREDCLIPBOARDPROVIDERCTX pCtx, void *pvData, uint32_t cbData, uint32_t fFlags,
     894                                         uint32_t *pcbWritten)
     895{
     896    RT_NOREF(pCtx, pvData, cbData, fFlags, pcbWritten);
     897    return VERR_NOT_IMPLEMENTED;
     898}
    804899#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
    805900
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp

    r79299 r79347  
    259259static bool vboxSvcClipboardReturnMsg(PVBOXCLIPBOARDCLIENTDATA pClientData, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
    260260{
    261     RT_NOREF(cParms);
     261    /** @todo r=andy The client at the moment supplies two parameters, which we can
     262     *        use by filling in the next message type sent by the host service.
     263     *        Make this more flexible later, as I don't want to break the existing protocol right now. */
     264    if (cParms < 2)
     265    {
     266        AssertFailed(); /* Should never happen. */
     267        return false;
     268    }
    262269
    263270    /* Message priority is taken into account. */
     
    385392            {
    386393                /* The client waits for a response. */
    387                 bool fMessageReturned = vboxSvcClipboardReturnMsg(pClientData, 0 /* cParms, fix */,
     394                bool fMessageReturned = vboxSvcClipboardReturnMsg(pClientData,
     395                                                                  pClientData->State.async.cParms,
    388396                                                                  pClientData->State.async.paParms);
    389397
     
    410418        else
    411419            VBoxSvcClipboardUnlock();
     420    }
     421
     422    LogFlowFuncLeaveRC(rc);
     423    return rc;
     424}
     425
     426
     427int vboxSvcClipboardSetSource(PVBOXCLIPBOARDCLIENTDATA pClientData, SHAREDCLIPBOARDSOURCE enmSource)
     428{
     429    if (!pClientData) /* If no client connected (anymore), bail out. */
     430        return VINF_SUCCESS;
     431
     432    int rc = VINF_SUCCESS;
     433
     434    if (VBoxSvcClipboardLock())
     435    {
     436        pClientData->State.enmSource = enmSource;
     437
     438        LogFlowFunc(("Source of client %RU32 is now %RU32\n", pClientData->State.u32ClientID, pClientData->State.enmSource));
     439
     440        VBoxSvcClipboardUnlock();
    412441    }
    413442
     
    585614                        pClientData->State.fAsync           = true;
    586615                        pClientData->State.async.callHandle = callHandle;
     616                        pClientData->State.async.cParms     = cParms;
    587617                        pClientData->State.async.paParms    = paParms;
    588618                    }
     
    623653                    else
    624654                    {
     655                        rc = vboxSvcClipboardSetSource(pClientData, SHAREDCLIPBOARDSOURCE_REMOTE);
     656
    625657#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
    626658                        if (   RT_SUCCESS(rc)
    627659                            && (u32Formats & VBOX_SHARED_CLIPBOARD_FMT_URI_LIST))
    628660                        {
    629                             if (!SharedClipboardURICtxMaximumTransfersReached(&pClientData->URI))
     661                            if (!SharedClipboardURICtxTransfersMaximumReached(&pClientData->URI))
    630662                            {
     663                                SharedClipboardURICtxTransfersCleanup(&pClientData->URI);
     664
    631665                                PSHAREDCLIPBOARDURITRANSFER pTransfer;
    632                                 rc = SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR_READ, &pTransfer);
     666                                rc = SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR_READ,
     667                                                                      SHAREDCLIPBOARDSOURCE_REMOTE, &pTransfer);
    633668                                if (RT_SUCCESS(rc))
    634669                                {
     
    638673                                        SHAREDCLIPBOARDPROVIDERCREATIONCTX creationCtx;
    639674                                        RT_ZERO(creationCtx);
    640                                         creationCtx.enmSource = SHAREDCLIPBOARDURIPROVIDERSOURCE_HOSTSERVICE;
    641                                         creationCtx.enmDir    = SHAREDCLIPBOARDURITRANSFERDIR_READ;
     675
     676                                        creationCtx.enmSource = pClientData->State.enmSource;
     677
     678                                        RT_ZERO(creationCtx.Interface);
     679                                        creationCtx.Interface.pfnReadDataHdr    = VBoxClipboardSvcImplURIReadDataHdr;
     680                                        creationCtx.Interface.pfnReadDataChunk  = VBoxClipboardSvcImplURIReadDataChunk;
     681                                        creationCtx.Interface.pfnReadDirectory  = VBoxClipboardSvcImplURIReadDir;
     682                                        creationCtx.Interface.pfnReadFileHdr    = VBoxClipboardSvcImplURIReadFileHdr;
     683                                        creationCtx.Interface.pfnReadFileData   = VBoxClipboardSvcImplURIReadFileData;
     684
     685                                        creationCtx.Interface.pfnWriteDataHdr    = VBoxClipboardSvcImplURIWriteDataHdr;
     686                                        creationCtx.Interface.pfnWriteDataChunk  = VBoxClipboardSvcImplURIWriteDataChunk;
     687                                        creationCtx.Interface.pfnWriteDirectory  = VBoxClipboardSvcImplURIWriteDir;
     688                                        creationCtx.Interface.pfnWriteFileHdr    = VBoxClipboardSvcImplURIWriteFileHdr;
     689                                        creationCtx.Interface.pfnWriteFileData   = VBoxClipboardSvcImplURIWriteFileData;
     690
     691                                        creationCtx.pvUser = pClientData;
     692
    642693                                        creationCtx.u.HostService.pArea = pTransfer->pArea;
    643694
     
    645696                                        if (RT_SUCCESS(rc))
    646697                                            rc = SharedClipboardURICtxTransferAdd(&pClientData->URI, pTransfer);
     698                                    }
     699
     700                                    if (RT_SUCCESS(rc))
     701                                    {
     702                                        rc = VBoxClipboardSvcImplURITransferCreate(pClientData, pTransfer);
     703                                    }
     704                                    else
     705                                    {
     706                                        VBoxClipboardSvcImplURITransferDestroy(pClientData, pTransfer);
     707                                        SharedClipboardURITransferDestroy(pTransfer);
    647708                                    }
    648709                                }
     
    650711                            else
    651712                                rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED;
     713
     714                            LogFunc(("VBOX_SHARED_CLIPBOARD_FMT_URI_LIST: %Rrc\n", rc));
     715
     716                            if (RT_FAILURE(rc))
     717                                LogRel(("Shared Clipboard: Initializing URI guest to host read transfer failed with %Rrc\n", rc));
    652718                        }
    653719#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
     
    689755            else
    690756            {
     757                if (   vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_HOST_TO_GUEST
     758                    && vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL)
     759                {
     760                    rc = VERR_ACCESS_DENIED;
     761                    break;
     762                }
     763
    691764                uint32_t u32Format;
    692                 void     *pv;
    693                 uint32_t cb;
    694 
    695765                rc = HGCMSvcGetU32(&paParms[0], &u32Format);
    696766                if (RT_SUCCESS(rc))
    697767                {
    698                     rc = VBoxHGCMParmPtrGet(&paParms[1], &pv, &cb);
    699 
    700                     if (RT_SUCCESS (rc))
     768#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     769                    if (u32Format == VBOX_SHARED_CLIPBOARD_FMT_URI_LIST)
    701770                    {
    702                         if (   vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_HOST_TO_GUEST
    703                             && vboxSvcClipboardGetMode() != VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL)
     771                        if (!SharedClipboardURICtxTransfersMaximumReached(&pClientData->URI))
    704772                        {
    705                             rc = VERR_NOT_SUPPORTED;
    706                             break;
    707                         }
    708 
    709                         uint32_t cbActual = 0;
    710 
    711                         if (g_pfnExtension)
    712                         {
    713                             VBOXCLIPBOARDEXTPARMS parms;
    714                             RT_ZERO(parms);
    715 
    716                             parms.u32Format = u32Format;
    717                             parms.u.pvData  = pv;
    718                             parms.cbData    = cb;
    719 
    720                             g_fReadingData = true;
    721 
    722                             rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_DATA_READ, &parms, sizeof (parms));
    723                             LogFlowFunc(("DATA: g_fDelayedAnnouncement = %d, g_u32DelayedFormats = 0x%x\n", g_fDelayedAnnouncement, g_u32DelayedFormats));
    724 
    725                             if (g_fDelayedAnnouncement)
     773                            SharedClipboardURICtxTransfersCleanup(&pClientData->URI);
     774
     775                            PSHAREDCLIPBOARDURITRANSFER pTransfer;
     776                            rc = SharedClipboardURITransferCreate(SHAREDCLIPBOARDURITRANSFERDIR_WRITE,
     777                                                                  pClientData->State.enmSource,
     778                                                                  &pTransfer);
     779                            if (RT_SUCCESS(rc))
    726780                            {
    727                                 vboxSvcClipboardReportMsg(g_pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS, g_u32DelayedFormats);
    728                                 g_fDelayedAnnouncement = false;
    729                                 g_u32DelayedFormats = 0;
    730                             }
    731 
    732                             g_fReadingData = false;
    733 
    734                             if (RT_SUCCESS (rc))
    735                             {
    736                                 cbActual = parms.cbData;
     781                                /* Attach to the most recent clipboard area. */
     782                                rc = vboxSvcClipboardURIAreaAttach(&pClientData->State, pTransfer, 0 /* Area ID */);
     783                                if (RT_SUCCESS(rc))
     784                                {
     785                                    SHAREDCLIPBOARDPROVIDERCREATIONCTX creationCtx;
     786                                    RT_ZERO(creationCtx);
     787
     788                                    creationCtx.enmSource = SharedClipboardURITransferGetSource(pTransfer);
     789
     790                                    RT_ZERO(creationCtx.Interface);
     791
     792                                    creationCtx.Interface.pfnReadDataHdr    = VBoxClipboardSvcImplURIReadDataHdr;
     793                                    creationCtx.Interface.pfnReadDataChunk  = VBoxClipboardSvcImplURIReadDataChunk;
     794                                    creationCtx.Interface.pfnReadDirectory  = VBoxClipboardSvcImplURIReadDir;
     795                                    creationCtx.Interface.pfnReadFileHdr    = VBoxClipboardSvcImplURIReadFileHdr;
     796                                    creationCtx.Interface.pfnReadFileData   = VBoxClipboardSvcImplURIReadFileData;
     797
     798                                    creationCtx.Interface.pfnWriteDataHdr    = VBoxClipboardSvcImplURIWriteDataHdr;
     799                                    creationCtx.Interface.pfnWriteDataChunk  = VBoxClipboardSvcImplURIWriteDataChunk;
     800                                    creationCtx.Interface.pfnWriteDirectory  = VBoxClipboardSvcImplURIWriteDir;
     801                                    creationCtx.Interface.pfnWriteFileHdr    = VBoxClipboardSvcImplURIWriteFileHdr;
     802                                    creationCtx.Interface.pfnWriteFileData   = VBoxClipboardSvcImplURIWriteFileData;
     803
     804                                    creationCtx.pvUser = pClientData;
     805
     806                                    creationCtx.u.HostService.pArea = pTransfer->pArea;
     807
     808                                    rc = SharedClipboardURITransferProviderCreate(pTransfer, &creationCtx);
     809                                    if (RT_SUCCESS(rc))
     810                                        rc = SharedClipboardURICtxTransferAdd(&pClientData->URI, pTransfer);
     811                                }
     812
     813                                if (RT_SUCCESS(rc))
     814                                {
     815                                    rc = VBoxClipboardSvcImplURITransferCreate(pClientData, pTransfer);
     816                                }
     817                                else
     818                                {
     819                                    VBoxClipboardSvcImplURITransferDestroy(pClientData, pTransfer);
     820                                    SharedClipboardURITransferDestroy(pTransfer);
     821                                }
    737822                            }
    738823                        }
    739 
    740                         /* Release any other pending read, as we only
    741                          * support one pending read at one time. */
    742                         rc = vboxSvcClipboardCompleteReadData(pClientData, VERR_NO_DATA, 0);
     824                        else
     825                            rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED;
     826
     827                        if (RT_FAILURE(rc))
     828                            LogRel(("Shared Clipboard: Initializing URI host to guest write transfer failed with %Rrc\n", rc));
     829                    }
     830                    else
     831                    {
     832#endif
     833                        void    *pv;
     834                        uint32_t cb;
     835                        rc = VBoxHGCMParmPtrGet(&paParms[1], &pv, &cb);
    743836                        if (RT_SUCCESS(rc))
    744                             rc = VBoxClipboardSvcImplReadData(pClientData, u32Format, pv, cb, &cbActual);
    745 
    746                         /* Remember our read request until it is completed.
    747                          * See the protocol description above for more
    748                          * information. */
    749                         if (rc == VINF_HGCM_ASYNC_EXECUTE)
    750837                        {
    751                             if (VBoxSvcClipboardLock())
     838                            uint32_t cbActual = 0;
     839
     840                            if (g_pfnExtension)
    752841                            {
    753                                 pClientData->State.asyncRead.callHandle = callHandle;
    754                                 pClientData->State.asyncRead.paParms    = paParms;
    755                                 pClientData->State.fReadPending         = true;
    756                                 fAsynchronousProcessing = true;
    757                                 VBoxSvcClipboardUnlock();
     842                                VBOXCLIPBOARDEXTPARMS parms;
     843                                RT_ZERO(parms);
     844
     845                                parms.u32Format = u32Format;
     846                                parms.u.pvData  = pv;
     847                                parms.cbData    = cb;
     848
     849                                g_fReadingData = true;
     850
     851                                rc = g_pfnExtension(g_pvExtension, VBOX_CLIPBOARD_EXT_FN_DATA_READ, &parms, sizeof (parms));
     852                                LogFlowFunc(("DATA: g_fDelayedAnnouncement = %d, g_u32DelayedFormats = 0x%x\n", g_fDelayedAnnouncement, g_u32DelayedFormats));
     853
     854                                if (g_fDelayedAnnouncement)
     855                                {
     856                                    vboxSvcClipboardReportMsg(g_pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_REPORT_FORMATS, g_u32DelayedFormats);
     857                                    g_fDelayedAnnouncement = false;
     858                                    g_u32DelayedFormats = 0;
     859                                }
     860
     861                                g_fReadingData = false;
     862
     863                                if (RT_SUCCESS (rc))
     864                                {
     865                                    cbActual = parms.cbData;
     866                                }
    758867                            }
    759                             else
    760                                 rc = VERR_NOT_SUPPORTED;
     868
     869                            /* Release any other pending read, as we only
     870                             * support one pending read at one time. */
     871                            rc = vboxSvcClipboardCompleteReadData(pClientData, VERR_NO_DATA, 0);
     872                            if (RT_SUCCESS(rc))
     873                                rc = VBoxClipboardSvcImplReadData(pClientData, u32Format, pv, cb, &cbActual);
     874
     875                            /* Remember our read request until it is completed.
     876                             * See the protocol description above for more
     877                             * information. */
     878                            if (rc == VINF_HGCM_ASYNC_EXECUTE)
     879                            {
     880                                if (VBoxSvcClipboardLock())
     881                                {
     882                                    pClientData->State.asyncRead.callHandle = callHandle;
     883                                    pClientData->State.asyncRead.cParms     = cParms;
     884                                    pClientData->State.asyncRead.paParms    = paParms;
     885                                    pClientData->State.fReadPending         = true;
     886                                    fAsynchronousProcessing = true;
     887                                    VBoxSvcClipboardUnlock();
     888                                }
     889                                else
     890                                    rc = VERR_NOT_SUPPORTED;
     891                            }
     892                            else if (RT_SUCCESS (rc))
     893                            {
     894                                HGCMSvcSetU32(&paParms[2], cbActual);
     895                            }
    761896                        }
    762                         else if (RT_SUCCESS (rc))
    763                         {
    764                             HGCMSvcSetU32(&paParms[2], cbActual);
    765                         }
     897#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
    766898                    }
     899#endif
    767900                }
    768901            }
     
    9861119    return rc;
    9871120}
    988 
    989 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
    990 DECLCALLBACK(int) vboxClipboardSvcReadDataHdrCallback(PSHAREDCLIPBOARDPROVIDERCALLBACKDATA pData)
    991 {
    992     LogFlowFuncEnter();
    993 
    994     PVBOXCLIPBOARDCLIENTDATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pData->pvUser;
    995 
    996     int rc = vboxSvcClipboardReportMsg(pClientData,
    997                                        VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_READ_DATA_HDR, VBOX_SHARED_CLIPBOARD_FMT_URI_LIST);
    998     LogFlowFuncLeaveRC(rc);
    999     return rc;
    1000 }
    1001 #endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
    10021121
    10031122#ifndef UNIT_TEST
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