Changeset 86967 in vbox for trunk/src/VBox/Additions
- Timestamp:
- Nov 24, 2020 1:42:29 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 141497
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/x11/VBoxClient/clipboard.cpp
r86873 r86967 41 41 #include "VBoxClient.h" 42 42 43 #include "clipboard.h" 43 44 #ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE 44 45 # include "clipboard-fuse.h" … … 50 51 *********************************************************************************************************************************/ 51 52 52 #ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE 53 typedef struct _SHCLCTXFUSE 54 { 55 RTTHREAD Thread; 56 } SHCLCTXFUSE; 57 #endif /* VBOX_WITH_SHARED_CLIPBOARD_FUSE */ 58 59 /** 60 * Struct keeping a Shared Clipboard context. 61 */ 62 struct SHCLCONTEXT 63 { 64 /** Client command context */ 65 VBGLR3SHCLCMDCTX CmdCtx; 66 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 67 /** Associated transfer data. */ 68 SHCLTRANSFERCTX TransferCtx; 53 /** Only one context is supported at a time for now. */ 54 SHCLCONTEXT g_Ctx; 55 SHCLFUSECTX g_FuseCtx; 56 57 58 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 59 static DECLCALLBACK(int) vbclShClOnTransferInitCallback(PSHCLTRANSFERCALLBACKDATA pData) 60 { 69 61 # ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE 70 SHCLCTXFUSE FUSE; 62 return ShClFuseOnTransferInitCallback(pData); 63 # else 64 # error "Implement me!" 65 return VERR_NOT_IMPLEMENTED; 71 66 # endif 72 #endif 73 /** X11 clipboard context. */ 74 SHCLX11CTX X11; 75 }; 76 77 /** Only one context is supported at a time for now. */ 78 static SHCLCONTEXT g_Ctx; 79 67 } 68 69 static DECLCALLBACK(int) vbclShClOnTransferStartCallback(PSHCLTRANSFERCALLBACKDATA pData) 70 { 71 # ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE 72 return ShClFuseOnTransferStartCallback(pData); 73 # else 74 # error "Implement me!" 75 return VERR_NOT_IMPLEMENTED; 76 # endif 77 } 78 79 static DECLCALLBACK(void) vbclShClOnTransferCompleteCallback(PSHCLTRANSFERCALLBACKDATA pData, int rc) 80 { 81 # ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE 82 return ShClFuseOnTransferCompleteCallback(pData, rc); 83 # else 84 # error "Implement me!" 85 # endif 86 } 87 88 static DECLCALLBACK(void) vbclShClOnTransferErrorCallback(PSHCLTRANSFERCALLBACKDATA pData, int rc) 89 { 90 # ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE 91 return ShClFuseOnTransferErrorCallback(pData, rc); 92 # else 93 # error "Implement me!" 94 # endif 95 } 96 #endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */ 80 97 81 98 /** … … 370 387 } 371 388 372 #ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE373 static DECLCALLBACK(int) vboxClipoardFUSEThread(RTTHREAD hThreadSelf, void *pvUser)374 {375 RT_NOREF(pvUser);376 377 VbglR3Init();378 379 LogFlowFuncEnter();380 381 RTThreadUserSignal(hThreadSelf);382 383 SHCL_FUSE_OPTS Opts;384 RT_ZERO(Opts);385 386 Opts.fForeground = true;387 Opts.fSingleThreaded = false; /** @todo Do we want multithread here? */388 389 int rc = RTPathTemp(Opts.szMountPoint, sizeof(Opts.szMountPoint));390 if (RT_SUCCESS(rc))391 {392 rc = RTPathAppend(Opts.szMountPoint, sizeof(Opts.szMountPoint), "VBoxSharedClipboard");393 if (RT_SUCCESS(rc))394 {395 rc = RTDirCreate(Opts.szMountPoint, 0700,396 RTDIRCREATE_FLAGS_NO_SYMLINKS);397 if (rc == VERR_ALREADY_EXISTS)398 rc = VINF_SUCCESS;399 }400 }401 402 if (RT_SUCCESS(rc))403 {404 rc = ShClFuseMain(&Opts);405 }406 else407 VBClLogError("Error creating FUSE mount directory, rc=%Rrc\n", rc);408 409 LogFlowFuncLeaveRC(rc);410 return rc;411 }412 413 static int vboxClipboardFUSEStart(void)414 {415 LogFlowFuncEnter();416 417 PSHCLCONTEXT pCtx = &g_Ctx;418 419 int rc = RTThreadCreate(&pCtx->FUSE.Thread, vboxClipoardFUSEThread, &pCtx->FUSE, 0,420 RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "SHCLFUSE");421 if (RT_SUCCESS(rc))422 rc = RTThreadUserWait(pCtx->FUSE.Thread, 30 * 1000);423 424 LogFlowFuncLeaveRC(rc);425 return rc;426 }427 428 static int vboxClipboardFUSEStop(void)429 {430 LogFlowFuncEnter();431 432 PSHCLCONTEXT pCtx = &g_Ctx;433 434 int rcThread;435 int rc = RTThreadWait(pCtx->FUSE.Thread, 1000, &rcThread);436 437 LogFlowFuncLeaveRC(rc);438 return rc;439 }440 #endif /* VBOX_WITH_SHARED_CLIPBOARD_FUSE */441 442 389 /** 443 390 * @interface_method_impl{VBCLSERVICE,pfnInit} … … 448 395 449 396 #ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS 397 /* Install callbacks. */ 398 RT_ZERO(g_Ctx.CmdCtx.Transfers.Callbacks); 399 400 g_Ctx.CmdCtx.Transfers.Callbacks.pvUser = &g_Ctx; /* Assign context as user-provided callback data. */ 401 g_Ctx.CmdCtx.Transfers.Callbacks.cbUser = sizeof(SHCLCONTEXT); 402 403 g_Ctx.CmdCtx.Transfers.Callbacks.pfnTransferInitialize = vbclShClOnTransferInitCallback; 404 g_Ctx.CmdCtx.Transfers.Callbacks.pfnTransferStart = vbclShClOnTransferStartCallback; 405 g_Ctx.CmdCtx.Transfers.Callbacks.pfnTransferComplete = vbclShClOnTransferCompleteCallback; 406 g_Ctx.CmdCtx.Transfers.Callbacks.pfnTransferError = vbclShClOnTransferErrorCallback; 407 450 408 rc = ShClTransferCtxInit(&g_Ctx.TransferCtx); 451 409 #else … … 469 427 { 470 428 #ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE 471 rc = vboxClipboardFUSEStart();429 rc = VbClShClFUSEInit(&g_FuseCtx, &g_Ctx); 472 430 if (RT_SUCCESS(rc)) 473 431 { 474 #endif 475 /* Let the main thread know that it can continue spawning services. */ 476 RTThreadUserSignal(RTThreadSelf()); 477 478 rc = vboxClipboardMain(); 432 rc = VbClShClFUSEStart(&g_FuseCtx); 433 if (RT_SUCCESS(rc)) 434 { 435 #endif 436 /* Let the main thread know that it can continue spawning services. */ 437 RTThreadUserSignal(RTThreadSelf()); 438 439 rc = vboxClipboardMain(); 479 440 480 441 #ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE 481 int rc2 = vboxClipboardFUSEStop(); 482 if (RT_SUCCESS(rc)) 483 rc = rc2; 442 int rc2 = VbClShClFUSEStop(&g_FuseCtx); 443 if (RT_SUCCESS(rc)) 444 rc = rc2; 445 } 484 446 } 485 447 #endif
Note:
See TracChangeset
for help on using the changeset viewer.