VirtualBox

Changeset 86967 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Nov 24, 2020 1:42:29 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
141497
Message:

Shared Clipboard/Transfers: Initial working PoC for host -> guest transfers. bugref:9437

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/x11/VBoxClient/clipboard.cpp

    r86873 r86967  
    4141#include "VBoxClient.h"
    4242
     43#include "clipboard.h"
    4344#ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE
    4445# include "clipboard-fuse.h"
     
    5051*********************************************************************************************************************************/
    5152
    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. */
     54SHCLCONTEXT g_Ctx;
     55SHCLFUSECTX g_FuseCtx;
     56
     57
     58#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
     59static DECLCALLBACK(int) vbclShClOnTransferInitCallback(PSHCLTRANSFERCALLBACKDATA pData)
     60{
    6961# ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE
    70     SHCLCTXFUSE      FUSE;
     62    return ShClFuseOnTransferInitCallback(pData);
     63# else
     64    # error "Implement me!"
     65    return VERR_NOT_IMPLEMENTED;
    7166# 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
     69static 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
     79static 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
     88static 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 */
    8097
    8198/**
     
    370387}
    371388
    372 #ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE
    373 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     else
    407         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 
    442389/**
    443390 * @interface_method_impl{VBCLSERVICE,pfnInit}
     
    448395
    449396#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
    450408    rc = ShClTransferCtxInit(&g_Ctx.TransferCtx);
    451409#else
     
    469427    {
    470428#ifdef VBOX_WITH_SHARED_CLIPBOARD_FUSE
    471         rc = vboxClipboardFUSEStart();
     429        rc = VbClShClFUSEInit(&g_FuseCtx, &g_Ctx);
    472430        if (RT_SUCCESS(rc))
    473431        {
    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();
    479440
    480441#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            }
    484446        }
    485447#endif
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