Changeset 78897 in vbox for trunk/src/VBox/Main
- Timestamp:
- May 31, 2019 3:23:14 PM (6 years ago)
- Location:
- trunk/src/VBox/Main
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/Makefile.kmk
r78683 r78897 136 136 ifdef VBOX_WITH_SDS 137 137 VBOX_MAIN_DEFS += VBOX_WITH_SDS 138 endif 139 ifdef VBOX_WITH_SHARED_CLIPBOARD 140 VBOX_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 138 144 endif 139 145 ifdef VBOX_WITH_USB_CARDREADER … … 681 687 endif 682 688 689 ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 690 VBoxSVC_SOURCES += $(PATH_ROOT)/src/VBox/GuestHost/SharedClipboard/ClipboardCache.cpp 691 endif 692 683 693 $(call KB_FN_DO_PASS0_ON_TARGET,VBoxSVC) # Sets VBoxSVC_0_OUTDIR 684 694 -
trunk/src/VBox/Main/idl/VirtualBox.xidl
r78896 r78897 4389 4389 <interface 4390 4390 name="IInternalMachineControl" extends="$unknown" 4391 uuid=" cdbc59df-4f4d-4cf2-809c-917601355afc"4391 uuid="0075FD6C-00C2-4484-0077-C057003D9C90" 4392 4392 internal="yes" 4393 4393 wsmap="suppress" … … 4591 4591 </param> 4592 4592 </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> 4594 4663 <method name="pushGuestProperty"> 4595 4664 <desc> -
trunk/src/VBox/Main/include/ConsoleImpl.h
r78779 r78897 865 865 #endif 866 866 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 867 875 /** @name Disk encryption support 868 876 * @{ */ -
trunk/src/VBox/Main/include/ConsoleVRDPServer.h
r76562 r78897 139 139 void SendAudioVolume (uint16_t left, uint16_t right) const; 140 140 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; 141 143 142 144 void QueryInfo (uint32_t index, void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut) const; … … 220 222 221 223 int mcClipboardRefs; 222 HGCMSVCEXTHANDLE mhClipboard;223 224 PFNVRDPCLIPBOARDEXTCALLBACK mpfnClipboardCallback; 224 225 225 226 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);227 227 228 228 #ifdef VBOX_WITH_USB -
trunk/src/VBox/Main/include/MachineImpl.h
r78632 r78897 1228 1228 ComPtr<IProgress> &aProgress); 1229 1229 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); 1230 1236 HRESULT pullGuestProperties(std::vector<com::Utf8Str> &aNames, 1231 1237 std::vector<com::Utf8Str> &aValues, … … 1383 1389 ComPtr<IProgress> &aProgress); 1384 1390 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); 1385 1397 HRESULT pullGuestProperties(std::vector<com::Utf8Str> &aNames, 1386 1398 std::vector<com::Utf8Str> &aValues, -
trunk/src/VBox/Main/include/VirtualBoxImpl.h
r78261 r78897 72 72 #endif 73 73 74 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 75 struct SharedClipboardAreaData; 76 #endif 74 77 75 78 class ATL_NO_VTABLE VirtualBox : … … 170 173 void i_onSnapshotRestored(const Guid &aMachineId, const Guid &aSnapshotId); 171 174 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 172 187 void i_onGuestPropertyChange(const Guid &aMachineId, IN_BSTR aName, IN_BSTR aValue, 173 188 IN_BSTR aFlags); -
trunk/src/VBox/Main/src-client/ConsoleImpl.cpp
r78779 r78897 126 126 #include <VBox/VMMDev.h> 127 127 128 #ifdef VBOX_WITH_SHARED_CLIPBOARD 128 129 #include <VBox/HostServices/VBoxClipboardSvc.h> 130 # ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 131 # include "SharedClipboardPrivate.h" 132 # endif 133 #endif 129 134 #include <VBox/HostServices/DragAndDropSvc.h> 130 135 #ifdef VBOX_WITH_GUEST_PROPS … … 2085 2090 HRESULT Console::setUseHostClipboard(BOOL aUseHostClipboard) 2086 2091 { 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 } 2088 2097 2089 2098 return S_OK; … … 8399 8408 } 8400 8409 8410 #ifdef VBOX_WITH_SHARED_CLIPBOARD 8411 /* static */ 8412 DECLCALLBACK(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 8401 8533 /** 8402 8534 * Searches for a shared folder with the given logical name … … 9124 9256 { 9125 9257 VMMDev *pVMMDev = m_pVMMDev; 9126 AssertPtr (pVMMDev);9258 AssertPtrReturn(pVMMDev, VERR_INVALID_POINTER); 9127 9259 9128 9260 VBOXHGCMSVCPARM parm; … … 9133 9265 default: 9134 9266 case ClipboardMode_Disabled: 9135 LogRel(("Shared clipboard mode: Off\n"));9267 LogRel(("Shared Clipboard: Mode: Off\n")); 9136 9268 parm.u.uint32 = VBOX_SHARED_CLIPBOARD_MODE_OFF; 9137 9269 break; 9138 9270 case ClipboardMode_GuestToHost: 9139 LogRel(("Shared clipboard mode: Guest to Host\n"));9271 LogRel(("Shared Clipboard: Mode: Guest to Host\n")); 9140 9272 parm.u.uint32 = VBOX_SHARED_CLIPBOARD_MODE_GUEST_TO_HOST; 9141 9273 break; 9142 9274 case ClipboardMode_HostToGuest: 9143 LogRel(("Shared clipboard mode: Host to Guest\n"));9275 LogRel(("Shared Clipboard: Mode: Host to Guest\n")); 9144 9276 parm.u.uint32 = VBOX_SHARED_CLIPBOARD_MODE_HOST_TO_GUEST; 9145 9277 break; 9146 9278 case ClipboardMode_Bidirectional: 9147 LogRel(("Shared clipboard mode: Bidirectional\n"));9279 LogRel(("Shared Clipboard: Mode: Bidirectional\n")); 9148 9280 parm.u.uint32 = VBOX_SHARED_CLIPBOARD_MODE_BIDIRECTIONAL; 9149 9281 break; 9150 9282 } 9151 9283 9152 int rc = 9284 int rc = pVMMDev->hgcmHostCall("VBoxSharedClipboard", VBOX_SHARED_CLIPBOARD_HOST_FN_SET_MODE, 1, &parm); 9153 9285 if (RT_FAILURE(rc)) 9154 LogRel((" Error changing shared clipboardmode: %Rrc\n", rc));9286 LogRel(("Shared Clipboard: Error changing mode: %Rrc\n", rc)); 9155 9287 9156 9288 return rc; -
trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
r78809 r78897 3085 3085 */ 3086 3086 { 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")); 3095 3098 HGCMSVCEXTHANDLE hDummy; 3096 3099 rc = HGCMHostRegisterServiceExtension(&hDummy, "VBoxSharedClipboard", 3097 & SharedClipboard::hostServiceCallback,3098 pSharedClipboard);3100 &Console::i_sharedClipboardServiceCallback, 3101 this /* pvExtension */); 3099 3102 if (RT_FAILURE(rc)) 3103 { 3100 3104 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 3104 3107 { 3105 LogRel(("Shared Clipboard: Service loaded\n"));3106 3107 3108 /* Set initial clipboard mode. */ 3108 3109 ClipboardMode_T mode = ClipboardMode_Disabled; 3109 3110 hrc = pMachine->COMGETTER(ClipboardMode)(&mode); H(); 3111 3110 3112 rc = i_changeClipboardMode(mode); 3111 3113 if (RT_SUCCESS(rc)) … … 3114 3116 VBOXHGCMSVCPARM parm; 3115 3117 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); 3117 3119 if (RT_FAILURE(rc)) 3118 3120 LogRel(("Shared Clipboard: Unable to set initial headless mode, rc=%Rrc\n", rc)); … … 3120 3122 } 3121 3123 } 3122 else3123 rc = VERR_NO_MEMORY;3124 3124 } 3125 3125 -
trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp
r76553 r78897 3300 3300 ConsoleVRDPServer *pServer = static_cast <ConsoleVRDPServer *>(pvCallback); 3301 3301 3302 NOREF(u32ClientId);3302 RT_NOREF(u32ClientId); 3303 3303 3304 3304 switch (u32Function) … … 3327 3327 3328 3328 default: 3329 { 3329 3330 rc = VERR_NOT_SUPPORTED; 3331 } break; 3330 3332 } 3331 3333 … … 3333 3335 } 3334 3336 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 filled3374 * with clipboard data. The server returns the data from the client that3375 * 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 3408 3337 void ConsoleVRDPServer::ClipboardCreate(uint32_t u32ClientId) 3409 3338 { 3410 3339 RT_NOREF(u32ClientId); 3340 3411 3341 int rc = lockConsoleVRDPServer(); 3412 3413 3342 if (RT_SUCCESS(rc)) 3414 3343 { 3415 3344 if (mcClipboardRefs == 0) 3416 { 3417 rc = HGCMHostRegisterServiceExtension(&mhClipboard, "VBoxSharedClipboard", ClipboardServiceExtension, this); 3418 3419 if (RT_SUCCESS(rc)) 3420 { 3421 mcClipboardRefs++; 3422 } 3423 } 3345 mcClipboardRefs++; 3424 3346 3425 3347 unlockConsoleVRDPServer(); … … 3430 3352 { 3431 3353 RT_NOREF(u32ClientId); 3354 3432 3355 int rc = lockConsoleVRDPServer(); 3433 3434 3356 if (RT_SUCCESS(rc)) 3435 3357 { 3358 Assert(mcClipboardRefs); 3436 3359 mcClipboardRefs--; 3437 3438 if (mcClipboardRefs == 0)3439 {3440 HGCMHostUnregisterServiceExtension(mhClipboard);3441 }3442 3360 3443 3361 unlockConsoleVRDPServer(); … … 3753 3671 { 3754 3672 mpEntryPoints->VRDEUSBRequest(mhServer, u32ClientId, pvParms, cbParms); 3673 } 3674 } 3675 3676 void 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); 3755 3682 } 3756 3683 } -
trunk/src/VBox/Main/src-client/SharedClipboardPrivate.cpp
r78690 r78897 61 61 RT_NOREF(pvParms, cbParms); 62 62 63 SharedClipboard *p SharedClipboard= reinterpret_cast<SharedClipboard *>(pvExtension);64 AssertPtrReturn(p SharedClipboard, VERR_INVALID_POINTER);63 SharedClipboard *pThis = reinterpret_cast<SharedClipboard *>(pvExtension); 64 AssertPtrReturn(pThis, VERR_INVALID_POINTER); 65 65 66 int rc; 67 68 switch (u32Function) 69 { 70 default: 71 rc = VERR_NOT_SUPPORTED; 72 break; 73 } 66 int rc = VINF_SUCCESS; 74 67 75 68 LogFlowFuncLeaveRC(rc); -
trunk/src/VBox/Main/src-server/MachineImpl.cpp
r78761 r78897 13556 13556 } 13557 13557 13558 HRESULT 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 13576 HRESULT 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 13586 HRESULT 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 } 13595 HRESULT 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 13605 HRESULT 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 13618 HRESULT 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 13558 13631 HRESULT SessionMachine::pullGuestProperties(std::vector<com::Utf8Str> &aNames, 13559 13632 std::vector<com::Utf8Str> &aValues, … … 15042 15115 } 15043 15116 15117 HRESULT Machine::clipboardAreaRegister(const std::vector<com::Utf8Str> &aParms, ULONG *aID) 15118 { 15119 RT_NOREF(aParms, aID); 15120 ReturnComNotImplemented(); 15121 } 15122 15123 HRESULT Machine::clipboardAreaUnregister(ULONG aID) 15124 { 15125 RT_NOREF(aID); 15126 ReturnComNotImplemented(); 15127 } 15128 15129 HRESULT Machine::clipboardAreaAttach(ULONG aID) 15130 { 15131 RT_NOREF(aID); 15132 ReturnComNotImplemented(); 15133 } 15134 HRESULT Machine::clipboardAreaDetach(ULONG aID) 15135 { 15136 RT_NOREF(aID); 15137 ReturnComNotImplemented(); 15138 } 15139 15140 HRESULT Machine::clipboardAreaGetMostRecent(ULONG *aID) 15141 { 15142 RT_NOREF(aID); 15143 ReturnComNotImplemented(); 15144 } 15145 15146 HRESULT Machine::clipboardAreaGetRefCount(ULONG aID, ULONG *aRefCount) 15147 { 15148 RT_NOREF(aID, aRefCount); 15149 ReturnComNotImplemented(); 15150 } 15151 15044 15152 HRESULT Machine::pullGuestProperties(std::vector<com::Utf8Str> &aNames, 15045 15153 std::vector<com::Utf8Str> &aValues, -
trunk/src/VBox/Main/src-server/VirtualBoxImpl.cpp
r78827 r78897 45 45 #include <VBox/settings.h> 46 46 #include <VBox/version.h> 47 48 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 49 # include <VBox/GuestHost/SharedClipboard-uri.h> 50 #endif 47 51 48 52 #include <package-generated.h> … … 219 223 typedef std::map<Guid, ComObjPtr<Medium> > HardDiskMap; 220 224 225 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 226 /** 227 * Structure for keeping Shared Clipboard area data within the VirtualBox object. 228 */ 229 struct 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. */ 241 typedef std::map<ULONG, SharedClipboardAreaData> SharedClipboardAreaMap; 242 243 /** 244 * Structure for keeping global Shared Clipboard data within the VirtualBox object. 245 */ 246 struct 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 */ 221 263 222 264 /** … … 366 408 bool fWatcherIsReliable; 367 409 #endif 410 411 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 412 /** Data related to Shared Clipboard handling. */ 413 SharedClipboardData SharedClipboard; 414 #endif 368 415 }; 369 416 … … 3285 3332 }; 3286 3333 3334 #ifdef VBOX_WITH_SHARED_CLIPBOARD_URI_LIST 3335 int 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 3343 int 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 3352 int 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 3403 int 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 3434 int 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 3456 int 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 3478 ULONG 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 3494 ULONG 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 3287 3514 /** 3288 3515 * @note Doesn't lock any object.
Note:
See TracChangeset
for help on using the changeset viewer.