VirtualBox

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


Ignore:
Timestamp:
May 31, 2019 3:23:14 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
131016
Message:

Shared Clipboard/URI: Update.

Location:
trunk/src/VBox/Main/src-client
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • 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);
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