VirtualBox

Changeset 78897 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
May 31, 2019 3:23:14 PM (6 years ago)
Author:
vboxsync
Message:

Shared Clipboard/URI: Update.

Location:
trunk/src/VBox/Main
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/Makefile.kmk

    r78683 r78897  
    136136ifdef VBOX_WITH_SDS
    137137VBOX_MAIN_DEFS += VBOX_WITH_SDS
     138endif
     139ifdef VBOX_WITH_SHARED_CLIPBOARD
     140VBOX_MAIN_DEFS += VBOX_WITH_SHARED_CLIPBOARD
     141 if VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     142  VBOX_MAIN_DEFS += VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     143 endif
    138144endif
    139145ifdef VBOX_WITH_USB_CARDREADER
     
    681687endif
    682688
     689ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     690 VBoxSVC_SOURCES += $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardCache.cpp
     691endif
     692
    683693$(call KB_FN_DO_PASS0_ON_TARGET,VBoxSVC) # Sets VBoxSVC_0_OUTDIR
    684694
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r78896 r78897  
    43894389  <interface
    43904390    name="IInternalMachineControl" extends="$unknown"
    4391     uuid="cdbc59df-4f4d-4cf2-809c-917601355afc"
     4391    uuid="0075FD6C-00C2-4484-0077-C057003D9C90"
    43924392    internal="yes"
    43934393    wsmap="suppress"
     
    45914591      </param>
    45924592    </method>
    4593 
     4593    <method name="clipboardAreaRegister">
     4594      <desc>
     4595        Registers a new clipboard area.
     4596      </desc>
     4597      <param name="parms" type="wstring" dir="in" safearray="yes">
     4598        <desc>
     4599          Registration parameters. Currently not used and therefore ignored.
     4600        </desc>
     4601      </param>
     4602      <param name="id" type="unsigned long" dir="out">
     4603        <desc>
     4604          Returns the new clipboard area which got registered.
     4605        </desc>
     4606      </param>
     4607    </method>
     4608    <method name="clipboardAreaUnregister">
     4609      <desc>
     4610        Unregisters a formerly registered clipboard area.
     4611      </desc>
     4612      <param name="id" type="unsigned long" dir="in">
     4613        <desc>
     4614          Clipboard area to unregister.
     4615        </desc>
     4616      </param>
     4617    </method>
     4618    <method name="clipboardAreaAttach">
     4619      <desc>
     4620        Attaches to a registered clipboard area.
     4621      </desc>
     4622      <param name="id" type="unsigned long" dir="in">
     4623        <desc>
     4624          Clipboard area to attach to.
     4625        </desc>
     4626      </param>
     4627    </method>
     4628    <method name="clipboardAreaDetach">
     4629      <desc>
     4630        Detaches from a registered clipboard area.
     4631      </desc>
     4632      <param name="id" type="unsigned long" dir="in">
     4633        <desc>
     4634          Clipboard area to detach from.
     4635        </desc>
     4636      </param>
     4637    </method>
     4638    <method name="clipboardAreaGetMostRecent">
     4639      <desc>
     4640        Returns the most recent (last registered) clipboard area.
     4641      </desc>
     4642      <param name="id" type="unsigned long" dir="out">
     4643        <desc>
     4644          Returns the most recent clipboard area.
     4645        </desc>
     4646      </param>
     4647    </method>
     4648    <method name="clipboardAreaGetRefCount">
     4649      <desc>
     4650        Returns the current reference count of a clipboard area.
     4651      </desc>
     4652      <param name="id" type="unsigned long" dir="in">
     4653        <desc>
     4654          Clipboard area to return reference count for.
     4655        </desc>
     4656      </param>
     4657      <param name="refcount" type="unsigned long" dir="out">
     4658        <desc>
     4659          Returns the current reference count.
     4660        </desc>
     4661      </param>
     4662    </method>
    45944663    <method name="pushGuestProperty">
    45954664      <desc>
  • trunk/src/VBox/Main/include/ConsoleImpl.h

    r78779 r78897  
    865865#endif
    866866
     867#ifdef VBOX_WITH_SHARED_CLIPBOARD
     868    /** @name Shared Clipboard support
     869     * @{ */
     870    static DECLCALLBACK(int) i_sharedClipboardServiceCallback(void *pvExtension, uint32_t u32Function,
     871                                                              void *pvParms, uint32_t cbParms);
     872    /** @} */
     873#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
     874
    867875    /** @name Disk encryption support
    868876     * @{ */
  • trunk/src/VBox/Main/include/ConsoleVRDPServer.h

    r76562 r78897  
    139139    void SendAudioVolume (uint16_t left, uint16_t right) const;
    140140    void SendUSBRequest (uint32_t u32ClientId, void *pvParms, uint32_t cbParms) const;
     141    void SendClipboard (uint32_t u32Function, uint32_t u32Format,
     142                        void *pvData, uint32_t cbData, uint32_t *pcbActualRead) const;
    141143
    142144    void QueryInfo (uint32_t index, void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut) const;
     
    220222
    221223    int mcClipboardRefs;
    222     HGCMSVCEXTHANDLE mhClipboard;
    223224    PFNVRDPCLIPBOARDEXTCALLBACK mpfnClipboardCallback;
    224225
    225226    static DECLCALLBACK(int) ClipboardCallback (void *pvCallback, uint32_t u32ClientId, uint32_t u32Function, uint32_t u32Format, const void *pvData, uint32_t cbData);
    226     static DECLCALLBACK(int) ClipboardServiceExtension (void *pvExtension, uint32_t u32Function, void *pvParm, uint32_t cbParms);
    227227
    228228#ifdef VBOX_WITH_USB
  • trunk/src/VBox/Main/include/MachineImpl.h

    r78632 r78897  
    12281228                         ComPtr<IProgress> &aProgress);
    12291229    HRESULT finishOnlineMergeMedium();
     1230    HRESULT clipboardAreaRegister(const std::vector<com::Utf8Str> &aParms, ULONG *aID);
     1231    HRESULT clipboardAreaUnregister(ULONG aID);
     1232    HRESULT clipboardAreaAttach(ULONG aID);
     1233    HRESULT clipboardAreaDetach(ULONG aID);
     1234    HRESULT clipboardAreaGetMostRecent(ULONG *aID);
     1235    HRESULT clipboardAreaGetRefCount(ULONG aID, ULONG *aRefCount);
    12301236    HRESULT pullGuestProperties(std::vector<com::Utf8Str> &aNames,
    12311237                                std::vector<com::Utf8Str> &aValues,
     
    13831389                         ComPtr<IProgress> &aProgress);
    13841390    HRESULT finishOnlineMergeMedium();
     1391    HRESULT clipboardAreaRegister(const std::vector<com::Utf8Str> &aParms, ULONG *aID);
     1392    HRESULT clipboardAreaUnregister(ULONG aID);
     1393    HRESULT clipboardAreaAttach(ULONG aID);
     1394    HRESULT clipboardAreaDetach(ULONG aID);
     1395    HRESULT clipboardAreaGetMostRecent(ULONG *aID);
     1396    HRESULT clipboardAreaGetRefCount(ULONG aID, ULONG *aRefCount);
    13851397    HRESULT pullGuestProperties(std::vector<com::Utf8Str> &aNames,
    13861398                                std::vector<com::Utf8Str> &aValues,
  • trunk/src/VBox/Main/include/VirtualBoxImpl.h

    r78261 r78897  
    7272#endif
    7373
     74#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     75struct SharedClipboardAreaData;
     76#endif
    7477
    7578class ATL_NO_VTABLE VirtualBox :
     
    170173    void i_onSnapshotRestored(const Guid &aMachineId, const Guid &aSnapshotId);
    171174    void i_onSnapshotChange(const Guid &aMachineId, const Guid &aSnapshotId);
     175
     176#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     177    int i_onClipboardAreaCreate(SharedClipboardAreaData &AreaData, uint32_t fFlags);
     178    int i_onClipboardAreaDestroy(SharedClipboardAreaData &AreaData);
     179    int i_onClipboardAreaRegister(const std::vector<com::Utf8Str> &aParms, ULONG *aID);
     180    int i_onClipboardAreaUnregister(ULONG aID);
     181    int i_onClipboardAreaAttach(ULONG aID);
     182    int i_onClipboardAreaDetach(ULONG aID);
     183    ULONG i_onClipboardAreaGetMostRecent(void);
     184    ULONG i_onClipboardAreaGetRefCount(ULONG aID);
     185#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
     186
    172187    void i_onGuestPropertyChange(const Guid &aMachineId, IN_BSTR aName, IN_BSTR aValue,
    173188                                 IN_BSTR aFlags);
  • trunk/src/VBox/Main/src-client/ConsoleImpl.cpp

    r78779 r78897  
    126126#include <VBox/VMMDev.h>
    127127
     128#ifdef VBOX_WITH_SHARED_CLIPBOARD
    128129#include <VBox/HostServices/VBoxClipboardSvc.h>
     130# ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     131#  include "SharedClipboardPrivate.h"
     132# endif
     133#endif
    129134#include <VBox/HostServices/DragAndDropSvc.h>
    130135#ifdef VBOX_WITH_GUEST_PROPS
     
    20852090HRESULT Console::setUseHostClipboard(BOOL aUseHostClipboard)
    20862091{
    2087     mfUseHostClipboard = !!aUseHostClipboard;
     2092    if (mfUseHostClipboard != RT_BOOL(aUseHostClipboard))
     2093    {
     2094        mfUseHostClipboard = RT_BOOL(aUseHostClipboard);
     2095        LogRel(("Shared Clipboard: %s using host clipboard\n", mfUseHostClipboard ? "Enabled" : "Disabled"));
     2096    }
    20882097
    20892098    return S_OK;
     
    83998408}
    84008409
     8410#ifdef VBOX_WITH_SHARED_CLIPBOARD
     8411/* static */
     8412DECLCALLBACK(int) Console::i_sharedClipboardServiceCallback(void *pvExtension, uint32_t u32Function,
     8413                                                            void *pvParms, uint32_t cbParms)
     8414{
     8415    LogFlowFunc(("pvExtension=%p, u32Function=%RU32, pvParms=%p, cbParms=%RU32\n",
     8416                 pvExtension, u32Function, pvParms, cbParms));
     8417
     8418    RT_NOREF(pvParms, cbParms);
     8419
     8420    Console *pThis = reinterpret_cast<Console *>(pvExtension);
     8421    AssertPtrReturn(pThis, VERR_INVALID_POINTER);
     8422
     8423    ComPtr<IInternalMachineControl> pControl = pThis->mControl;
     8424
     8425    int rc = VINF_SUCCESS;
     8426    HRESULT hrc;
     8427
     8428#define H()         AssertMsgBreakStmt(!FAILED(hrc), ("hrc=%Rhrc\n", hrc), rc = VERR_GENERAL_FAILURE)
     8429
     8430    switch (u32Function)
     8431    {
     8432        case VBOX_CLIPBOARD_EXT_FN_SET_CALLBACK:
     8433        {
     8434            LogFlowFunc(("VBOX_CLIPBOARD_EXT_FN_SET_CALLBACK\n"));
     8435        } break;
     8436
     8437        case VBOX_CLIPBOARD_EXT_FN_FORMAT_ANNOUNCE:
     8438        {
     8439            LogFlowFunc(("VBOX_CLIPBOARD_EXT_FN_FORMAT_ANNOUNCE\n"));
     8440
     8441            VBOXCLIPBOARDEXTPARMS *pParms = (VBOXCLIPBOARDEXTPARMS *)pvParms;
     8442
     8443            /* The guest announces clipboard formats. This must be delivered to all clients. */
     8444            if (pThis->mConsoleVRDPServer)
     8445                pThis->mConsoleVRDPServer->SendClipboard(VRDE_CLIPBOARD_FUNCTION_FORMAT_ANNOUNCE,
     8446                                                         pParms->u32Format,
     8447                                                         NULL,
     8448                                                         0,
     8449                                                         NULL);
     8450        } break;
     8451
     8452        case VBOX_CLIPBOARD_EXT_FN_DATA_READ:
     8453        {
     8454            LogFlowFunc(("VBOX_CLIPBOARD_EXT_FN_DATA_READ\n"));
     8455
     8456            VBOXCLIPBOARDEXTPARMS *pParms = (VBOXCLIPBOARDEXTPARMS *)pvParms;
     8457
     8458            /* The clipboard service expects that the pvData buffer will be filled
     8459             * with clipboard data. The server returns the data from the client that
     8460             * announced the requested format most recently.
     8461             */
     8462            if (pThis->mConsoleVRDPServer)
     8463                pThis->mConsoleVRDPServer->SendClipboard(VRDE_CLIPBOARD_FUNCTION_DATA_READ,
     8464                                                         pParms->u32Format,
     8465                                                         pParms->u.pvData,
     8466                                                         pParms->cbData,
     8467                                                         &pParms->cbData);
     8468        } break;
     8469
     8470        case VBOX_CLIPBOARD_EXT_FN_DATA_WRITE:
     8471        {
     8472            LogFlowFunc(("VBOX_CLIPBOARD_EXT_FN_DATA_WRITE\n"));
     8473
     8474            VBOXCLIPBOARDEXTPARMS *pParms = (VBOXCLIPBOARDEXTPARMS *)pvParms;
     8475
     8476            if (pThis->mConsoleVRDPServer)
     8477                pThis->mConsoleVRDPServer->SendClipboard(VRDE_CLIPBOARD_FUNCTION_DATA_WRITE,
     8478                                                         pParms->u32Format,
     8479                                                         pParms->u.pvData,
     8480                                                         pParms->cbData,
     8481                                                         NULL);
     8482        } break;
     8483
     8484#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     8485        case VBOX_CLIPBOARD_EXT_FN_AREA_REGISTER:
     8486        {
     8487            com::SafeArray<BSTR> abstrParms; /* Empty for now. */
     8488            ULONG uID;
     8489            hrc = pControl->ClipboardAreaRegister(ComSafeArrayAsInParam(abstrParms), &uID);      H();
     8490        } break;
     8491
     8492        case VBOX_CLIPBOARD_EXT_FN_AREA_UNREGISTER:
     8493        {
     8494            PVBOXCLIPBOARDEXTAREAPARMS pParms = (PVBOXCLIPBOARDEXTAREAPARMS)pvParms;
     8495            AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
     8496            hrc = pControl->ClipboardAreaUnregister(pParms->uID);                                H();
     8497        } break;
     8498
     8499        case VBOX_CLIPBOARD_EXT_FN_AREA_ATTACH:
     8500        {
     8501            PVBOXCLIPBOARDEXTAREAPARMS pParms = (PVBOXCLIPBOARDEXTAREAPARMS)pvParms;
     8502            AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
     8503            hrc = pControl->ClipboardAreaAttach(pParms->uID);                                    H();
     8504        } break;
     8505
     8506        case VBOX_CLIPBOARD_EXT_FN_AREA_DETACH:
     8507        {
     8508            PVBOXCLIPBOARDEXTAREAPARMS pParms = (PVBOXCLIPBOARDEXTAREAPARMS)pvParms;
     8509            AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
     8510            hrc = pControl->ClipboardAreaDetach(pParms->uID);                                    H();
     8511        } break;
     8512#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
     8513
     8514        default:
     8515        {
     8516            rc = VERR_NOT_SUPPORTED;
     8517        } break;
     8518    }
     8519
     8520#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST_DISABLED
     8521    int rc2 = SharedClipboard::hostServiceCallback(SHAREDCLIPBOARDINST(), u32Function, pvParms, cbParms);
     8522    if (RT_SUCCESS(rc))
     8523        rc = rc2;
     8524#endif
     8525
     8526#undef H
     8527
     8528    LogFlowFuncLeaveRC(rc);
     8529    return rc;
     8530}
     8531#endif /* VBOX_WITH_SHARED_CLIPBOARD */
     8532
    84018533/**
    84028534 * Searches for a shared folder with the given logical name
     
    91249256{
    91259257    VMMDev *pVMMDev = m_pVMMDev;
    9126     AssertPtr(pVMMDev);
     9258    AssertPtrReturn(pVMMDev, VERR_INVALID_POINTER);
    91279259
    91289260    VBOXHGCMSVCPARM parm;
     
    91339265        default:
    91349266        case ClipboardMode_Disabled:
    9135             LogRel(("Shared clipboard mode: Off\n"));
     9267            LogRel(("Shared Clipboard: Mode: Off\n"));
    91369268            parm.u.uint32 = VBOX_SHARED_CLIPBOARD_MODE_OFF;
    91379269            break;
    91389270        case ClipboardMode_GuestToHost:
    9139             LogRel(("Shared clipboard mode: Guest to Host\n"));
     9271            LogRel(("Shared Clipboard: Mode: Guest to Host\n"));
    91409272            parm.u.uint32 = VBOX_SHARED_CLIPBOARD_MODE_GUEST_TO_HOST;
    91419273            break;
    91429274        case ClipboardMode_HostToGuest:
    9143             LogRel(("Shared clipboard mode: Host to Guest\n"));
     9275            LogRel(("Shared Clipboard: Mode: Host to Guest\n"));
    91449276            parm.u.uint32 = VBOX_SHARED_CLIPBOARD_MODE_HOST_TO_GUEST;
    91459277            break;
    91469278        case ClipboardMode_Bidirectional:
    9147             LogRel(("Shared clipboard mode: Bidirectional\n"));
     9279            LogRel(("Shared Clipboard: Mode: Bidirectional\n"));
    91489280            parm.u.uint32 = VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL;
    91499281            break;
    91509282    }
    91519283
    9152     int rc =  pVMMDev->hgcmHostCall("VBoxSharedClipboard", VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE, 1, &parm);
     9284    int rc = pVMMDev->hgcmHostCall("VBoxSharedClipboard", VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE, 1, &parm);
    91539285    if (RT_FAILURE(rc))
    9154         LogRel(("Error changing shared clipboard mode: %Rrc\n", rc));
     9286        LogRel(("Shared Clipboard: Error changing mode: %Rrc\n", rc));
    91559287
    91569288    return rc;
  • trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp

    r78809 r78897  
    30853085         */
    30863086        {
    3087             /* Load the service */
    3088             rc = pVMMDev->hgcmLoadService("VBoxSharedClipboard", "VBoxSharedClipboard");
    3089             if (RT_SUCCESS(rc))
    3090             {
    3091                 SharedClipboard *pSharedClipboard = SharedClipboard::createInstance(this /* pConsole */);
    3092                 if (pSharedClipboard)
    3093                 {
    3094 # ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST_DISABLED
     3087            if (SharedClipboard::createInstance(this /* pConsole */) == NULL)
     3088            {
     3089                rc = VERR_NO_MEMORY;
     3090            }
     3091            else
     3092            {
     3093                /* Load the service */
     3094                rc = pVMMDev->hgcmLoadService("VBoxSharedClipboard", "VBoxSharedClipboard");
     3095                if (RT_SUCCESS(rc))
     3096                {
     3097                    LogRel(("Shared Clipboard: Service loaded\n"));
    30953098                    HGCMSVCEXTHANDLE hDummy;
    30963099                    rc = HGCMHostRegisterServiceExtension(&hDummy, "VBoxSharedClipboard",
    3097                                                           &SharedClipboard::hostServiceCallback,
    3098                                                           pSharedClipboard);
     3100                                                          &Console::i_sharedClipboardServiceCallback,
     3101                                                          this /* pvExtension */);
    30993102                    if (RT_FAILURE(rc))
     3103                    {
    31003104                        LogRel(("Shared Clipboard: Cannot register service extension, rc=%Rrc\n", rc));
    3101 # endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
    3102 
    3103                     if (RT_SUCCESS(rc))
     3105                    }
     3106                    else
    31043107                    {
    3105                         LogRel(("Shared Clipboard: Service loaded\n"));
    3106 
    31073108                        /* Set initial clipboard mode. */
    31083109                        ClipboardMode_T mode = ClipboardMode_Disabled;
    31093110                        hrc = pMachine->COMGETTER(ClipboardMode)(&mode); H();
     3111
    31103112                        rc = i_changeClipboardMode(mode);
    31113113                        if (RT_SUCCESS(rc))
     
    31143116                            VBOXHGCMSVCPARM parm;
    31153117                            HGCMSvcSetU32(&parm, !i_useHostClipboard());
    3116                             rc = pSharedClipboard->hostCall(VBOX_SHARED_CLIPBOARD_HOST_FN_SET_HEADLESS, 1, &parm);
     3118                            rc = SHAREDCLIPBOARDINST()->hostCall(VBOX_SHARED_CLIPBOARD_HOST_FN_SET_HEADLESS, 1, &parm);
    31173119                            if (RT_FAILURE(rc))
    31183120                                LogRel(("Shared Clipboard: Unable to set initial headless mode, rc=%Rrc\n", rc));
     
    31203122                    }
    31213123                }
    3122                 else
    3123                     rc = VERR_NO_MEMORY;
    31243124            }
    31253125
  • trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp

    r76553 r78897  
    33003300    ConsoleVRDPServer *pServer = static_cast <ConsoleVRDPServer *>(pvCallback);
    33013301
    3302     NOREF(u32ClientId);
     3302    RT_NOREF(u32ClientId);
    33033303
    33043304    switch (u32Function)
     
    33273327
    33283328        default:
     3329        {
    33293330            rc = VERR_NOT_SUPPORTED;
     3331        } break;
    33303332    }
    33313333
     
    33333335}
    33343336
    3335 DECLCALLBACK(int) ConsoleVRDPServer::ClipboardServiceExtension(void *pvExtension,
    3336                                                                uint32_t u32Function,
    3337                                                                void *pvParms,
    3338                                                                uint32_t cbParms)
    3339 {
    3340     RT_NOREF(cbParms);
    3341     LogFlowFunc(("pvExtension = %p, u32Function = %d, pvParms = %p, cbParms = %d\n",
    3342                  pvExtension, u32Function, pvParms, cbParms));
    3343 
    3344     int rc = VINF_SUCCESS;
    3345 
    3346     ConsoleVRDPServer *pServer = static_cast <ConsoleVRDPServer *>(pvExtension);
    3347 
    3348     VBOXCLIPBOARDEXTPARMS *pParms = (VBOXCLIPBOARDEXTPARMS *)pvParms;
    3349 
    3350     switch (u32Function)
    3351     {
    3352         case VBOX_CLIPBOARD_EXT_FN_SET_CALLBACK:
    3353         {
    3354             pServer->mpfnClipboardCallback = pParms->u.pfnCallback;
    3355         } break;
    3356 
    3357         case VBOX_CLIPBOARD_EXT_FN_FORMAT_ANNOUNCE:
    3358         {
    3359             /* The guest announces clipboard formats. This must be delivered to all clients. */
    3360             if (mpEntryPoints && pServer->mhServer)
    3361             {
    3362                 mpEntryPoints->VRDEClipboard(pServer->mhServer,
    3363                                              VRDE_CLIPBOARD_FUNCTION_FORMAT_ANNOUNCE,
    3364                                              pParms->u32Format,
    3365                                              NULL,
    3366                                              0,
    3367                                              NULL);
    3368             }
    3369         } break;
    3370 
    3371         case VBOX_CLIPBOARD_EXT_FN_DATA_READ:
    3372         {
    3373             /* The clipboard service expects that the pvData buffer will be filled
    3374              * with clipboard data. The server returns the data from the client that
    3375              * announced the requested format most recently.
    3376              */
    3377             if (mpEntryPoints && pServer->mhServer)
    3378             {
    3379                 mpEntryPoints->VRDEClipboard(pServer->mhServer,
    3380                                              VRDE_CLIPBOARD_FUNCTION_DATA_READ,
    3381                                              pParms->u32Format,
    3382                                              pParms->u.pvData,
    3383                                              pParms->cbData,
    3384                                              &pParms->cbData);
    3385             }
    3386         } break;
    3387 
    3388         case VBOX_CLIPBOARD_EXT_FN_DATA_WRITE:
    3389         {
    3390             if (mpEntryPoints && pServer->mhServer)
    3391             {
    3392                 mpEntryPoints->VRDEClipboard(pServer->mhServer,
    3393                                              VRDE_CLIPBOARD_FUNCTION_DATA_WRITE,
    3394                                              pParms->u32Format,
    3395                                              pParms->u.pvData,
    3396                                              pParms->cbData,
    3397                                              NULL);
    3398             }
    3399         } break;
    3400 
    3401         default:
    3402             rc = VERR_NOT_SUPPORTED;
    3403     }
    3404 
    3405     return rc;
    3406 }
    3407 
    34083337void ConsoleVRDPServer::ClipboardCreate(uint32_t u32ClientId)
    34093338{
    34103339    RT_NOREF(u32ClientId);
     3340
    34113341    int rc = lockConsoleVRDPServer();
    3412 
    34133342    if (RT_SUCCESS(rc))
    34143343    {
    34153344        if (mcClipboardRefs == 0)
    3416         {
    3417             rc = HGCMHostRegisterServiceExtension(&mhClipboard, "VBoxSharedClipboard", ClipboardServiceExtension, this);
    3418 
    3419             if (RT_SUCCESS(rc))
    3420             {
    3421                 mcClipboardRefs++;
    3422             }
    3423         }
     3345            mcClipboardRefs++;
    34243346
    34253347        unlockConsoleVRDPServer();
     
    34303352{
    34313353    RT_NOREF(u32ClientId);
     3354
    34323355    int rc = lockConsoleVRDPServer();
    3433 
    34343356    if (RT_SUCCESS(rc))
    34353357    {
     3358        Assert(mcClipboardRefs);
    34363359        mcClipboardRefs--;
    3437 
    3438         if (mcClipboardRefs == 0)
    3439         {
    3440             HGCMHostUnregisterServiceExtension(mhClipboard);
    3441         }
    34423360
    34433361        unlockConsoleVRDPServer();
     
    37533671    {
    37543672        mpEntryPoints->VRDEUSBRequest(mhServer, u32ClientId, pvParms, cbParms);
     3673    }
     3674}
     3675
     3676void ConsoleVRDPServer::SendClipboard(uint32_t u32Function, uint32_t u32Format,
     3677                                      void *pvData, uint32_t cbData, uint32_t *pcbActualRead) const
     3678{
     3679    if (mpEntryPoints && mhServer)
     3680    {
     3681        mpEntryPoints->VRDEClipboard(mhServer, u32Function, u32Format, pvData, cbData, pcbActualRead);
    37553682    }
    37563683}
  • trunk/src/VBox/Main/src-client/SharedClipboardPrivate.cpp

    r78690 r78897  
    6161    RT_NOREF(pvParms, cbParms);
    6262
    63     SharedClipboard *pSharedClipboard = reinterpret_cast<SharedClipboard *>(pvExtension);
    64     AssertPtrReturn(pSharedClipboard, VERR_INVALID_POINTER);
     63    SharedClipboard *pThis = reinterpret_cast<SharedClipboard *>(pvExtension);
     64    AssertPtrReturn(pThis, VERR_INVALID_POINTER);
    6565
    66     int rc;
    67 
    68     switch (u32Function)
    69     {
    70         default:
    71             rc = VERR_NOT_SUPPORTED;
    72             break;
    73     }
     66    int rc = VINF_SUCCESS;
    7467
    7568    LogFlowFuncLeaveRC(rc);
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r78761 r78897  
    1355613556}
    1355713557
     13558HRESULT SessionMachine::clipboardAreaRegister(const std::vector<com::Utf8Str> &aParms, ULONG *aID)
     13559{
     13560#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     13561    ULONG uID;
     13562    int rc = mParent->i_onClipboardAreaRegister(aParms, &uID);
     13563    if (RT_SUCCESS(rc))
     13564    {
     13565        if (aID)
     13566            *aID = uID;
     13567        return S_OK;
     13568    }
     13569    return E_FAIL;
     13570#else
     13571    RT_NOREF(aParms, aID);
     13572    ReturnComNotImplemented();
     13573#endif
     13574}
     13575
     13576HRESULT SessionMachine::clipboardAreaUnregister(ULONG aID)
     13577{
     13578#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     13579    return mParent->i_onClipboardAreaUnregister(aID);
     13580#else
     13581    RT_NOREF(aID);
     13582    ReturnComNotImplemented();
     13583#endif
     13584}
     13585
     13586HRESULT SessionMachine::clipboardAreaAttach(ULONG aID)
     13587{
     13588#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     13589    return mParent->i_onClipboardAreaAttach(aID);
     13590#else
     13591    RT_NOREF(aID);
     13592    ReturnComNotImplemented();
     13593#endif
     13594}
     13595HRESULT SessionMachine::clipboardAreaDetach(ULONG aID)
     13596{
     13597#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     13598    return mParent->i_onClipboardAreaDetach(aID);
     13599#else
     13600    RT_NOREF(aID);
     13601    ReturnComNotImplemented();
     13602#endif
     13603}
     13604
     13605HRESULT SessionMachine::clipboardAreaGetMostRecent(ULONG *aID)
     13606{
     13607#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     13608    ULONG uID = mParent->i_onClipboardAreaGetMostRecent();
     13609    if (aID)
     13610        *aID = uID;
     13611    return S_OK;
     13612#else
     13613    RT_NOREF(aID);
     13614    ReturnComNotImplemented();
     13615#endif
     13616}
     13617
     13618HRESULT SessionMachine::clipboardAreaGetRefCount(ULONG aID, ULONG *aRefCount)
     13619{
     13620#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     13621    ULONG uRefCount = mParent->i_onClipboardAreaGetRefCount(aID);
     13622    if (aRefCount)
     13623        *aRefCount = uRefCount;
     13624    return S_OK;
     13625#else
     13626    RT_NOREF(aID, aRefCount);
     13627    ReturnComNotImplemented();
     13628#endif
     13629}
     13630
    1355813631HRESULT SessionMachine::pullGuestProperties(std::vector<com::Utf8Str> &aNames,
    1355913632                                            std::vector<com::Utf8Str> &aValues,
     
    1504215115}
    1504315116
     15117HRESULT Machine::clipboardAreaRegister(const std::vector<com::Utf8Str> &aParms, ULONG *aID)
     15118{
     15119    RT_NOREF(aParms, aID);
     15120    ReturnComNotImplemented();
     15121}
     15122
     15123HRESULT Machine::clipboardAreaUnregister(ULONG aID)
     15124{
     15125    RT_NOREF(aID);
     15126    ReturnComNotImplemented();
     15127}
     15128
     15129HRESULT Machine::clipboardAreaAttach(ULONG aID)
     15130{
     15131    RT_NOREF(aID);
     15132    ReturnComNotImplemented();
     15133}
     15134HRESULT Machine::clipboardAreaDetach(ULONG aID)
     15135{
     15136    RT_NOREF(aID);
     15137    ReturnComNotImplemented();
     15138}
     15139
     15140HRESULT Machine::clipboardAreaGetMostRecent(ULONG *aID)
     15141{
     15142    RT_NOREF(aID);
     15143    ReturnComNotImplemented();
     15144}
     15145
     15146HRESULT Machine::clipboardAreaGetRefCount(ULONG aID, ULONG *aRefCount)
     15147{
     15148    RT_NOREF(aID, aRefCount);
     15149    ReturnComNotImplemented();
     15150}
     15151
    1504415152HRESULT Machine::pullGuestProperties(std::vector<com::Utf8Str> &aNames,
    1504515153                                     std::vector<com::Utf8Str> &aValues,
  • trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp

    r78827 r78897  
    4545#include <VBox/settings.h>
    4646#include <VBox/version.h>
     47
     48#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     49# include <VBox/GuestHost/SharedClipboard-uri.h>
     50#endif
    4751
    4852#include <package-generated.h>
     
    219223typedef std::map<Guid, ComObjPtr<Medium> > HardDiskMap;
    220224
     225#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     226/**
     227 * Structure for keeping Shared Clipboard area data within the VirtualBox object.
     228 */
     229struct SharedClipboardAreaData
     230{
     231    SharedClipboardAreaData()
     232        : uID(0) { }
     233
     234    /** The area's (unique) ID. */
     235    ULONG               uID;
     236    /** The actual Shared Clipboard area assigned to this ID. */
     237    SharedClipboardArea Area;
     238};
     239
     240/** Map of Shared Clipboard areas. The key defines the area ID. */
     241typedef std::map<ULONG, SharedClipboardAreaData> SharedClipboardAreaMap;
     242
     243/**
     244 * Structure for keeping global Shared Clipboard data within the VirtualBox object.
     245 */
     246struct SharedClipboardData
     247{
     248    SharedClipboardData()
     249        : uNextClipboardAreaID(0)
     250        , uMaxClipboardAreas(32) { }
     251
     252    /** Critical section to serialize access. */
     253    RTCRITSECT                          CritSect;
     254    /** The next (free) clipboard area ID. */
     255    ULONG                               uNextClipboardAreaID;
     256    /** Maximum of concurrent clipboard areas.
     257     *  @todo Make this configurable. */
     258    ULONG                               uMaxClipboardAreas;
     259    /** Map of clipboard areas. The key is the area ID. */
     260    SharedClipboardAreaMap              mapClipboardAreas;
     261};
     262#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
    221263
    222264/**
     
    366408    bool                                fWatcherIsReliable;
    367409#endif
     410
     411#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     412    /** Data related to Shared Clipboard handling. */
     413    SharedClipboardData                 SharedClipboard;
     414#endif
    368415};
    369416
     
    32853332};
    32863333
     3334#ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST
     3335int VirtualBox::i_onClipboardAreaCreate(SharedClipboardAreaData &AreaData, uint32_t fFlags)
     3336{
     3337    RT_NOREF(fFlags);
     3338    int rc = AreaData.Area.OpenTemp(AreaData.uID);
     3339    LogFlowFunc(("uID=%RU32, rc=%Rrc\n", AreaData.uID, rc));
     3340    return rc;
     3341}
     3342
     3343int VirtualBox::i_onClipboardAreaDestroy(SharedClipboardAreaData &AreaData)
     3344{
     3345    /** @todo Do we need a worker for this to not block here for too long?
     3346     *        This could take a while to clean up huge areas ... */
     3347    int rc = AreaData.Area.Close();
     3348    LogFlowFunc(("uID=%RU32, rc=%Rrc\n", AreaData.uID, rc));
     3349    return rc;
     3350}
     3351
     3352int VirtualBox::i_onClipboardAreaRegister(const std::vector<com::Utf8Str> &aParms, ULONG *aID)
     3353{
     3354    RT_NOREF(aParms);
     3355    int rc = RTCritSectEnter(&m->SharedClipboard.CritSect);
     3356    if (RT_SUCCESS(rc))
     3357    {
     3358        try
     3359        {
     3360            if (m->SharedClipboard.mapClipboardAreas.size() >= m->SharedClipboard.uMaxClipboardAreas)
     3361            {
     3362                const ULONG uAreaID = m->SharedClipboard.uNextClipboardAreaID;
     3363
     3364                SharedClipboardAreaData AreaData;
     3365                AreaData.uID = uAreaID;
     3366
     3367                rc = i_onClipboardAreaCreate(AreaData, 0 /* fFlags */);
     3368                if (RT_SUCCESS(rc))
     3369                {
     3370                    m->SharedClipboard.mapClipboardAreas[uAreaID] = AreaData;
     3371                    m->SharedClipboard.uNextClipboardAreaID++;
     3372
     3373                    /** @todo Implement collision detection / wrap-around. */
     3374
     3375                    if (aID)
     3376                        *aID = uAreaID;
     3377
     3378                    LogThisFunc(("Registered new clipboard area %RU32: '%s'\n",
     3379                                 uAreaID, AreaData.Area.GetDirAbs()));
     3380                }
     3381                else
     3382                    LogRel(("Clipboard: Failed to create new clipboard area %RU32, rc=%Rrc\n", uAreaID, rc));
     3383            }
     3384            else
     3385            {
     3386                LogThisFunc(("Maximum number of conucurrent clipboard areas reached (%RU32)\n",
     3387                             m->SharedClipboard.uMaxClipboardAreas));
     3388                rc = VERR_TOO_MUCH_DATA; /** @todo Find a better rc. */
     3389            }
     3390        }
     3391        catch (std::bad_alloc &ba)
     3392        {
     3393            rc = VERR_NO_MEMORY;
     3394            RT_NOREF(ba);
     3395        }
     3396
     3397        RTCritSectLeave(&m->SharedClipboard.CritSect);
     3398    }
     3399    LogFlowThisFunc(("rc=%Rrc\n", rc));
     3400    return rc;
     3401}
     3402
     3403int VirtualBox::i_onClipboardAreaUnregister(ULONG aID)
     3404{
     3405    RT_NOREF(aID);
     3406
     3407    int rc = RTCritSectEnter(&m->SharedClipboard.CritSect);
     3408    if (RT_SUCCESS(rc))
     3409    {
     3410        SharedClipboardAreaMap::iterator itArea = m->SharedClipboard.mapClipboardAreas.find(aID);
     3411        if (itArea != m->SharedClipboard.mapClipboardAreas.end())
     3412        {
     3413            if (itArea->second.Area.GetRefCount() == 0)
     3414            {
     3415                rc = i_onClipboardAreaDestroy(itArea->second);
     3416                if (RT_SUCCESS(rc))
     3417                {
     3418                    m->SharedClipboard.mapClipboardAreas.erase(itArea);
     3419                }
     3420            }
     3421            else
     3422                rc = VERR_WRONG_ORDER;
     3423        }
     3424        else
     3425            rc = VERR_NOT_FOUND;
     3426
     3427        int rc2 = RTCritSectLeave(&m->SharedClipboard.CritSect);
     3428        AssertRC(rc2);
     3429    }
     3430    LogFlowThisFunc(("aID=%RU32, rc=%Rrc\n", aID, rc));
     3431    return rc;
     3432}
     3433
     3434int VirtualBox::i_onClipboardAreaAttach(ULONG aID)
     3435{
     3436    int rc = RTCritSectEnter(&m->SharedClipboard.CritSect);
     3437    if (RT_SUCCESS(rc))
     3438    {
     3439        SharedClipboardAreaMap::iterator itArea = m->SharedClipboard.mapClipboardAreas.find(aID);
     3440        if (itArea != m->SharedClipboard.mapClipboardAreas.end())
     3441        {
     3442            uint32_t cRefs = itArea->second.Area.AddRef();
     3443            LogFlowThisFunc(("aID=%RU32 -> cRefs=%RU32\n", aID, cRefs));
     3444            rc = VINF_SUCCESS;
     3445        }
     3446        else
     3447            rc = VERR_NOT_FOUND;
     3448
     3449        int rc2 = RTCritSectLeave(&m->SharedClipboard.CritSect);
     3450        AssertRC(rc2);
     3451    }
     3452    LogFlowThisFunc(("aID=%RU32, rc=%Rrc\n", aID, rc));
     3453    return rc;
     3454}
     3455
     3456int VirtualBox::i_onClipboardAreaDetach(ULONG aID)
     3457{
     3458    int rc = RTCritSectEnter(&m->SharedClipboard.CritSect);
     3459    if (RT_SUCCESS(rc))
     3460    {
     3461        SharedClipboardAreaMap::iterator itArea = m->SharedClipboard.mapClipboardAreas.find(aID);
     3462        if (itArea != m->SharedClipboard.mapClipboardAreas.end())
     3463        {
     3464            uint32_t cRefs = itArea->second.Area.Release();
     3465            LogFlowThisFunc(("aID=%RU32 -> cRefs=%RU32\n", aID, cRefs));
     3466            rc = VINF_SUCCESS;
     3467        }
     3468        else
     3469            rc = VERR_NOT_FOUND;
     3470
     3471        int rc2 = RTCritSectLeave(&m->SharedClipboard.CritSect);
     3472        AssertRC(rc2);
     3473    }
     3474    LogFlowThisFunc(("aID=%RU32, rc=%Rrc\n", aID, rc));
     3475    return rc;
     3476}
     3477
     3478ULONG VirtualBox::i_onClipboardAreaGetMostRecent(void)
     3479{
     3480    ULONG aID = 0;
     3481    int rc2 = RTCritSectEnter(&m->SharedClipboard.CritSect);
     3482    if (RT_SUCCESS(rc2))
     3483    {
     3484        aID = m->SharedClipboard.uNextClipboardAreaID
     3485            ? m->SharedClipboard.uNextClipboardAreaID - 1 : 0;
     3486
     3487        rc2 = RTCritSectLeave(&m->SharedClipboard.CritSect);
     3488        AssertRC(rc2);
     3489    }
     3490    LogFlowThisFunc(("aID=%RU32\n", aID));
     3491    return aID;
     3492}
     3493
     3494ULONG VirtualBox::i_onClipboardAreaGetRefCount(ULONG aID)
     3495{
     3496    ULONG cRefCount = 0;
     3497    int rc2 = RTCritSectEnter(&m->SharedClipboard.CritSect);
     3498    if (RT_SUCCESS(rc2))
     3499    {
     3500        SharedClipboardAreaMap::iterator itArea = m->SharedClipboard.mapClipboardAreas.find(aID);
     3501        if (itArea != m->SharedClipboard.mapClipboardAreas.end())
     3502        {
     3503            cRefCount = itArea->second.Area.GetRefCount();
     3504        }
     3505
     3506        rc2 = RTCritSectLeave(&m->SharedClipboard.CritSect);
     3507        AssertRC(rc2);
     3508    }
     3509    LogFlowThisFunc(("aID=%RU32, cRefCount=%RU32\n", aID, cRefCount));
     3510    return cRefCount;
     3511}
     3512#endif /* VBOX_WITH_SHARED_CLIPBOARD_URI_LIST */
     3513
    32873514/**
    32883515 *  @note Doesn't lock any object.
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette