VirtualBox

Changeset 100394 in vbox for trunk/src/VBox/HostServices


Ignore:
Timestamp:
Jul 5, 2023 4:21:48 PM (20 months ago)
Author:
vboxsync
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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