VirtualBox

Changeset 100407 in vbox


Ignore:
Timestamp:
Jul 6, 2023 11:18:29 AM (22 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158147
Message:

Shared Clipboard: VBoxTray now uses the same way as VBoxClient wrt H->G transfer handling. ​​​bugref:9437

Location:
trunk
Files:
3 edited

Legend:

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

    r100394 r100407  
    351351    /** Event being triggered when reading the transfer list been completed. */
    352352    RTSEMEVENT                  m_EventListComplete;
    353     /** Event being triggered when the transfer status has been changed. */
     353    /** Event being triggered when the object status has been changed. */
    354354    RTSEMEVENT                  m_EventStatusChanged;
    355355    /** Registered format for CFSTR_FILEDESCRIPTORA. */
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp

    r100394 r100407  
    9393*********************************************************************************************************************************/
    9494#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
    95 static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLTXPROVIDERCTX pCbCtx);
    96 static DECLCALLBACK(void) vbtrShClTransferStartedCallback(PSHCLTXPROVIDERCTX pCbCtx);
    97 static DECLCALLBACK(void) vbtrShClTransferErrorCallback(PSHCLTXPROVIDERCTX pCbCtx, int rc);
     95static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLTRANSFERCALLBACKCTX pCbCtx);
     96static DECLCALLBACK(void) vbtrShClTransferStartedCallback(PSHCLTRANSFERCALLBACKCTX pCbCtx);
     97static DECLCALLBACK(void) vbtrShClTransferErrorCallback(PSHCLTRANSFERCALLBACKCTX pCbCtx, int rc);
    9898#endif
    9999
     
    195195 * @thread  Clipboard main thread.
    196196 */
    197 static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLTXPROVIDERCTX pCbCtx)
     197static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLTRANSFERCALLBACKCTX pCbCtx)
    198198{
    199199    LogFlowFuncEnter();
     
    209209        {
    210210            AssertPtrBreak(pCtx->Win.pDataObjInFlight);
    211             rc = pCtx->Win.pDataObjInFlight->SetStatus(SharedClipboardWinDataObject::Running);
     211            rc = pCtx->Win.pDataObjInFlight->SetTransfer(pCbCtx->pTransfer);
     212            if (RT_SUCCESS(rc))
     213                rc = pCtx->Win.pDataObjInFlight->SetStatus(SharedClipboardWinDataObject::Running);
    212214            break;
    213215        }
     
    301303    AssertPtr(pTransfer);
    302304
    303     const SHCLTRANSFERDIR enmDir = ShClTransferGetDir(pTransfer);
    304 
    305     LogFlowFunc(("pCtx=%p, idTransfer=%RU32, enmDir=%RU32\n", pCtx, ShClTransferGetID(pTransfer), enmDir));
    306 
    307     int rc;
     305    SHCLTRANSFERDIR const enmDir = ShClTransferGetDir(pTransfer);
     306
     307    int rc = VINF_SUCCESS;
    308308
    309309    /* The guest wants to transfer data to the host. */
    310     if (enmDir == SHCLTRANSFERDIR_TO_REMOTE)
     310    if (enmDir == SHCLTRANSFERDIR_TO_REMOTE) /* G->H */
    311311    {
    312312        rc = SharedClipboardWinTransferGetRootsFromClipboard(&pCtx->Win, pTransfer);
    313313    }
    314     /* The guest wants to transfer data from the host. */
    315     else if (enmDir == SHCLTRANSFERDIR_FROM_REMOTE)
    316     {
    317         rc = RTCritSectEnter(&pCtx->Win.CritSect);
    318         if (RT_SUCCESS(rc))
    319         {
    320             SharedClipboardWinDataObject *pObj = pCtx->Win.pDataObjInFlight;
    321             AssertPtrReturnVoid(pObj);
    322             rc = pObj->SetTransfer(pTransfer);
    323 
    324             pCtx->Win.pDataObjInFlight = NULL; /* Hand off to Windows. */
    325 
    326             int rc2 = RTCritSectLeave(&pCtx->Win.CritSect);
    327             AssertRC(rc2);
    328         }
     314    else if (enmDir == SHCLTRANSFERDIR_FROM_REMOTE) /* H->G */
     315    {
     316        /* Nothing to do here. */
    329317    }
    330318    else
     
    333321    if (RT_FAILURE(rc))
    334322        LogRel(("Shared Clipboard: Starting transfer failed, rc=%Rrc\n", rc));
    335 
    336     LogFlowFunc(("LEAVE: idTransfer=%RU32, rc=%Rrc\n", ShClTransferGetID(pTransfer), rc));
    337323}
    338324
     
    10931079    pCtx->CmdCtx.Transfers.Callbacks.cbUser = sizeof(SHCLCONTEXT);
    10941080
     1081    pCtx->CmdCtx.Transfers.Callbacks.pfnOnInitialized = vbtrShClTransferInitializedCallback;
    10951082    pCtx->CmdCtx.Transfers.Callbacks.pfnOnStarted     = vbtrShClTransferStartedCallback;
    10961083    pCtx->CmdCtx.Transfers.Callbacks.pfnOnCompleted   = vbtrShClTransferCompletedCallback;
     
    11131100        uint32_t idMsg  = 0;
    11141101        uint32_t cParms = 0;
    1115         rc = VbglR3ClipboardMsgPeek(&pCtx->CmdCtx, &idMsg, &cParms, NULL /* pidRestoreCheck */);
     1102        rc = VbglR3ClipboardMsgPeekWait(&pCtx->CmdCtx, &idMsg, &cParms, NULL /* pidRestoreCheck */);
    11161103        if (RT_SUCCESS(rc))
    11171104        {
  • trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp

    r100394 r100407  
    703703                /* Leave lock while requesting + waiting. */
    704704                rc2 = RTCritSectLeave(&m_CritSect);
    705                 AssertRCBreak(rc2);
     705                AssertRCBreak(rc);
    706706
    707707                /* Start the transfer. */
    708708                AssertPtrBreak(m_Callbacks.pfnTransferStart);
    709709                rc = m_Callbacks.pfnTransferStart(&m_CallbackCtx);
    710                 AssertRCBreak(rc2);
     710                AssertRCBreak(rc);
    711711
    712712                LogRel2(("Shared Clipboard: Waiting for IDataObject started status ...\n"));
    713713
    714                 rc = RTSemEventWait(m_EventStatusChanged, SHCL_TIMEOUT_DEFAULT_MS);
    715                 AssertRCBreak(rc2);
     714                /* Note: Keep the timeout low here (instead of using SHCL_TIMEOUT_DEFAULT_MS), as this will make
     715                 *       Windows Explorer unresponsive (i.e. "ghost window") when waiting for too long. */
     716                rc = RTSemEventWait(m_EventStatusChanged, RT_MS_10SEC);
     717                AssertRCBreak(rc);
    716718
    717719                /* Re-acquire lock. */
    718                 rc2 = RTCritSectEnter(&m_CritSect);
    719                 AssertRCBreak(rc2);
    720 
    721                 if (RT_SUCCESS(rc))
     720                rc = RTCritSectEnter(&m_CritSect);
     721                AssertRCBreak(rc);
     722
     723                if (m_enmStatus != Running)
    722724                {
    723                     if (m_enmStatus != Running)
    724                     {
    725                         LogRel(("Shared Clipboard: Received wrong IDataObject status (%#x)\n", m_enmStatus));
    726                         rc = VERR_WRONG_ORDER;
    727                         break;
    728                     }
    729 
    730                     /* There now must be a transfer assigned. */
    731                     AssertPtrBreakStmt(m_pTransfer, rc = VERR_WRONG_ORDER);
     725                    LogRel(("Shared Clipboard: Received wrong IDataObject status (%#x)\n", m_enmStatus));
     726                    rc = VERR_WRONG_ORDER;
     727                    break;
    732728                }
    733                 else /* Bail out on failure. */
    734                     break;
     729
     730                /* There now must be a transfer assigned. */
     731                AssertPtrBreakStmt(m_pTransfer, rc = VERR_WRONG_ORDER);
    735732
    736733                RT_FALL_THROUGH();
     
    741738                const bool fUnicode = pFormatEtc->cfFormat == m_cfFileDescriptorW;
    742739
    743                 const uint32_t enmTransferStatus = ShClTransferGetStatus(m_pTransfer);
     740                SHCLTRANSFERSTATUS const enmTransferStatus = ShClTransferGetStatus(m_pTransfer);
    744741                RT_NOREF(enmTransferStatus);
    745742
     
    750747                if (!m_fThreadRunning)
    751748                {
    752                     /* Start the transfer asynchronously in a separate thread. */
    753                     rc = ShClTransferRun(m_pTransfer, &SharedClipboardWinDataObject::readThread, this /* pvUser */);
     749                    /* Start the transfer + run it asynchronously in a separate thread. */
     750                    rc = ShClTransferStart(m_pTransfer);
    754751                    if (RT_SUCCESS(rc))
    755752                    {
    756                         m_fThreadRunning = true;
    757 
    758                         /* Leave lock while waiting. */
    759                         rc2 = RTCritSectLeave(&m_CritSect);
    760                         AssertRCReturn(rc2, E_UNEXPECTED);
    761 
    762                         /* Don't block for too long here, as this also will screw other apps running on the OS. */
    763                         LogRel2(("Shared Clipboard: Waiting for IDataObject listing to arrive ...\n"));
    764                         rc = RTSemEventWait(m_EventListComplete, SHCL_TIMEOUT_DEFAULT_MS);
    765 
    766                         /* Re-acquire lock. */
    767                         rc2 = RTCritSectEnter(&m_CritSect);
    768                         AssertRCReturn(rc2, E_UNEXPECTED);
     753                        rc = ShClTransferRun(m_pTransfer, &SharedClipboardWinDataObject::readThread, this /* pvUser */);
     754                        if (RT_SUCCESS(rc))
     755                        {
     756                            m_fThreadRunning = true;
     757
     758                            /* Leave lock while waiting. */
     759                            rc = RTCritSectLeave(&m_CritSect);
     760                            AssertRCReturn(rc, E_UNEXPECTED);
     761
     762                            /* Don't block for too long here, as this also will screw other apps running on the OS. */
     763                            LogRel2(("Shared Clipboard: Waiting for IDataObject listing to arrive ...\n"));
     764                            rc = RTSemEventWait(m_EventListComplete, SHCL_TIMEOUT_DEFAULT_MS);
     765
     766                            /* Re-acquire lock. */
     767                            rc = RTCritSectEnter(&m_CritSect);
     768                            AssertRCReturn(rc, E_UNEXPECTED);
     769                        }
    769770                    }
    770771                }
     
    10261027        if (m_enmStatus == Initialized)
    10271028        {
    1028             AssertMsgReturn(ShClTransferGetStatus(pTransfer) == SHCLTRANSFERSTATUS_STARTED,
    1029                             ("Cannot set a non-started transfer\n"), VERR_WRONG_ORDER);
    1030 
    1031             m_pTransfer = pTransfer;
    1032 
    1033             ShClTransferAcquire(pTransfer);
     1029            SHCLTRANSFERSTATUS const enmSts = ShClTransferGetStatus(pTransfer);
     1030            AssertMsgStmt(enmSts == SHCLTRANSFERSTATUS_INITIALIZED, /* Transfer must not be started yet. */
     1031                          ("Transfer has wrong status (%#x)\n", enmSts), rc = VERR_WRONG_ORDER);
     1032            if (RT_SUCCESS(rc))
     1033            {
     1034                m_pTransfer = pTransfer;
     1035
     1036                ShClTransferAcquire(pTransfer);
     1037            }
    10341038        }
    10351039        else
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