Changeset 100407 in vbox
- Timestamp:
- Jul 6, 2023 11:18:29 AM (22 months ago)
- svn:sync-xref-src-repo-rev:
- 158147
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/GuestHost/SharedClipboard-win.h
r100394 r100407 351 351 /** Event being triggered when reading the transfer list been completed. */ 352 352 RTSEMEVENT m_EventListComplete; 353 /** Event being triggered when the transferstatus has been changed. */353 /** Event being triggered when the object status has been changed. */ 354 354 RTSEMEVENT m_EventStatusChanged; 355 355 /** Registered format for CFSTR_FILEDESCRIPTORA. */ -
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp
r100394 r100407 93 93 *********************************************************************************************************************************/ 94 94 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 95 static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLT XPROVIDERCTX pCbCtx);96 static DECLCALLBACK(void) vbtrShClTransferStartedCallback(PSHCLT XPROVIDERCTX pCbCtx);97 static DECLCALLBACK(void) vbtrShClTransferErrorCallback(PSHCLT XPROVIDERCTX pCbCtx, int rc);95 static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLTRANSFERCALLBACKCTX pCbCtx); 96 static DECLCALLBACK(void) vbtrShClTransferStartedCallback(PSHCLTRANSFERCALLBACKCTX pCbCtx); 97 static DECLCALLBACK(void) vbtrShClTransferErrorCallback(PSHCLTRANSFERCALLBACKCTX pCbCtx, int rc); 98 98 #endif 99 99 … … 195 195 * @thread Clipboard main thread. 196 196 */ 197 static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLT XPROVIDERCTX pCbCtx)197 static DECLCALLBACK(void) vbtrShClTransferInitializedCallback(PSHCLTRANSFERCALLBACKCTX pCbCtx) 198 198 { 199 199 LogFlowFuncEnter(); … … 209 209 { 210 210 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); 212 214 break; 213 215 } … … 301 303 AssertPtr(pTransfer); 302 304 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; 308 308 309 309 /* The guest wants to transfer data to the host. */ 310 if (enmDir == SHCLTRANSFERDIR_TO_REMOTE) 310 if (enmDir == SHCLTRANSFERDIR_TO_REMOTE) /* G->H */ 311 311 { 312 312 rc = SharedClipboardWinTransferGetRootsFromClipboard(&pCtx->Win, pTransfer); 313 313 } 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. */ 329 317 } 330 318 else … … 333 321 if (RT_FAILURE(rc)) 334 322 LogRel(("Shared Clipboard: Starting transfer failed, rc=%Rrc\n", rc)); 335 336 LogFlowFunc(("LEAVE: idTransfer=%RU32, rc=%Rrc\n", ShClTransferGetID(pTransfer), rc));337 323 } 338 324 … … 1093 1079 pCtx->CmdCtx.Transfers.Callbacks.cbUser = sizeof(SHCLCONTEXT); 1094 1080 1081 pCtx->CmdCtx.Transfers.Callbacks.pfnOnInitialized = vbtrShClTransferInitializedCallback; 1095 1082 pCtx->CmdCtx.Transfers.Callbacks.pfnOnStarted = vbtrShClTransferStartedCallback; 1096 1083 pCtx->CmdCtx.Transfers.Callbacks.pfnOnCompleted = vbtrShClTransferCompletedCallback; … … 1113 1100 uint32_t idMsg = 0; 1114 1101 uint32_t cParms = 0; 1115 rc = VbglR3ClipboardMsgPeek (&pCtx->CmdCtx, &idMsg, &cParms, NULL /* pidRestoreCheck */);1102 rc = VbglR3ClipboardMsgPeekWait(&pCtx->CmdCtx, &idMsg, &cParms, NULL /* pidRestoreCheck */); 1116 1103 if (RT_SUCCESS(rc)) 1117 1104 { -
trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp
r100394 r100407 703 703 /* Leave lock while requesting + waiting. */ 704 704 rc2 = RTCritSectLeave(&m_CritSect); 705 AssertRCBreak(rc 2);705 AssertRCBreak(rc); 706 706 707 707 /* Start the transfer. */ 708 708 AssertPtrBreak(m_Callbacks.pfnTransferStart); 709 709 rc = m_Callbacks.pfnTransferStart(&m_CallbackCtx); 710 AssertRCBreak(rc 2);710 AssertRCBreak(rc); 711 711 712 712 LogRel2(("Shared Clipboard: Waiting for IDataObject started status ...\n")); 713 713 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); 716 718 717 719 /* Re-acquire lock. */ 718 rc 2= RTCritSectEnter(&m_CritSect);719 AssertRCBreak(rc 2);720 721 if ( RT_SUCCESS(rc))720 rc = RTCritSectEnter(&m_CritSect); 721 AssertRCBreak(rc); 722 723 if (m_enmStatus != Running) 722 724 { 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; 732 728 } 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); 735 732 736 733 RT_FALL_THROUGH(); … … 741 738 const bool fUnicode = pFormatEtc->cfFormat == m_cfFileDescriptorW; 742 739 743 const uint32_t enmTransferStatus = ShClTransferGetStatus(m_pTransfer);740 SHCLTRANSFERSTATUS const enmTransferStatus = ShClTransferGetStatus(m_pTransfer); 744 741 RT_NOREF(enmTransferStatus); 745 742 … … 750 747 if (!m_fThreadRunning) 751 748 { 752 /* Start the transfer asynchronously in a separate thread. */753 rc = ShClTransfer Run(m_pTransfer, &SharedClipboardWinDataObject::readThread, this /* pvUser */);749 /* Start the transfer + run it asynchronously in a separate thread. */ 750 rc = ShClTransferStart(m_pTransfer); 754 751 if (RT_SUCCESS(rc)) 755 752 { 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 } 769 770 } 770 771 } … … 1026 1027 if (m_enmStatus == Initialized) 1027 1028 { 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 } 1034 1038 } 1035 1039 else
Note:
See TracChangeset
for help on using the changeset viewer.