VirtualBox

Changeset 100394 in vbox


Ignore:
Timestamp:
Jul 5, 2023 4:21:48 PM (20 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158134
Message:

Shared Clipboard: Also use the transfers callbacks for the Windows data object implementation. WIP. ​​bugref:9437

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/GuestHost/SharedClipboard-win.h

    r100367 r100394  
    171171int SharedClipboardWinGetFormats(PSHCLWINCTX pCtx, PSHCLFORMATS pfFormats);
    172172
    173 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
    174 int SharedClipboardWinTransferGetRoots(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer);
    175 int SharedClipboardWinTransferDropFilesToStringList(DROPFILES *pDropFiles, char **papszList, uint32_t *pcbList);
    176 int SharedClipboardWinTransferGetRootsFromClipboard(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer);
    177 int SharedClipboardWinTransferCreateAndSetDataObject(PSHCLWINCTX pWinCtx, PSHCLCONTEXT pCtx, PSHCLCALLBACKS pCallbacks);
    178 #endif
    179 
    180173int SharedClipboardWinGetCFHTMLHeaderValue(const char *pszSrc, const char *pszOption, uint32_t *puValue);
    181174bool SharedClipboardWinIsCFHTML(const char *pszSource);
     
    189182
    190183int SharedClipboardWinClearAndAnnounceFormats(PSHCLWINCTX pWinCtx, SHCLFORMATS fFormats, HWND hWnd);
     184
    191185#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
    192 int SharedClipboardWinTransferCreate(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer);
    193 void SharedClipboardWinTransferDestroy(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer);
    194 #endif
    195 
    196 # ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
    197186class SharedClipboardTransferList;
    198187#  ifndef FILEGROUPDESCRIPTOR
     
    200189#  endif
    201190
     191/**
     192 * Generic Windows class implementing IDataObject for Shared Clipboard data transfers.
     193 */
    202194class SharedClipboardWinDataObject : public IDataObject //, public IDataObjectAsyncCapability
    203195{
    204196public:
     197
     198    /**
     199     * Structure for keeping a data object callback context.
     200     */
     201    struct CALLBACKCTX
     202    {
     203        /** Pointer to the data object of this callback. */
     204        SharedClipboardWinDataObject *pThis;
     205        /** User-supplied pointer to more context data. */
     206        void                         *pvUser;
     207    };
     208    /** Pointer to a Shared Clipboard Windows data object callback table. */
     209    typedef CALLBACKCTX *PCALLBACKCTX;
     210
     211    /**
     212     * @name Shared Clipboard Windows data object callback table.
     213     */
     214    struct CALLBACKS
     215    {
     216        /**
     217         * Called by the data object if a transfer needs to be started.
     218         *
     219         * @returns VBox status code.
     220         * @param   pCbCtx          Pointer to callback context.
     221         */
     222        DECLCALLBACKMEMBER(int, pfnTransferStart, (PCALLBACKCTX pCbCtx));
     223    };
     224    /** Pointer to a Shared Clipboard Windows data object callback table. */
     225    typedef CALLBACKS *PCALLBACKS;
    205226
    206227    enum Status
     
    228249public:
    229250
    230     int Init(PSHCLCONTEXT pCtx, LPFORMATETC pFormatEtc = NULL, LPSTGMEDIUM pStgMed = NULL, ULONG cFormats = 0);
     251    int Init(PSHCLCONTEXT pCtx, SharedClipboardWinDataObject::PCALLBACKS pCallbacks, LPFORMATETC pFormatEtc = NULL, LPSTGMEDIUM pStgMed = NULL, ULONG cFormats = 0);
    231252    void Destroy(void);
    232253
     
    303324    /** Shared Clipboard context to use. */
    304325    PSHCLCONTEXT                m_pCtx;
    305     /** Callbacks table to use. */
    306     SHCLCALLBACKS               m_Callbacks;
    307326    /** The object's current status. */
    308327    Status                      m_enmStatus;
     328    /** Data object callback table to use. */
     329    CALLBACKS                   m_Callbacks;
     330    /** Data object callback table context to use. */
     331    CALLBACKCTX                 m_CallbackCtx;
    309332    /** The object's current reference count. */
    310333    LONG                        m_lRefCount;
     
    340363};
    341364
     365/**
     366 * Generic Windows class implementing IEnumFORMATETC for Shared Clipboard data transfers.
     367 */
    342368class SharedClipboardWinEnumFormatEtc : public IEnumFORMATETC
    343369{
     
    379405
    380406/**
    381  * Own IStream implementation to implement file-based clipboard operations
    382  * through HGCM. Needed on Windows hosts and guests.
     407 * Generic Windows class implementing IStream for Shared Clipboard data transfers.
    383408 */
    384409class SharedClipboardWinStreamImpl : public IStream
     
    454479    SharedClipboardWinDataObject *pDataObj;
    455480};
     481
     482int SharedClipboardWinTransferGetRoots(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer);
     483int SharedClipboardWinTransferDropFilesToStringList(DROPFILES *pDropFiles, char **papszList, uint32_t *pcbList);
     484int SharedClipboardWinTransferGetRootsFromClipboard(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer);
     485
     486int SharedClipboardWinTransferCreate(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer);
     487void SharedClipboardWinTransferDestroy(PSHCLWINCTX pWinCtx, PSHCLTRANSFER pTransfer);
     488
     489int SharedClipboardWinTransferCreateAndSetDataObject(PSHCLWINCTX pWinCtx, PSHCLCONTEXT pCtx, SharedClipboardWinDataObject::PCALLBACKS pCallbacks);
    456490# endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
    457491#endif /* !VBOX_INCLUDED_GuestHost_SharedClipboard_win_h */
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp

    r100367 r100394  
    9393*********************************************************************************************************************************/
    9494#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
    95 static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLTXPROVIDERCTX pCtx);
    96 static DECLCALLBACK(void) vbtrShClTransferStartedCallback(PSHCLTXPROVIDERCTX pCtx);
    97 static DECLCALLBACK(void) vbtrShClTransferErrorCallback(PSHCLTXPROVIDERCTX pCtx, int rc);
     95static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLTXPROVIDERCTX pCbCtx);
     96static DECLCALLBACK(void) vbtrShClTransferStartedCallback(PSHCLTXPROVIDERCTX pCbCtx);
     97static DECLCALLBACK(void) vbtrShClTransferErrorCallback(PSHCLTXPROVIDERCTX pCbCtx, int rc);
    9898#endif
    9999
    100100
     101/**
     102 * Worker for a reading clipboard from the host.
     103 */
     104static DECLCALLBACK(int) vbtrReadDataWorker(PSHCLCONTEXT pCtx, SHCLFORMAT uFmt, void **ppv, uint32_t *pcb, void *pvUser)
     105{
     106    RT_NOREF(pvUser);
     107
     108    LogFlowFuncEnter();
     109
     110    int rc = VERR_NO_DATA; /* Play safe. */
     111
     112    uint32_t cbRead = 0;
     113
     114    uint32_t cbData = _4K; /** @todo Make this dynamic. */
     115    void    *pvData = RTMemAlloc(cbData);
     116    if (pvData)
     117    {
     118        rc = VbglR3ClipboardReadDataEx(&pCtx->CmdCtx, uFmt, pvData, cbData, &cbRead);
     119    }
     120    else
     121        rc = VERR_NO_MEMORY;
     122
     123    /*
     124     * A return value of VINF_BUFFER_OVERFLOW tells us to try again with a
     125     * larger buffer.  The size of the buffer needed is placed in *pcb.
     126     * So we start all over again.
     127     */
     128    if (rc == VINF_BUFFER_OVERFLOW)
     129    {
     130        /* cbRead contains the size required. */
     131
     132        cbData = cbRead;
     133        pvData = RTMemRealloc(pvData, cbRead);
     134        if (pvData)
     135        {
     136            rc = VbglR3ClipboardReadDataEx(&pCtx->CmdCtx, uFmt, pvData, cbData, &cbRead);
     137            if (rc == VINF_BUFFER_OVERFLOW)
     138                rc = VERR_BUFFER_OVERFLOW;
     139        }
     140        else
     141            rc = VERR_NO_MEMORY;
     142    }
     143
     144    if (!cbRead)
     145        rc = VERR_NO_DATA;
     146
     147    if (RT_SUCCESS(rc))
     148    {
     149        if (ppv)
     150            *ppv = pvData;
     151        if (pcb)
     152            *pcb = cbRead; /* Actual bytes read. */
     153    }
     154    else
     155    {
     156        /*
     157         * Catch other errors. This also catches the case in which the buffer was
     158         * too small a second time, possibly because the clipboard contents
     159         * changed half-way through the operation.  Since we can't say whether or
     160         * not this is actually an error, we just return size 0.
     161         */
     162        RTMemFree(pvData);
     163    }
     164
     165    LogFlowFuncLeaveRC(rc);
     166    return rc;
     167}
     168
    101169#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
     170
     171/**
     172 * @copydoc SharedClipboardWinDataObject::CALLBACKS::pfnTransferStart
     173 *
     174 * @thread  Clipboard main thread.
     175 */
     176static DECLCALLBACK(int) vbtrShClDataObjectTransferStartCallback(SharedClipboardWinDataObject::PCALLBACKCTX pCbCtx)
     177{
     178    LogFlowFuncEnter();
     179
     180    PSHCLCONTEXT pCtx = (PSHCLCONTEXT)pCbCtx->pvUser;
     181    AssertPtr(pCtx);
     182
     183    int rc = VbglR3ClipboardTransferRequest(&pCtx->CmdCtx);
     184
     185    LogFlowFuncLeaveRC(rc);
     186    return rc;
     187}
     188
     189/**
     190 * @copydoc SHCLTRANSFERCALLBACKS::pfnOnInitialized
     191 *
     192 * Called by ShClTransferInit via VbglR3.
     193 * This lets the current in-flight data object know that it can start the actual transfer as needed.
     194 *
     195 * @thread  Clipboard main thread.
     196 */
     197static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLTXPROVIDERCTX pCbCtx)
     198{
     199    LogFlowFuncEnter();
     200
     201    int rc = VINF_SUCCESS;
     202
     203    PSHCLCONTEXT pCtx = (PSHCLCONTEXT)pCbCtx->pvUser;
     204    AssertPtr(pCtx);
     205
     206    switch(ShClTransferGetDir(pCbCtx->pTransfer))
     207    {
     208        case SHCLTRANSFERDIR_FROM_REMOTE:
     209        {
     210            AssertPtrBreak(pCtx->Win.pDataObjInFlight);
     211            rc = pCtx->Win.pDataObjInFlight->SetStatus(SharedClipboardWinDataObject::Running);
     212            break;
     213        }
     214
     215        default:
     216            break;
     217    }
     218
     219    LogFlowFuncLeaveRC(rc);
     220}
    102221
    103222/**
     
    132251 * Worker for a reading clipboard from the host.
    133252 *
    134  * @thread  Main clipboard thread.
     253 * @thread  Clipboard main thread.
    135254 */
    136255static DECLCALLBACK(int) vbtrShClRequestDataFromSourceCallbackWorker(PSHCLCONTEXT pCtx,
     
    139258    RT_NOREF(pvUser);
    140259
    141     LogFlowFuncEnter();
    142 
    143     int rc = VERR_NO_DATA; /* Play safe. */
    144 
    145     uint32_t cbRead = 0;
    146 
    147     uint32_t cbData = _4K; /** @todo Make this dynamic. */
    148     void    *pvData = RTMemAlloc(cbData);
    149     if (pvData)
    150     {
    151         rc = VbglR3ClipboardReadDataEx(&pCtx->CmdCtx, uFmt, pvData, cbData, &cbRead);
    152     }
    153     else
    154         rc = VERR_NO_MEMORY;
    155 
    156     /*
    157      * A return value of VINF_BUFFER_OVERFLOW tells us to try again with a
    158      * larger buffer.  The size of the buffer needed is placed in *pcb.
    159      * So we start all over again.
    160      */
    161     if (rc == VINF_BUFFER_OVERFLOW)
    162     {
    163         /* cbRead contains the size required. */
    164 
    165         cbData = cbRead;
    166         pvData = RTMemRealloc(pvData, cbRead);
    167         if (pvData)
    168         {
    169             rc = VbglR3ClipboardReadDataEx(&pCtx->CmdCtx, uFmt, pvData, cbData, &cbRead);
    170             if (rc == VINF_BUFFER_OVERFLOW)
    171                 rc = VERR_BUFFER_OVERFLOW;
    172         }
    173         else
    174             rc = VERR_NO_MEMORY;
    175     }
    176 
    177     if (!cbRead)
    178         rc = VERR_NO_DATA;
    179 
    180     if (RT_SUCCESS(rc))
    181     {
    182         if (ppv)
    183             *ppv = pvData;
    184         if (pcb)
    185             *pcb = cbRead; /* Actual bytes read. */
    186     }
    187     else
    188     {
    189         /*
    190          * Catch other errors. This also catches the case in which the buffer was
    191          * too small a second time, possibly because the clipboard contents
    192          * changed half-way through the operation.  Since we can't say whether or
    193          * not this is actually an error, we just return size 0.
    194          */
    195         RTMemFree(pvData);
    196     }
     260    LogFlowFunc(("pCtx=%p, uFmt=%#x\n", pCtx, uFmt));
     261
     262    int rc = vbtrReadDataWorker(pCtx, uFmt, ppv, pcb, pvUser);
     263
     264    if (RT_FAILURE(rc))
     265        LogRel(("Shared Clipboard: Requesting data in format %#x from host failed with %Rrc\n", uFmt, rc));
    197266
    198267    LogFlowFuncLeaveRC(rc);
     
    634703                {
    635704                    /*
    636                      * Creating and starting the actual transfer will be done in vbglR3ClipboardTransferStart() as soon
    637                      * as the host announces the start of the transfer via a VBOX_SHCL_HOST_MSG_TRANSFER_STATUS message.
    638                      * Transfers always are controlled and initiated on the host side!
    639                      *
    640                      * What we need to do here, however, is, that we create our IDataObject implementation and push it to the
    641                      * Windows clibpoard. That way Windows will recognize that there is a data transfer "in flight".
     705                     * Create our IDataObject implementation and push it to the Windows clibpoard.
     706                     * That way Windows will recognize that there is a data transfer available.
    642707                     */
    643                     SHCLCALLBACKS Callbacks;
     708                    SharedClipboardWinDataObject::CALLBACKS Callbacks;
    644709                    RT_ZERO(Callbacks);
    645                     Callbacks.pfnOnRequestDataFromSource = vbtrShClRequestDataFromSourceCallback;
     710                    Callbacks.pfnTransferStart = vbtrShClDataObjectTransferStartCallback;
    646711
    647712                    rc = SharedClipboardWinTransferCreateAndSetDataObject(pWinCtx, pCtx, &Callbacks);
  • trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp

    r100367 r100394  
    7979 *
    8080 * @returns VBox status code.
    81  * @param   pFormatEtc          FormatETC to use.
    82  * @param   pStgMed             Storage medium to use.
    83  * @param   cFormats            Number of formats in \a pFormatEtc and \a pStgMed.
    84  */
    85 int SharedClipboardWinDataObject::Init(PSHCLCONTEXT pCtx,
     81 * @param   pCtx                Opaque Shared Clipboard context to use.
     82 * @param   pCallbacks          Callbacks table to use.
     83 * @param   pFormatEtc          FormatETC to use. Optional.
     84 * @param   pStgMed             Storage medium to use. Optional.
     85 * @param   cFormats            Number of formats in \a pFormatEtc and \a pStgMed. Optional.
     86 */
     87int SharedClipboardWinDataObject::Init(PSHCLCONTEXT pCtx, SharedClipboardWinDataObject::PCALLBACKS pCallbacks,
    8688                                       LPFORMATETC pFormatEtc /* = NULL */, LPSTGMEDIUM pStgMed /* = NULL */,
    8789                                       ULONG cFormats /* = 0 */)
    8890{
    8991    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
     92    AssertPtrReturn(pCallbacks, VERR_INVALID_POINTER);
    9093    AssertReturn(cFormats == 0 || (RT_VALID_PTR(pFormatEtc) && RT_VALID_PTR(pStgMed)), VERR_INVALID_POINTER);
    9194
     
    9497    m_pCtx = pCtx; /* Save opaque context. */
    9598
     99    /*
     100     * Set up callback context + table.
     101     */
     102    memcpy(&m_Callbacks, pCallbacks, sizeof(SharedClipboardWinDataObject::CALLBACKS));
     103    m_CallbackCtx.pvUser = pCtx;
     104    m_CallbackCtx.pThis  = this;
     105
     106    /*
     107     * Set up / register handled formats.
     108     */
    96109    ULONG cFixedFormats = 3; /* CFSTR_FILEDESCRIPTORA + CFSTR_FILECONTENTS + CFSTR_PERFORMEDDROPEFFECT */
    97110#ifdef VBOX_CLIPBOARD_WITH_UNICODE_SUPPORT
     
    690703                /* Leave lock while requesting + waiting. */
    691704                rc2 = RTCritSectLeave(&m_CritSect);
    692                 AssertRCReturn(rc2, E_UNEXPECTED);
    693 
    694                 /* Request the transfer from the source.
    695                  * This will generate a transfer status message which we're waiting for here. */
    696             #if 0 // CLEAN
    697                 AssertPtr(m_Callbacks.pfnOnRequestDataFromSource);
    698                 rc = m_Callbacks.pfnOnRequestDataFromSource(m_pCtx,
    699                                                             VBOX_SHCL_FMT_URI_LIST, NULL /* ppv */, NULL /* pv */,
    700                                                             this /* pvUser */);
    701                 AssertRCBreak(rc);
    702             #else
    703                 rc = ShClTransferStart(m_pTransfer);
    704                 AssertRCBreak(rc);
    705             #endif
     705                AssertRCBreak(rc2);
     706
     707                /* Start the transfer. */
     708                AssertPtrBreak(m_Callbacks.pfnTransferStart);
     709                rc = m_Callbacks.pfnTransferStart(&m_CallbackCtx);
     710                AssertRCBreak(rc2);
    706711
    707712                LogRel2(("Shared Clipboard: Waiting for IDataObject started status ...\n"));
    708713
    709714                rc = RTSemEventWait(m_EventStatusChanged, SHCL_TIMEOUT_DEFAULT_MS);
     715                AssertRCBreak(rc2);
    710716
    711717                /* Re-acquire lock. */
    712718                rc2 = RTCritSectEnter(&m_CritSect);
    713                 AssertRCReturn(rc2, E_UNEXPECTED);
     719                AssertRCBreak(rc2);
    714720
    715721                if (RT_SUCCESS(rc))
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-win.cpp

    r100367 r100394  
    10501050 * @param   pCallbacks          Callbacks table to use.
    10511051 */
    1052 int SharedClipboardWinTransferCreateAndSetDataObject(PSHCLWINCTX pWinCtx, PSHCLCONTEXT pCtx, PSHCLCALLBACKS pCallbacks)
     1052int SharedClipboardWinTransferCreateAndSetDataObject(PSHCLWINCTX pWinCtx,
     1053                                                     PSHCLCONTEXT pCtx, SharedClipboardWinDataObject::PCALLBACKS pCallbacks)
    10531054{
    10541055    AssertPtrReturn(pWinCtx, VERR_INVALID_POINTER);
     
    10661067            if (pObj)
    10671068            {
    1068                 rc = pObj->Init(pCtx);
     1069                rc = pObj->Init(pCtx, pCallbacks);
    10691070                if (RT_SUCCESS(rc))
    10701071                {
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-win.cpp

    r100381 r100394  
    252252    PSHCLTXPROVIDERIFACE pIface = &pClient->Transfers.Provider.Interface;
    253253
     254    pClient->Transfers.Provider.enmSource = pClient->State.enmSource;
     255    pClient->Transfers.Provider.pvUser    = pClient;
     256
     257    int rc = VINF_SUCCESS;
     258
    254259    switch (ShClTransferGetDir(pTransfer))
    255260    {
    256         case SHCLTRANSFERDIR_FROM_REMOTE: /* Guest -> Host. */
     261        case SHCLTRANSFERDIR_FROM_REMOTE: /* G->H */
    257262        {
    258263            pIface->pfnRootListRead  = shClSvcTransferIfaceGHRootListRead;
     
    269274        }
    270275
    271         case SHCLTRANSFERDIR_TO_REMOTE: /* Host -> Guest. */
     276        case SHCLTRANSFERDIR_TO_REMOTE: /* H->G */
    272277        {
    273278            pIface->pfnRootListRead  = shClSvcWinTransferIfaceHGRootListRead;
     
    276281
    277282        default:
    278             AssertFailed();
    279     }
    280 
    281     int rc = ShClTransferSetProvider(pTransfer, &pClient->Transfers.Provider); RT_NOREF(rc);
     283            AssertFailedStmt(rc = VERR_NOT_SUPPORTED);
     284            break;
     285    }
     286
     287    if (RT_SUCCESS(rc))
     288        rc = ShClTransferSetProvider(pTransfer, &pClient->Transfers.Provider); RT_NOREF(rc);
    282289
    283290    LogFlowFuncLeaveRC(rc);
     
    287294 * @copydoc SHCLTRANSFERCALLBACKS::pfnOnInitialized
    288295 *
    289  * Called on transfer intialization to notify the "in-flight" IDataObject about a data transfer.
     296 * For G->H: Called on transfer intialization to notify the "in-flight" IDataObject about a data transfer.
     297 * For H->G: Called on transfer intialization to populate the transfer's root list.
    290298 *
    291299 * @thread  Service main thread.
     
    299307    AssertPtr(pTransfer);
    300308
    301     const SHCLTRANSFERDIR enmDir = ShClTransferGetDir(pTransfer);
    302 
    303309    int rc = VINF_SUCCESS;
    304310
    305     LogFlowFunc(("pCtx=%p, idTransfer=%RU32, enmDir=%RU32\n", pCtx, ShClTransferGetID(pTransfer), enmDir));
    306 
    307     /* The host wants to transfer data from the guest. */
    308     if (enmDir == SHCLTRANSFERDIR_FROM_REMOTE)
    309     {
    310         rc = RTCritSectEnter(&pCtx->Win.CritSect);
    311         if (RT_SUCCESS(rc))
    312         {
    313             SharedClipboardWinDataObject *pObj = pCtx->Win.pDataObjInFlight;
    314             AssertPtrReturnVoid(pObj);
    315             rc = pObj->SetTransfer(pTransfer);
    316 
    317             pCtx->Win.pDataObjInFlight = NULL; /* Hand off to Windows. */
    318 
    319             int rc2 = RTCritSectLeave(&pCtx->Win.CritSect);
    320             AssertRC(rc2);
    321         }
    322     }
    323 
    324     if (RT_FAILURE(rc))
    325         LogRel(("Shared Clipboard: Starting transfer failed, rc=%Rrc\n", rc));
    326 
    327     LogFlowFunc(("LEAVE: idTransfer=%RU32, rc=%Rrc\n", ShClTransferGetID(pTransfer), rc));
     311    switch (ShClTransferGetDir(pTransfer))
     312    {
     313        case SHCLTRANSFERDIR_FROM_REMOTE: /* G->H */
     314        {
     315            rc = RTCritSectEnter(&pCtx->Win.CritSect);
     316            if (RT_SUCCESS(rc))
     317            {
     318                SharedClipboardWinDataObject *pObj = pCtx->Win.pDataObjInFlight;
     319                AssertPtrReturnVoid(pObj);
     320                rc = pObj->SetTransfer(pTransfer);
     321
     322                pCtx->Win.pDataObjInFlight = NULL; /* Hand off to Windows. */
     323
     324                int rc2 = RTCritSectLeave(&pCtx->Win.CritSect);
     325                AssertRC(rc2);
     326            }
     327
     328            break;
     329        }
     330
     331        case SHCLTRANSFERDIR_TO_REMOTE: /* H->G */
     332        {
     333            rc = ShClTransferRootListRead(pTransfer); /* Calls shClSvcWinTransferIfaceHGRootListRead(). */
     334            break;
     335        }
     336
     337        default:
     338            AssertFailedStmt(rc = VERR_NOT_SUPPORTED);
     339            break;
     340    }
     341
     342    LogFlowFuncLeaveRC(rc);
    328343}
    329344
     
    803818#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
    804819        /*
    805          * Init transfer callbacks.
     820         * Set callbacks.
     821         * Those will be registered within ShClSvcTransferInit() when a new transfer gets initialized.
    806822         */
    807823        RT_ZERO(pClient->Transfers.Callbacks);
     824
     825        pClient->Transfers.Callbacks.pvUser = pCtx; /* Assign context as user-provided callback data. */
     826        pClient->Transfers.Callbacks.cbUser = sizeof(SHCLCONTEXT);
     827
     828        pClient->Transfers.Callbacks.pfnOnCreated     = shClSvcWinTransferOnCreatedCallback;
    808829        pClient->Transfers.Callbacks.pfnOnInitialized = shClSvcWinTransferOnInitializedCallback;
    809830        pClient->Transfers.Callbacks.pfnOnStarted     = shClSvcWinTransferOnStartedCallback;
    810831        pClient->Transfers.Callbacks.pfnOnDestroy     = shClSvcWinTransferOnDestroyCallback;
    811 
    812         pClient->Transfers.Callbacks.pvUser = pCtx; /* Assign context as user-provided callback data. */
    813         pClient->Transfers.Callbacks.cbUser = sizeof(SHCLCONTEXT);
    814832#endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
    815833    }
Note: See TracChangeset for help on using the changeset viewer.

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