Changeset 78897 in vbox for trunk/src/VBox/Main/src-client
- Timestamp:
- May 31, 2019 3:23:14 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 131016
- Location:
- trunk/src/VBox/Main/src-client
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
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);
Note:
See TracChangeset
for help on using the changeset viewer.