Changeset 87452 in vbox for trunk/src/VBox/HostServices/SharedClipboard
- Timestamp:
- Jan 27, 2021 5:11:25 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 142470
- Location:
- trunk/src/VBox/HostServices/SharedClipboard
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedClipboard/Makefile.kmk
r87059 r87452 45 45 darwin-pasteboard.cpp 46 46 ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 47 if1of ($(KBUILD_TARGET), linux) 48 VBoxSharedClipboard_DEFS += VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP 49 VBoxSharedClipboard_SOURCES += \ 50 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-transfers-http.cpp 51 endif 47 52 VBoxSharedClipboard_DEFS += VBOX_WITH_SHARED_CLIPBOARD_HOST 48 53 VBoxSharedClipboard_SOURCES += \ … … 55 60 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardEnumFormatEtcImpl-win.cpp \ 56 61 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardStreamImpl-win.cpp 57 if1of ($(KBUILD_TARGET), linux)58 VBoxSharedClipboard_DEFS += VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP59 VBoxSharedClipboard_SOURCES += \60 $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/clipboard-transfers-http.cpp61 endif62 62 endif 63 63 if1of ($(KBUILD_TARGET), linux solaris freebsd) ## @todo X11 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-internal.h
r86908 r87452 166 166 } SHCLCLIENTCMDCTX, *PSHCLCLIENTCMDCTX; 167 167 168 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 169 /** 170 * Structure for keeping transfer-related data per HGCM client. 171 */ 172 typedef struct _SHCLIENTTRANSFERS 173 { 174 /** Transfer context. */ 175 SHCLTRANSFERCTX Ctx; 176 } SHCLIENTTRANSFERS, *PSHCLIENTTRANSFERS; 177 #endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */ 178 179 /** 180 * Structure for keeping data per (connected) HGCM client. 181 */ 168 182 typedef struct _SHCLCLIENT 169 183 { … … 182 196 SHCLEVENTSOURCE EventSrc; 183 197 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 184 /** Transfer contextdata. */ 185 SHCLTRANSFERCTX TransferCtx; 198 SHCLIENTTRANSFERS Transfers; 186 199 #endif 187 200 /** Structure for keeping the client's pending (deferred return) state. … … 256 269 int shClSvcClientInit(PSHCLCLIENT pClient, uint32_t uClientID); 257 270 void shClSvcClientDestroy(PSHCLCLIENT pClient); 271 void shClSvcClientLock(PSHCLCLIENT pClient); 272 void shClSvcClientUnlock(PSHCLCLIENT pClient); 258 273 void shClSvcClientReset(PSHCLCLIENT pClient); 259 274 … … 359 374 */ 360 375 /** 361 * Called when a transfer getscreated.376 * Called after a transfer got created. 362 377 * 363 378 * @returns VBox status code. … … 367 382 int ShClBackendTransferCreate(PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer); 368 383 /** 369 * Called whena transfer gets destroyed.384 * Called before a transfer gets destroyed. 370 385 * 371 386 * @returns VBox status code. … … 397 412 * @{ 398 413 */ 399 int shClSvcTransferIfaceOpen(PSHCLPROVIDERCTX pCtx); 400 int shClSvcTransferIfaceClose(PSHCLPROVIDERCTX pCtx); 401 402 int shClSvcTransferIfaceGetRoots(PSHCLPROVIDERCTX pCtx, PSHCLROOTLIST *ppRootList); 403 404 int shClSvcTransferIfaceListOpen(PSHCLPROVIDERCTX pCtx, PSHCLLISTOPENPARMS pOpenParms, PSHCLLISTHANDLE phList); 405 int shClSvcTransferIfaceListClose(PSHCLPROVIDERCTX pCtx, SHCLLISTHANDLE hList); 406 int shClSvcTransferIfaceListHdrRead(PSHCLPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr); 407 int shClSvcTransferIfaceListHdrWrite(PSHCLPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr); 408 int shClSvcTransferIfaceListEntryRead(PSHCLPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTENTRY pListEntry); 409 int shClSvcTransferIfaceListEntryWrite(PSHCLPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTENTRY pListEntry); 410 411 int shClSvcTransferIfaceObjOpen(PSHCLPROVIDERCTX pCtx, PSHCLOBJOPENCREATEPARMS pCreateParms, 414 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP 415 416 #endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP */ 417 418 int shClSvcTransferIfaceGetRoots(PSHCLTXPROVIDERCTX pCtx, PSHCLROOTLIST *ppRootList); 419 420 int shClSvcTransferIfaceListOpen(PSHCLTXPROVIDERCTX pCtx, PSHCLLISTOPENPARMS pOpenParms, PSHCLLISTHANDLE phList); 421 int shClSvcTransferIfaceListClose(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList); 422 int shClSvcTransferIfaceListHdrRead(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr); 423 int shClSvcTransferIfaceListHdrWrite(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr); 424 int shClSvcTransferIfaceListEntryRead(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTENTRY pListEntry); 425 int shClSvcTransferIfaceListEntryWrite(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList, PSHCLLISTENTRY pListEntry); 426 427 int shClSvcTransferIfaceObjOpen(PSHCLTXPROVIDERCTX pCtx, PSHCLOBJOPENCREATEPARMS pCreateParms, 412 428 PSHCLOBJHANDLE phObj); 413 int shClSvcTransferIfaceObjClose(PSHCL PROVIDERCTX pCtx, SHCLOBJHANDLE hObj);414 int shClSvcTransferIfaceObjRead(PSHCL PROVIDERCTX pCtx, SHCLOBJHANDLE hObj,429 int shClSvcTransferIfaceObjClose(PSHCLTXPROVIDERCTX pCtx, SHCLOBJHANDLE hObj); 430 int shClSvcTransferIfaceObjRead(PSHCLTXPROVIDERCTX pCtx, SHCLOBJHANDLE hObj, 415 431 void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbRead); 416 int shClSvcTransferIfaceObjWrite(PSHCL PROVIDERCTX pCtx, SHCLOBJHANDLE hObj,432 int shClSvcTransferIfaceObjWrite(PSHCLTXPROVIDERCTX pCtx, SHCLOBJHANDLE hObj, 417 433 void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbWritten); 418 434 /** @} */ … … 421 437 * @{ 422 438 */ 423 DECLCALLBACK(void) VBoxSvcClipboardTransferPrepareCallback(PSHCLT RANSFERCALLBACKDATA pData);424 DECLCALLBACK(void) VBoxSvcClipboardDataHeaderCompleteCallback(PSHCLT RANSFERCALLBACKDATA pData);425 DECLCALLBACK(void) VBoxSvcClipboardDataCompleteCallback(PSHCLT RANSFERCALLBACKDATA pData);426 DECLCALLBACK(void) VBoxSvcClipboardTransferCompleteCallback(PSHCLT RANSFERCALLBACKDATA pData, int rc);427 DECLCALLBACK(void) VBoxSvcClipboardTransferCanceledCallback(PSHCLT RANSFERCALLBACKDATA pData);428 DECLCALLBACK(void) VBoxSvcClipboardTransferErrorCallback(PSHCLT RANSFERCALLBACKDATA pData, int rc);439 DECLCALLBACK(void) VBoxSvcClipboardTransferPrepareCallback(PSHCLTXPROVIDERCTX pCtx); 440 DECLCALLBACK(void) VBoxSvcClipboardDataHeaderCompleteCallback(PSHCLTXPROVIDERCTX pCtx); 441 DECLCALLBACK(void) VBoxSvcClipboardDataCompleteCallback(PSHCLTXPROVIDERCTX pCtx); 442 DECLCALLBACK(void) VBoxSvcClipboardTransferCompleteCallback(PSHCLTXPROVIDERCTX pCtx, int rc); 443 DECLCALLBACK(void) VBoxSvcClipboardTransferCanceledCallback(PSHCLTXPROVIDERCTX pCtx); 444 DECLCALLBACK(void) VBoxSvcClipboardTransferErrorCallback(PSHCLTXPROVIDERCTX pCtx, int rc); 429 445 /** @} */ 430 446 #endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */ -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp
r86949 r87452 73 73 LogFlowFuncEnter(); 74 74 75 ShClTransferCtxDestroy(&pClient->TransferCtx); 75 /* Make sure to let the backend know that all transfers are getting destroyed. */ 76 uint32_t uIdx = 0; 77 PSHCLTRANSFER pTransfer; 78 while ((pTransfer = ShClTransferCtxGetTransferByIndex(&pClient->Transfers.Ctx, uIdx++))) 79 ShClBackendTransferDestroy(pClient, pTransfer); 80 81 ShClTransferCtxDestroy(&pClient->Transfers.Ctx); 76 82 } 77 83 78 84 79 85 /********************************************************************************************************************************* 80 * Provider i mplementation*86 * Provider interface implementation * 81 87 *********************************************************************************************************************************/ 82 88 83 DECLCALLBACK(int) shClSvcTransferIfaceOpen(PSHCLPROVIDERCTX pCtx) 84 { 85 LogFlowFuncEnter(); 86 87 RT_NOREF(pCtx); 88 89 LogFlowFuncLeave(); 90 return VINF_SUCCESS; 91 } 92 93 DECLCALLBACK(int) shClSvcTransferIfaceClose(PSHCLPROVIDERCTX pCtx) 94 { 95 LogFlowFuncEnter(); 96 97 PSHCLCLIENT pClient = (PSHCLCLIENT)pCtx->pvUser; 98 AssertPtr(pClient); 99 100 int rc = shClSvcTransferStop(pClient, pCtx->pTransfer); 101 102 LogFlowFuncLeaveRC(rc); 103 return rc; 104 } 105 106 DECLCALLBACK(int) shClSvcTransferIfaceGetRoots(PSHCLPROVIDERCTX pCtx, PSHCLROOTLIST *ppRootList) 89 DECLCALLBACK(int) shClSvcTransferIfaceGetRoots(PSHCLTXPROVIDERCTX pCtx, PSHCLROOTLIST *ppRootList) 107 90 { 108 91 LogFlowFuncEnter(); … … 124 107 HGCMSvcSetU32(&pMsgHdr->aParms[1], 0 /* fRoots */); 125 108 109 shClSvcClientLock(pClient); 110 126 111 shClSvcMsgAdd(pClient, pMsgHdr, true /* fAppend */); 127 128 112 rc = shClSvcClientWakeup(pClient); 113 114 shClSvcClientUnlock(pClient); 115 129 116 if (RT_SUCCESS(rc)) 130 117 { … … 163 150 HGCMSvcSetU32(&pMsgEntry->aParms[2], i /* uIndex */); 164 151 152 shClSvcClientLock(pClient); 165 153 shClSvcMsgAdd(pClient, pMsgEntry, true /* fAppend */); 154 shClSvcClientUnlock(pClient); 166 155 167 156 PSHCLEVENTPAYLOAD pPayloadEntry; … … 220 209 } 221 210 222 DECLCALLBACK(int) shClSvcTransferIfaceListOpen(PSHCL PROVIDERCTX pCtx,211 DECLCALLBACK(int) shClSvcTransferIfaceListOpen(PSHCLTXPROVIDERCTX pCtx, 223 212 PSHCLLISTOPENPARMS pOpenParms, PSHCLLISTHANDLE phList) 224 213 { … … 280 269 } 281 270 282 DECLCALLBACK(int) shClSvcTransferIfaceListClose(PSHCL PROVIDERCTX pCtx, SHCLLISTHANDLE hList)271 DECLCALLBACK(int) shClSvcTransferIfaceListClose(PSHCLTXPROVIDERCTX pCtx, SHCLLISTHANDLE hList) 283 272 { 284 273 LogFlowFuncEnter(); … … 326 315 } 327 316 328 DECLCALLBACK(int) shClSvcTransferIfaceListHdrRead(PSHCL PROVIDERCTX pCtx,317 DECLCALLBACK(int) shClSvcTransferIfaceListHdrRead(PSHCLTXPROVIDERCTX pCtx, 329 318 SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr) 330 319 { … … 378 367 } 379 368 380 DECLCALLBACK(int) shClSvcTransferIfaceListHdrWrite(PSHCL PROVIDERCTX pCtx,369 DECLCALLBACK(int) shClSvcTransferIfaceListHdrWrite(PSHCLTXPROVIDERCTX pCtx, 381 370 SHCLLISTHANDLE hList, PSHCLLISTHDR pListHdr) 382 371 { … … 388 377 } 389 378 390 DECLCALLBACK(int) shClSvcTransferIfaceListEntryRead(PSHCL PROVIDERCTX pCtx,379 DECLCALLBACK(int) shClSvcTransferIfaceListEntryRead(PSHCLTXPROVIDERCTX pCtx, 391 380 SHCLLISTHANDLE hList, PSHCLLISTENTRY pListEntry) 392 381 { … … 439 428 } 440 429 441 DECLCALLBACK(int) shClSvcTransferIfaceListEntryWrite(PSHCL PROVIDERCTX pCtx,430 DECLCALLBACK(int) shClSvcTransferIfaceListEntryWrite(PSHCLTXPROVIDERCTX pCtx, 442 431 SHCLLISTHANDLE hList, PSHCLLISTENTRY pListEntry) 443 432 { … … 449 438 } 450 439 451 int shClSvcTransferIfaceObjOpen(PSHCL PROVIDERCTX pCtx, PSHCLOBJOPENCREATEPARMS pCreateParms,440 int shClSvcTransferIfaceObjOpen(PSHCLTXPROVIDERCTX pCtx, PSHCLOBJOPENCREATEPARMS pCreateParms, 452 441 PSHCLOBJHANDLE phObj) 453 442 { … … 513 502 } 514 503 515 int shClSvcTransferIfaceObjClose(PSHCL PROVIDERCTX pCtx, SHCLOBJHANDLE hObj)504 int shClSvcTransferIfaceObjClose(PSHCLTXPROVIDERCTX pCtx, SHCLOBJHANDLE hObj) 516 505 { 517 506 LogFlowFuncEnter(); … … 567 556 } 568 557 569 int shClSvcTransferIfaceObjRead(PSHCL PROVIDERCTX pCtx, SHCLOBJHANDLE hObj,558 int shClSvcTransferIfaceObjRead(PSHCLTXPROVIDERCTX pCtx, SHCLOBJHANDLE hObj, 570 559 void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbRead) 571 560 { … … 627 616 } 628 617 629 int shClSvcTransferIfaceObjWrite(PSHCL PROVIDERCTX pCtx, SHCLOBJHANDLE hObj,618 int shClSvcTransferIfaceObjWrite(PSHCLTXPROVIDERCTX pCtx, SHCLOBJHANDLE hObj, 630 619 void *pvData, uint32_t cbData, uint32_t fFlags, uint32_t *pcbWritten) 631 620 { … … 1315 1304 default: 1316 1305 { 1317 if (!ShClTransferCtxGetTotalTransfers(&pClient->Transfer Ctx))1306 if (!ShClTransferCtxGetTotalTransfers(&pClient->Transfers.Ctx)) 1318 1307 { 1319 1308 LogFunc(("No transfers found\n")); … … 1331 1320 const SHCLTRANSFERID uTransferID = VBOX_SHCL_CONTEXTID_GET_TRANSFER(uCID); 1332 1321 1333 pTransfer = ShClTransferCtxGetTransfer (&pClient->TransferCtx, uTransferID);1322 pTransfer = ShClTransferCtxGetTransferById(&pClient->Transfers.Ctx, uTransferID); 1334 1323 if (!pTransfer) 1335 1324 { … … 1803 1792 * Starts a new transfer, waiting for acknowledgement by the guest side. 1804 1793 * 1794 * @note Assumes that the client's critical section is taken. 1795 * 1805 1796 * @returns VBox status code. 1806 1797 * @param pClient Client that owns the transfer. … … 1818 1809 LogFlowFuncEnter(); 1819 1810 1820 ShClTransferCtxCleanup(&pClient->TransferCtx); 1821 1822 int rc; 1823 1824 if (!ShClTransferCtxTransfersMaximumReached(&pClient->TransferCtx)) 1811 PSHCLTRANSFERCTX pTxCtx = &pClient->Transfers.Ctx; 1812 1813 ShClTransferCtxCleanup(pTxCtx); 1814 1815 int rc; 1816 1817 if (!ShClTransferCtxTransfersMaximumReached(pTxCtx)) 1825 1818 { 1826 1819 LogRel2(("Shared Clipboard: Starting %s transfer ...\n", enmDir == SHCLTRANSFERDIR_FROM_REMOTE ? "read" : "write")); … … 1830 1823 if (RT_SUCCESS(rc)) 1831 1824 { 1832 rc = ShClBackendTransferCreate(pClient, pTransfer); 1833 if (RT_SUCCESS(rc)) 1834 { 1835 SHCLPROVIDERCREATIONCTX creationCtx; 1836 RT_ZERO(creationCtx); 1837 1838 if (enmDir == SHCLTRANSFERDIR_FROM_REMOTE) 1839 { 1840 creationCtx.Interface.pfnTransferOpen = shClSvcTransferIfaceOpen; 1841 creationCtx.Interface.pfnTransferClose = shClSvcTransferIfaceClose; 1842 1843 creationCtx.Interface.pfnRootsGet = shClSvcTransferIfaceGetRoots; 1844 1845 creationCtx.Interface.pfnListOpen = shClSvcTransferIfaceListOpen; 1846 creationCtx.Interface.pfnListClose = shClSvcTransferIfaceListClose; 1847 creationCtx.Interface.pfnListHdrRead = shClSvcTransferIfaceListHdrRead; 1848 creationCtx.Interface.pfnListEntryRead = shClSvcTransferIfaceListEntryRead; 1849 1850 creationCtx.Interface.pfnObjOpen = shClSvcTransferIfaceObjOpen; 1851 creationCtx.Interface.pfnObjClose = shClSvcTransferIfaceObjClose; 1852 creationCtx.Interface.pfnObjRead = shClSvcTransferIfaceObjRead; 1853 } 1854 else if (enmDir == SHCLTRANSFERDIR_TO_REMOTE) 1855 { 1856 creationCtx.Interface.pfnListHdrWrite = shClSvcTransferIfaceListHdrWrite; 1857 creationCtx.Interface.pfnListEntryWrite = shClSvcTransferIfaceListEntryWrite; 1858 creationCtx.Interface.pfnObjWrite = shClSvcTransferIfaceObjWrite; 1859 } 1860 else 1861 AssertFailed(); 1862 1863 creationCtx.enmSource = pClient->State.enmSource; 1864 creationCtx.pvUser = pClient; 1865 1866 SHCLTRANSFERID uTransferID = 0; 1867 1868 rc = ShClTransferSetInterface(pTransfer, &creationCtx); 1825 SHCLTXPROVIDERCREATIONCTX creationCtx; 1826 RT_ZERO(creationCtx); 1827 1828 if (enmDir == SHCLTRANSFERDIR_FROM_REMOTE) 1829 { 1830 creationCtx.Interface.pfnRootsGet = shClSvcTransferIfaceGetRoots; 1831 1832 creationCtx.Interface.pfnListOpen = shClSvcTransferIfaceListOpen; 1833 creationCtx.Interface.pfnListClose = shClSvcTransferIfaceListClose; 1834 creationCtx.Interface.pfnListHdrRead = shClSvcTransferIfaceListHdrRead; 1835 creationCtx.Interface.pfnListEntryRead = shClSvcTransferIfaceListEntryRead; 1836 1837 creationCtx.Interface.pfnObjOpen = shClSvcTransferIfaceObjOpen; 1838 creationCtx.Interface.pfnObjClose = shClSvcTransferIfaceObjClose; 1839 creationCtx.Interface.pfnObjRead = shClSvcTransferIfaceObjRead; 1840 } 1841 else if (enmDir == SHCLTRANSFERDIR_TO_REMOTE) 1842 { 1843 creationCtx.Interface.pfnListHdrWrite = shClSvcTransferIfaceListHdrWrite; 1844 creationCtx.Interface.pfnListEntryWrite = shClSvcTransferIfaceListEntryWrite; 1845 creationCtx.Interface.pfnObjWrite = shClSvcTransferIfaceObjWrite; 1846 } 1847 else 1848 AssertFailed(); 1849 1850 creationCtx.enmSource = pClient->State.enmSource; 1851 creationCtx.pvUser = pClient; 1852 1853 rc = ShClTransferSetProviderIface(pTransfer, &creationCtx); 1854 if (RT_SUCCESS(rc)) 1855 { 1856 rc = ShClTransferInit(pTransfer, enmDir, enmSource); 1869 1857 if (RT_SUCCESS(rc)) 1870 1858 { 1871 rc = ShClTransferCtxTransferRegister(&pClient->TransferCtx, pTransfer, &uTransferID); 1859 SHCLTRANSFERID uTransferID = 0; 1860 rc = ShClTransferCtxTransferRegister(pTxCtx, pTransfer, &uTransferID); 1872 1861 if (RT_SUCCESS(rc)) 1873 1862 { 1874 rc = ShCl TransferInit(pTransfer, uTransferID, enmDir, enmSource);1863 rc = ShClBackendTransferCreate(pClient, pTransfer); 1875 1864 if (RT_SUCCESS(rc)) 1876 1865 { … … 1889 1878 pTransfer->State.uID)); 1890 1879 1891 PSHCLEVENTPAYLOAD pPayload; 1880 /* Leave the client's critical section before waiting. */ 1881 RTCritSectLeave(&pClient->CritSect); 1882 1883 PSHCLEVENTPAYLOAD pPayload = NULL; 1892 1884 rc = ShClEventWait(&pTransfer->Events, idEvent, pTransfer->uTimeoutMs, &pPayload); 1893 1885 if (RT_SUCCESS(rc)) … … 1907 1899 ShClTransferStatusToStr(pReply->u.TransferStatus.uStatus), 1908 1900 pReply->rc, pTransfer->State.uID)); 1901 1902 rc = pReply->rc; /* Set guest rc. */ 1909 1903 } 1910 1904 else 1911 1905 LogRel(("Shared Clipboard: Unable to start transfer %RU32 on guest, rc=%Rrc\n", 1912 1906 pTransfer->State.uID, rc)); 1907 1908 ShClPayloadFree(pPayload); 1909 1910 /* Re-enter the client's critical section again. */ 1911 RTCritSectEnter(&pClient->CritSect); 1913 1912 } 1914 1913 } 1915 1914 } 1916 1917 if (RT_FAILURE(rc))1918 ShClTransferCtxTransferUnregister(&pClient->TransferCtx, uTransferID);1919 1915 } 1916 1917 if (RT_FAILURE(rc)) 1918 ShClTransferCtxTransferUnregister(pTxCtx, uTransferID); 1920 1919 } 1921 1920 } … … 1974 1973 /* Regardless of whether the guest was able to report back and/or stop the transfer, remove the transfer on the host 1975 1974 * so that we don't risk of having stale transfers here. */ 1976 int rc2 = ShClTransferCtxTransferUnregister(&pClient->Transfer Ctx, ShClTransferGetID(pTransfer));1975 int rc2 = ShClTransferCtxTransferUnregister(&pClient->Transfers.Ctx, ShClTransferGetID(pTransfer)); 1977 1976 if (RT_SUCCESS(rc2)) 1978 1977 { 1978 ShClBackendTransferDestroy(pClient, pTransfer); 1979 1979 ShClTransferDestroy(pTransfer); 1980 1980 pTransfer = NULL; … … 1998 1998 g_fTransferMode = fMode; 1999 1999 2000 #ifdef DEBUG_andy 2001 g_fTransferMode = VBOX_SHCL_TRANSFER_MODE_ENABLED; 2002 #endif 2003 2000 2004 LogRel2(("Shared Clipboard: File transfers are now %s\n", 2001 2005 g_fTransferMode != VBOX_SHCL_TRANSFER_MODE_DISABLED ? "enabled" : "disabled")); -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-x11.cpp
r87082 r87452 250 250 } 251 251 252 /** 253 * Reports formats available in the X11 clipboard to VBox. 254 * 255 * @note Runs in Xt event thread. 256 * 257 * @param pCtx Opaque context pointer for the glue code. 258 * @param fFormats The formats available. 259 */ 252 /** @copydoc ShClX11ReportFormatsCallback */ 260 253 DECLCALLBACK(void) ShClX11ReportFormatsCallback(PSHCLCONTEXT pCtx, uint32_t fFormats) 261 254 { 262 255 LogFlowFunc(("pCtx=%p, fFormats=%#x\n", pCtx, fFormats)); 256 257 PSHCLCLIENT pClient = pCtx->pClient; 258 AssertPtr(pClient); 259 260 RTCritSectEnter(&pClient->CritSect); 263 261 264 262 /** @todo r=bird: BUGBUG: Revisit this */ … … 269 267 RT_NOREF(rc); 270 268 271 LogFlowFuncLeaveRC(rc); 272 } 273 274 /** 275 * Completes a request from the host service for reading the X11 clipboard data. 276 * The data should be written to the buffer provided in the initial request. 277 * 278 * @note Runs in Xt event thread. 279 * 280 * @param pCtx Request context information. 281 * @param rcCompletion The completion status of the request. 282 * @param pReq Request to complete. Will be free'd by the callback. 283 * @param pv Address of data from completed request. Optional. 284 * @param cb Size (in bytes) of data from completed request. Optional. 285 * 286 * @todo Change this to deal with the buffer issues rather than offloading them onto the caller. 287 */ 269 RTCritSectLeave(&pClient->CritSect); 270 271 LogFlowFuncLeaveRC(rc); 272 } 273 274 /** @copydoc ShClX11RequestFromX11CompleteCallback */ 288 275 DECLCALLBACK(void) ShClX11RequestFromX11CompleteCallback(PSHCLCONTEXT pCtx, int rcCompletion, 289 276 CLIPREADCBREQ *pReq, void *pv, uint32_t cb) … … 322 309 } 323 310 324 /** 325 * Callback implementation for reading clipboard data from the guest. 326 * 327 * @note Runs in Xt event thread. 328 * 329 * @returns VBox status code. VERR_NO_DATA if no data available. 330 * @param pCtx Pointer to the host clipboard structure. 331 * @param uFmt The format in which the data should be transferred 332 * (VBOX_SHCL_FMT_XXX). 333 * @param ppv Returns an allocated buffer with data read from the guest on success. 334 * Needs to be free'd with RTMemFree() by the caller. 335 * @param pcb Returns the amount of data read (in bytes) on success. 336 */ 311 /** @copydoc ShClX11RequestDataForX11Callback */ 337 312 DECLCALLBACK(int) ShClX11RequestDataForX11Callback(PSHCLCONTEXT pCtx, SHCLFORMAT uFmt, void **ppv, uint32_t *pcb) 338 313 { … … 346 321 } 347 322 348 int rc; 323 PSHCLCLIENT pClient = pCtx->pClient; 324 AssertPtr(pClient); 325 326 RTCritSectEnter(&pClient->CritSect); 327 328 int rc = VINF_SUCCESS; 349 329 350 330 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 331 /* 332 * Note: We always return a generic URI list here. 333 * As we don't know which Atom target format was requested by the caller, the X11 clipboard codes needs 334 * to decide & transform the list into the actual clipboard Atom target format the caller wanted. 335 */ 351 336 if (uFmt == VBOX_SHCL_FMT_URI_LIST) 352 337 { 338 PSHCLTRANSFER pTransfer; 339 rc = shClSvcTransferStart(pCtx->pClient, 340 SHCLTRANSFERDIR_FROM_REMOTE, SHCLSOURCE_REMOTE, 341 &pTransfer); 342 if (RT_SUCCESS(rc)) 343 { 344 345 } 346 else 347 LogRel(("Shared Clipboard: Initializing read transfer from guest failed with %Rrc\n", rc)); 348 353 349 *ppv = NULL; 354 350 *pcb = 0; … … 356 352 rc = VERR_NO_DATA; 357 353 } 358 else359 354 #endif 355 356 if (RT_SUCCESS(rc)) 360 357 { 361 358 /* Request data from the guest. */ … … 364 361 if (RT_SUCCESS(rc)) 365 362 { 363 RTCritSectLeave(&pClient->CritSect); 364 366 365 PSHCLEVENTPAYLOAD pPayload; 367 366 rc = ShClEventWait(&pCtx->pClient->EventSrc, idEvent, 30 * 1000, &pPayload); … … 380 379 } 381 380 381 RTCritSectEnter(&pClient->CritSect); 382 382 383 ShClEventRelease(&pCtx->pClient->EventSrc, idEvent); 383 384 ShClEventUnregister(&pCtx->pClient->EventSrc, idEvent); … … 385 386 } 386 387 388 RTCritSectLeave(&pClient->CritSect); 389 387 390 if (RT_FAILURE(rc)) 388 391 LogRel(("Shared Clipboard: Requesting data in format %#x for X11 host failed with %Rrc\n", uFmt, rc)); … … 396 399 int ShClBackendTransferCreate(PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer) 397 400 { 401 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP 402 return ShClHttpTransferCreate(&pClient->State.pCtx->X11.HttpCtx, pTransfer); 403 #else 398 404 RT_NOREF(pClient, pTransfer); 399 400 int rc = VINF_SUCCESS; 401 402 LogFlowFuncLeaveRC(rc); 403 return rc; 405 #endif 406 return VERR_NOT_IMPLEMENTED; 404 407 } 405 408 406 409 int ShClBackendTransferDestroy(PSHCLCLIENT pClient, PSHCLTRANSFER pTransfer) 407 410 { 411 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP 412 return ShClHttpTransferDestroy(&pClient->State.pCtx->X11.HttpCtx, pTransfer); 413 #else 408 414 RT_NOREF(pClient, pTransfer); 409 410 int rc = VINF_SUCCESS; 411 412 LogFlowFuncLeaveRC(rc); 413 return rc; 415 #endif 416 417 return VINF_SUCCESS; 414 418 } 415 419 … … 452 456 return rc; 453 457 } 454 455 458 #endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */ 459 -
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc.cpp
r86959 r87452 243 243 PVBOXHGCMSVCHELPERS g_pHelpers; 244 244 245 static RTCRITSECT g_CritSect; 245 static RTCRITSECT g_CritSect; /** @todo r=andy Put this into some instance struct, avoid globals. */ 246 246 /** Global Shared Clipboard mode. */ 247 247 static uint32_t g_uMode = VBOX_SHCL_MODE_OFF; … … 324 324 } 325 325 326 /** 327 * Takes the global Shared Clipboard service lock. 328 * 329 * @returns \c true if locking was successful, or \c false if not. 330 */ 326 331 bool ShClSvcLock(void) 327 332 { … … 329 334 } 330 335 336 /** 337 * Unlocks the formerly locked global Shared Clipboard service lock. 338 */ 331 339 void ShClSvcUnlock(void) 332 340 { … … 561 569 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 562 570 if (RT_SUCCESS(rc)) 563 rc = ShClTransferCtxInit(&pClient->Transfer Ctx);571 rc = ShClTransferCtxInit(&pClient->Transfers.Ctx); 564 572 #endif 565 573 } … … 617 625 618 626 LogFlowFuncLeave(); 627 } 628 629 void shClSvcClientLock(PSHCLCLIENT pClient) 630 { 631 int rc2 = RTCritSectEnter(&pClient->CritSect); 632 AssertRC(rc2); 633 } 634 635 void shClSvcClientUnlock(PSHCLCLIENT pClient) 636 { 637 int rc2 = RTCritSectLeave(&pClient->CritSect); 638 AssertRC(rc2); 619 639 } 620 640 … … 1396 1416 { 1397 1417 fFormats &= ~VBOX_SHCL_FMT_URI_LIST; 1398 } 1399 else 1400 LogRel2(("Shared Clipboard: Warning: File transfers are disabled, ignoring\n")); 1418 LogRel2(("Shared Clipboard: File transfers are disabled, skipping reporting those to the guest\n")); 1419 } 1401 1420 #endif 1402 1421 … … 2026 2045 2027 2046 #ifdef LOG_ENABLED 2028 Log Func(("u32ClientID=%RU32, fn=%RU32 (%s), cParms=%RU32, paParms=%p\n",2029 u32ClientID, u32Function, ShClGuestMsgToStr(u32Function), cParms, paParms));2047 Log2Func(("u32ClientID=%RU32, fn=%RU32 (%s), cParms=%RU32, paParms=%p\n", 2048 u32ClientID, u32Function, ShClGuestMsgToStr(u32Function), cParms, paParms)); 2030 2049 for (uint32_t i = 0; i < cParms; i++) 2031 2050 { … … 2033 2052 { 2034 2053 case VBOX_HGCM_SVC_PARM_32BIT: 2035 Log Func((" paParms[%RU32]: type uint32_t - value %RU32\n", i, paParms[i].u.uint32));2054 Log3Func((" paParms[%RU32]: type uint32_t - value %RU32\n", i, paParms[i].u.uint32)); 2036 2055 break; 2037 2056 case VBOX_HGCM_SVC_PARM_64BIT: 2038 Log Func((" paParms[%RU32]: type uint64_t - value %RU64\n", i, paParms[i].u.uint64));2057 Log3Func((" paParms[%RU32]: type uint64_t - value %RU64\n", i, paParms[i].u.uint64)); 2039 2058 break; 2040 2059 case VBOX_HGCM_SVC_PARM_PTR: 2041 Log Func((" paParms[%RU32]: type ptr - value 0x%p (%RU32 bytes)\n",2042 i, paParms[i].u.pointer.addr, paParms[i].u.pointer.size));2060 Log3Func((" paParms[%RU32]: type ptr - value 0x%p (%RU32 bytes)\n", 2061 i, paParms[i].u.pointer.addr, paParms[i].u.pointer.size)); 2043 2062 break; 2044 2063 case VBOX_HGCM_SVC_PARM_PAGES: 2045 Log Func((" paParms[%RU32]: type pages - cb=%RU32, cPages=%RU16\n",2046 i, paParms[i].u.Pages.cb, paParms[i].u.Pages.cPages));2064 Log3Func((" paParms[%RU32]: type pages - cb=%RU32, cPages=%RU16\n", 2065 i, paParms[i].u.Pages.cb, paParms[i].u.Pages.cPages)); 2047 2066 break; 2048 2067 default: … … 2050 2069 } 2051 2070 } 2052 Log Func(("Client state: fFlags=0x%x, fGuestFeatures0=0x%x, fGuestFeatures1=0x%x\n",2053 pClient->State.fFlags, pClient->State.fGuestFeatures0, pClient->State.fGuestFeatures1));2071 Log2Func(("Client state: fFlags=0x%x, fGuestFeatures0=0x%x, fGuestFeatures1=0x%x\n", 2072 pClient->State.fFlags, pClient->State.fGuestFeatures0, pClient->State.fGuestFeatures1)); 2054 2073 #endif 2055 2074 … … 2122 2141 if (RT_SUCCESS(rc)) 2123 2142 { 2124 LogRel(("Shared Clipboard: Error from guest side: %Rrc\n", rcGuest));2125 2126 /* Reset client state and start over. */2127 shclSvcClientStateReset(&pClient->State); 2143 LogRel(("Shared Clipboard: Error reported from guest side: %Rrc\n", rcGuest)); 2144 2145 shClSvcClientLock(pClient); 2146 2128 2147 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 2129 2148 shClSvcClientTransfersReset(pClient); 2130 2149 #endif 2150 shClSvcClientUnlock(pClient); 2131 2151 } 2132 2152 break; -
trunk/src/VBox/HostServices/SharedClipboard/testcase/tstClipboardTransfers.cpp
r82968 r87452 235 235 RTTESTI_CHECK_RC_OK(rc); 236 236 237 rc = ShClTransferInit(pTransfer, 0 /* ID */,SHCLTRANSFERDIR_FROM_REMOTE, SHCLSOURCE_LOCAL);237 rc = ShClTransferInit(pTransfer, SHCLTRANSFERDIR_FROM_REMOTE, SHCLSOURCE_LOCAL); 238 238 RTTESTI_CHECK_RC_OK(rc); 239 239
Note:
See TracChangeset
for help on using the changeset viewer.