Changeset 79630 in vbox for trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp
- Timestamp:
- Jul 9, 2019 8:14:01 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 131932
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-uri.cpp
r79497 r79630 41 41 extern PFNHGCMSVCEXT g_pfnExtension; 42 42 extern void *g_pvExtension; 43 extern PVBOXHGCMSVCHELPERS g_pHelpers; 43 44 44 45 extern ClipboardClientQueue g_listClientsDeferred; 46 47 48 /********************************************************************************************************************************* 49 * Prototypes * 50 *********************************************************************************************************************************/ 51 int VBoxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 52 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms); 45 53 46 54 … … 66 74 67 75 DECLCALLBACK(int) vboxSvcClipboardURIListOpen(PSHAREDCLIPBOARDPROVIDERCTX pCtx, 68 PVBOXCLIPBOARDLISTHDR pListHdr, PVBOXCLIPBOARDLISTHANDLE phList) 69 { 70 RT_NOREF(pCtx, pListHdr, phList); 71 72 LogFlowFuncEnter(); 73 74 int rc = VINF_SUCCESS; 75 76 LogFlowFuncLeaveRC(rc); 77 return rc; 78 } 79 80 DECLCALLBACK(int) vboxSvcClipboardURIListClose(PSHAREDCLIPBOARDPROVIDERCTX pCtx, VBOXCLIPBOARDLISTHANDLE hList) 81 { 82 RT_NOREF(pCtx, hList); 83 84 LogFlowFuncEnter(); 85 86 int rc = VINF_SUCCESS; 87 88 LogFlowFuncLeaveRC(rc); 89 return rc; 90 } 91 92 DECLCALLBACK(int) vboxSvcClipboardURIListHdrRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx, 93 VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr) 94 { 95 RT_NOREF(pCtx, hList, pListHdr); 76 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms, PSHAREDCLIPBOARDLISTHANDLE phList) 77 { 78 RT_NOREF(phList); 96 79 97 80 LogFlowFuncEnter(); … … 102 85 int rc; 103 86 104 PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ HDR_READ,105 VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ HDR_READ);87 PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_OPEN, 88 VBOX_SHARED_CLIPBOARD_CPARMS_LIST_OPEN); 106 89 if (pMsg) 107 90 { 108 rc = vboxSvcClipboardMsgAdd(&pClient->pData->State, pMsg, true /* fAppend */); 109 if (RT_SUCCESS(rc)) 110 rc = vboxSvcClipboardClientDeferredComplete(pClient, VINF_SUCCESS); 91 rc = VBoxSvcClipboardURISetListOpen(pMsg->m_cParms, pMsg->m_paParms, pOpenParms); 92 if (RT_SUCCESS(rc)) 93 { 94 rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsg, true /* fAppend */); 95 if (RT_SUCCESS(rc)) 96 { 97 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN); 98 AssertRC(rc2); 99 100 vboxSvcClipboardClientWakeup(pClient); 101 } 102 } 111 103 } 112 104 else … … 116 108 { 117 109 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 118 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ HDR_READ,110 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN, 119 111 30 * 1000 /* Timeout in ms */, &pPayload); 120 112 if (RT_SUCCESS(rc)) 121 113 { 114 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDREPLY)); 115 116 PVBOXCLIPBOARDREPLY pReply = (PVBOXCLIPBOARDREPLY)pPayload->pvData; 117 AssertPtr(pReply); 118 119 Assert(pReply->uType == VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN); 120 121 *phList = pReply->u.ListOpen.uHandle; 122 123 SharedClipboardURITransferPayloadFree(pPayload); 124 } 125 } 126 127 LogFlowFuncLeaveRC(rc); 128 return rc; 129 } 130 131 DECLCALLBACK(int) vboxSvcClipboardURIListClose(PSHAREDCLIPBOARDPROVIDERCTX pCtx, SHAREDCLIPBOARDLISTHANDLE hList) 132 { 133 RT_NOREF(pCtx, hList); 134 135 LogFlowFuncEnter(); 136 137 int rc = VINF_SUCCESS; 138 139 LogFlowFuncLeaveRC(rc); 140 return rc; 141 } 142 143 DECLCALLBACK(int) vboxSvcClipboardURIListHdrRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx, 144 SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr) 145 { 146 LogFlowFuncEnter(); 147 148 PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)pCtx->pvUser; 149 AssertPtr(pClient); 150 151 int rc; 152 153 PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_HDR_READ, 154 VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR_READ_REQ); 155 if (pMsg) 156 { 157 HGCMSvcSetU32(&pMsg->m_paParms[0], 0 /* uContextID */); 158 HGCMSvcSetU64(&pMsg->m_paParms[1], hList); 159 HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fFlags */); 160 161 rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsg, true /* fAppend */); 162 if (RT_SUCCESS(rc)) 163 { 164 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE); 165 AssertRC(rc2); 166 167 vboxSvcClipboardClientWakeup(pClient); 168 } 169 } 170 else 171 rc = VERR_NO_MEMORY; 172 173 if (RT_SUCCESS(rc)) 174 { 175 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 176 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE, 177 30 * 1000 /* Timeout in ms */, &pPayload); 178 if (RT_SUCCESS(rc)) 179 { 122 180 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTHDR)); 123 //*ppListHdr = (PVBOXCLIPBOARDLISTHDR)pPayload->pvData; 124 125 RTMemFree(pPayload); 181 182 *pListHdr = *(PVBOXCLIPBOARDLISTHDR)pPayload->pvData; 183 184 SharedClipboardURITransferPayloadFree(pPayload); 126 185 } 127 186 } … … 132 191 133 192 DECLCALLBACK(int) vboxSvcClipboardURIListHdrWrite(PSHAREDCLIPBOARDPROVIDERCTX pCtx, 134 VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr)193 SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTHDR pListHdr) 135 194 { 136 195 RT_NOREF(pCtx, hList, pListHdr); … … 142 201 143 202 DECLCALLBACK(int) vboxSvcClipboardURIListEntryRead(PSHAREDCLIPBOARDPROVIDERCTX pCtx, 144 VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry) 145 { 146 RT_NOREF(pCtx, hList, pListEntry); 147 148 LogFlowFuncEnter(); 149 150 PVBOXCLIPBOARDCLIENTDATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pCtx->pvUser; 151 AssertPtr(pClientData); 152 153 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 154 int rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_READ, 203 SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry) 204 { 205 LogFlowFuncEnter(); 206 207 PVBOXCLIPBOARDCLIENT pClient = (PVBOXCLIPBOARDCLIENT)pCtx->pvUser; 208 AssertPtr(pClient); 209 210 int rc; 211 212 PVBOXCLIPBOARDCLIENTMSG pMsg = vboxSvcClipboardMsgAlloc(VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_LIST_ENTRY_READ, 213 VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY_READ_REQ); 214 if (pMsg) 215 { 216 HGCMSvcSetU32(&pMsg->m_paParms[0], 0 /* uContextID */); 217 HGCMSvcSetU64(&pMsg->m_paParms[1], hList); 218 HGCMSvcSetU32(&pMsg->m_paParms[2], 0 /* fInfo */); 219 220 rc = vboxSvcClipboardMsgAdd(pClient->pData, pMsg, true /* fAppend */); 221 if (RT_SUCCESS(rc)) 222 { 223 int rc2 = SharedClipboardURITransferEventRegister(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE); 224 if (rc2 == VERR_ALREADY_EXISTS) 225 rc2 = VINF_SUCCESS; 226 AssertRC(rc2); 227 228 vboxSvcClipboardClientWakeup(pClient); 229 } 230 } 231 else 232 rc = VERR_NO_MEMORY; 233 234 if (RT_SUCCESS(rc)) 235 { 236 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 237 rc = SharedClipboardURITransferEventWait(pCtx->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE, 155 238 30 * 1000 /* Timeout in ms */, &pPayload); 156 if (RT_SUCCESS(rc)) 157 { 158 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTENTRY)); 159 160 PVBOXCLIPBOARDLISTENTRY pListEntry = (PVBOXCLIPBOARDLISTENTRY)pPayload->pvData; 161 AssertPtr(pListEntry); 162 163 /* const uint32_t cbToRead = RT_MIN(cbChunk, pListEntry->cbData); 164 165 memcpy(pvChunk, pListEntry->pvData, cbToRead);*/ 166 167 SharedClipboardURITransferPayloadFree(pPayload); 168 169 /* if (pcbRead) 170 *pcbRead = cbToRead;*/ 239 if (RT_SUCCESS(rc)) 240 { 241 Assert(pPayload->cbData == sizeof(VBOXCLIPBOARDLISTENTRY)); 242 243 rc = SharedClipboardURIListEntryCopy(pListEntry, (PVBOXCLIPBOARDLISTENTRY)pPayload->pvData); 244 245 SharedClipboardURITransferPayloadFree(pPayload); 246 } 171 247 } 172 248 … … 176 252 177 253 DECLCALLBACK(int) vboxSvcClipboardURIListEntryWrite(PSHAREDCLIPBOARDPROVIDERCTX pCtx, 178 VBOXCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry)254 SHAREDCLIPBOARDLISTHANDLE hList, PVBOXCLIPBOARDLISTENTRY pListEntry) 179 255 { 180 256 RT_NOREF(pCtx, hList, pListEntry); … … 237 313 DECLCALLBACK(void) VBoxSvcClipboardURITransferPrepareCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData) 238 314 { 239 LogFlowFuncEnter(); 240 241 AssertPtrReturnVoid(pData); 242 243 PVBOXCLIPBOARDCLIENTDATA pClientData = (PVBOXCLIPBOARDCLIENTDATA)pData->pvUser; 244 AssertPtrReturnVoid(pClientData); 245 246 PSHAREDCLIPBOARDURITRANSFER pTransfer = pData->pTransfer; 247 AssertPtrReturnVoid(pTransfer); 248 249 /* Register needed events. */ 250 int rc2 = SharedClipboardURITransferEventRegister(pData->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_READ); 251 AssertRC(rc2); 252 rc2 = SharedClipboardURITransferEventRegister(pData->pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_READ); 253 AssertRC(rc2); 254 255 #if 0 256 /* Tell the guest that it can start sending URI data. */ 257 rc2 = vboxSvcClipboardReportMsg(pClientData, VBOX_SHARED_CLIPBOARD_HOST_MSG_URI_TRANSFER_START, 258 0 /* u32Formats == 0 means reading data */); 259 AssertRC(rc2); 260 #endif 315 RT_NOREF(pData); 316 317 LogFlowFuncEnter(); 261 318 } 262 319 263 320 DECLCALLBACK(void) VBoxSvcClipboardURITransferCompleteCallback(PSHAREDCLIPBOARDURITRANSFERCALLBACKDATA pData, int rc) 264 321 { 265 LogFlowFuncEnter();266 267 322 RT_NOREF(pData, rc); 268 323 324 LogFlowFuncEnter(); 325 269 326 LogRel2(("Shared Clipboard: Transfer complete\n")); 270 327 } … … 286 343 287 344 LogRel(("Shared Clipboard: Transfer failed with %Rrc\n", rc)); 345 } 346 347 /** 348 * Gets an URI message reply from HGCM service parameters. 349 * 350 * @returns VBox status code. 351 * @param cParms Number of HGCM parameters supplied in \a paParms. 352 * @param paParms Array of HGCM parameters. 353 * @param pReply Where to store the reply. 354 */ 355 int VBoxSvcClipboardURIGetReply(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 356 PVBOXCLIPBOARDREPLY pReply) 357 { 358 int rc; 359 360 if (cParms >= VBOX_SHARED_CLIPBOARD_CPARMS_REPLY_MIN) 361 { 362 uint32_t cbPayload = 0; 363 364 /* Note: Context ID (paParms[0]) not used yet. */ 365 rc = HGCMSvcGetU32(&paParms[1], &pReply->uType); 366 if (RT_SUCCESS(rc)) 367 rc = HGCMSvcGetU32(&paParms[2], &pReply->rc); 368 if (RT_SUCCESS(rc)) 369 rc = HGCMSvcGetU32(&paParms[3], &cbPayload); 370 if (RT_SUCCESS(rc)) 371 { 372 rc = HGCMSvcGetPv(&paParms[4], &pReply->pvPayload, &pReply->cbPayload); 373 AssertReturn(cbPayload == pReply->cbPayload, VERR_INVALID_PARAMETER); 374 } 375 376 if (RT_SUCCESS(rc)) 377 { 378 switch (pReply->uType) 379 { 380 case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN: 381 { 382 if (cParms >= 6) 383 { 384 rc = HGCMSvcGetU64(&paParms[5], &pReply->u.ListOpen.uHandle); 385 } 386 else 387 rc = VERR_INVALID_PARAMETER; 388 break; 389 } 390 391 case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_OBJ_OPEN: 392 { 393 if (cParms >= 6) 394 { 395 rc = HGCMSvcGetU64(&paParms[5], &pReply->u.ObjOpen.uHandle); 396 } 397 else 398 rc = VERR_INVALID_PARAMETER; 399 break; 400 } 401 402 default: 403 break; 404 } 405 } 406 } 407 else 408 rc = VERR_INVALID_PARAMETER; 409 410 LogFlowFuncLeaveRC(rc); 411 return rc; 412 } 413 414 /** 415 * Gets an URI list open request from HGCM service parameters. 416 * 417 * @returns VBox status code. 418 * @param cParms Number of HGCM parameters supplied in \a paParms. 419 * @param paParms Array of HGCM parameters. 420 * @param pOpenParms Where to store the open parameters of the request. 421 */ 422 int VBoxSvcClipboardURIGetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 423 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms) 424 { 425 int rc; 426 427 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_OPEN) 428 { 429 uint32_t cbPath = 0; 430 uint32_t cbFilter = 0; 431 432 /* Note: Context ID (paParms[0]) not used yet. */ 433 rc = HGCMSvcGetU32(&paParms[1], &pOpenParms->fList); 434 if (RT_SUCCESS(rc)) 435 rc = HGCMSvcGetU32(&paParms[2], &cbPath); 436 if (RT_SUCCESS(rc)) 437 { 438 rc = HGCMSvcGetStr(&paParms[3], &pOpenParms->pszPath, &pOpenParms->cbPath); 439 AssertReturn(cbPath == pOpenParms->cbPath, VERR_INVALID_PARAMETER); 440 } 441 if (RT_SUCCESS(rc)) 442 rc = HGCMSvcGetU32(&paParms[4], &cbFilter); 443 if (RT_SUCCESS(rc)) 444 { 445 rc = HGCMSvcGetStr(&paParms[5], &pOpenParms->pszFilter, &pOpenParms->cbFilter); 446 AssertReturn(cbFilter == pOpenParms->cbFilter, VERR_INVALID_PARAMETER); 447 } 448 449 if (RT_SUCCESS(rc)) 450 { 451 /** @todo Some more validation. */ 452 } 453 } 454 else 455 rc = VERR_INVALID_PARAMETER; 456 457 LogFlowFuncLeaveRC(rc); 458 return rc; 459 } 460 461 int VBoxSvcClipboardURISetListOpen(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 462 PVBOXCLIPBOARDLISTOPENPARMS pOpenParms) 463 { 464 int rc; 465 466 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_OPEN) 467 { 468 HGCMSvcSetU32(&paParms[0], 0 /* uContextID */); 469 HGCMSvcSetU32(&paParms[1], pOpenParms->fList); 470 HGCMSvcSetU32(&paParms[2], pOpenParms->cbFilter); 471 HGCMSvcSetPv (&paParms[3], pOpenParms->pszFilter, pOpenParms->cbFilter); 472 HGCMSvcSetU32(&paParms[4], pOpenParms->cbPath); 473 HGCMSvcSetPv (&paParms[5], pOpenParms->pszPath, pOpenParms->cbPath); 474 HGCMSvcSetU64(&paParms[6], 0); /* OUT: uHandle */ 475 476 rc = VINF_SUCCESS; 477 } 478 else 479 rc = VERR_INVALID_PARAMETER; 480 481 LogFlowFuncLeaveRC(rc); 482 return rc; 288 483 } 289 484 … … 298 493 */ 299 494 int VBoxSvcClipboardURIGetListHdr(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 300 P VBOXCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr)495 PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTHDR pListHdr) 301 496 { 302 497 int rc; 303 498 304 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR _WRITE)499 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR) 305 500 { 306 501 /* Note: Context ID (paParms[0]) not used yet. */ 307 502 rc = HGCMSvcGetU64(&paParms[1], phList); 308 if (RT_SUCCESS(rc)) 309 rc = HGCMSvcGetU64(&paParms[2], &pListHdr->cTotalObjects); 310 if (RT_SUCCESS(rc)) 311 rc = HGCMSvcGetU64(&paParms[3], &pListHdr->cbTotalSize); 312 if (RT_SUCCESS(rc)) 313 rc = HGCMSvcGetU32(&paParms[4], &pListHdr->enmCompression); 314 if (RT_SUCCESS(rc)) 315 rc = HGCMSvcGetU32(&paParms[5], (uint32_t *)&pListHdr->enmChecksumType); 503 /* Note: Flags (paParms[2]) not used here. */ 504 if (RT_SUCCESS(rc)) 505 rc = HGCMSvcGetU32(&paParms[3], &pListHdr->fFeatures); 506 if (RT_SUCCESS(rc)) 507 rc = HGCMSvcGetU64(&paParms[4], &pListHdr->cTotalObjects); 508 if (RT_SUCCESS(rc)) 509 rc = HGCMSvcGetU64(&paParms[5], &pListHdr->cbTotalSize); 510 if (RT_SUCCESS(rc)) 511 rc = HGCMSvcGetU32(&paParms[6], &pListHdr->enmCompression); 512 if (RT_SUCCESS(rc)) 513 rc = HGCMSvcGetU32(&paParms[7], (uint32_t *)&pListHdr->enmChecksumType); 316 514 317 515 if (RT_SUCCESS(rc)) … … 340 538 int rc; 341 539 342 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR_READ) 540 if ( cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR 541 || cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR) 343 542 { 344 543 /** @todo Set pvMetaFmt + cbMetaFmt. */ 345 544 /** @todo Calculate header checksum. */ 346 545 347 /* Note: Context ID (paParms[0]) not used yet. */ 348 HGCMSvcSetU32(&paParms[1], pListHdr->fList); 349 HGCMSvcSetU32(&paParms[2], pListHdr->fFeatures); 350 HGCMSvcSetU32(&paParms[3], pListHdr->cbFilter); 351 HGCMSvcSetPv (&paParms[4], pListHdr->pszFilter, pListHdr->cbFilter); 352 HGCMSvcSetU64(&paParms[5], pListHdr->cTotalObjects); 353 HGCMSvcSetU64(&paParms[6], pListHdr->cbTotalSize); 354 HGCMSvcSetU32(&paParms[7], pListHdr->enmCompression); 355 HGCMSvcSetU32(&paParms[8], (uint32_t)pListHdr->enmChecksumType); 546 HGCMSvcSetU32(&paParms[0], 0 /* uContextID */); 547 HGCMSvcSetU32(&paParms[1], pListHdr->fFeatures); 548 HGCMSvcSetU32(&paParms[2], 0 /* Features, will be returned on success */); 549 HGCMSvcSetU64(&paParms[3], pListHdr->cTotalObjects); 550 HGCMSvcSetU64(&paParms[4], pListHdr->cbTotalSize); 551 HGCMSvcSetU32(&paParms[5], pListHdr->enmCompression); 552 HGCMSvcSetU32(&paParms[6], pListHdr->enmChecksumType); 356 553 357 554 rc = VINF_SUCCESS; … … 374 571 */ 375 572 int VBoxSvcClipboardURIGetListEntry(uint32_t cParms, VBOXHGCMSVCPARM paParms[], 376 P VBOXCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTENTRY pListEntry)573 PSHAREDCLIPBOARDLISTHANDLE phList, PVBOXCLIPBOARDLISTENTRY pListEntry) 377 574 { 378 575 int rc; 379 576 380 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY _WRITE)577 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY) 381 578 { 382 579 /* Note: Context ID (paParms[0]) not used yet. */ … … 414 611 int rc; 415 612 416 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY _READ)613 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY) 417 614 { 418 615 /** @todo Calculate chunk checksum. */ 419 616 420 /* Note: Context ID (paParms[0]) not used yet. */617 HGCMSvcSetU32(&paParms[0], 0 /* uContextID */); 421 618 HGCMSvcSetU32(&paParms[1], pListEntry->fInfo); 422 619 HGCMSvcSetU32(&paParms[2], pListEntry->cbInfo); … … 432 629 } 433 630 631 /** 632 * Gets an URI error from HGCM service parameters. 633 * 634 * @returns VBox status code. 635 * @param cParms Number of HGCM parameters supplied in \a paParms. 636 * @param paParms Array of HGCM parameters. 637 * @param pRc Where to store the received error code. 638 */ 434 639 int VBoxSvcClipboardURIGetError(uint32_t cParms, VBOXHGCMSVCPARM paParms[], int *pRc) 435 640 { … … 446 651 else 447 652 rc = VERR_INVALID_PARAMETER; 653 654 LogFlowFuncLeaveRC(rc); 655 return rc; 656 } 657 658 int VBoxSvcClipboardURITransferHandleReply(PVBOXCLIPBOARDCLIENT pClient, PSHAREDCLIPBOARDURITRANSFER pTransfer, 659 uint32_t cParms, VBOXHGCMSVCPARM paParms[]) 660 { 661 RT_NOREF(pClient); 662 663 int rc; 664 665 uint32_t cbReply = sizeof(VBOXCLIPBOARDREPLY); 666 PVBOXCLIPBOARDREPLY pReply = (PVBOXCLIPBOARDREPLY)RTMemAlloc(cbReply); 667 if (pReply) 668 { 669 rc = VBoxSvcClipboardURIGetReply(cParms, paParms, pReply); 670 if (RT_SUCCESS(rc)) 671 { 672 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload 673 = (PSHAREDCLIPBOARDURITRANSFERPAYLOAD)RTMemAlloc(sizeof(SHAREDCLIPBOARDURITRANSFERPAYLOAD)); 674 if (pPayload) 675 { 676 pPayload->pvData = pReply; 677 pPayload->cbData = cbReply; 678 679 switch (pReply->uType) 680 { 681 case VBOX_SHAREDCLIPBOARD_REPLYMSGTYPE_LIST_OPEN: 682 { 683 rc = SharedClipboardURITransferEventSignal(pTransfer, 684 SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_OPEN, pPayload); 685 break; 686 } 687 688 default: 689 rc = VERR_NOT_FOUND; 690 break; 691 } 692 693 if (RT_FAILURE(rc)) 694 { 695 if (pPayload) 696 RTMemFree(pPayload); 697 } 698 } 699 else 700 rc = VERR_NO_MEMORY; 701 } 702 } 703 else 704 rc = VERR_NO_MEMORY; 705 706 if (RT_FAILURE(rc)) 707 { 708 if (pReply) 709 RTMemFree(pReply); 710 } 448 711 449 712 LogFlowFuncLeaveRC(rc); … … 471 734 RT_NOREF(paParms, tsArrival); 472 735 473 LogFlowFunc(("uClient=%RU32, u32Function=%RU32 , cParms=%RU32, g_pfnExtension=%p\n",474 pClient->uClientID, u32Function, cParms, g_pfnExtension));736 LogFlowFunc(("uClient=%RU32, u32Function=%RU32 (%s), cParms=%RU32, g_pfnExtension=%p\n", 737 pClient->uClientID, u32Function, VBoxSvcClipboardGuestMsgToStr(u32Function), cParms, g_pfnExtension)); 475 738 476 739 const PVBOXCLIPBOARDCLIENTDATA pClientData = pClient->pData; … … 503 766 switch (u32Function) 504 767 { 505 case VBOX_SHARED_CLIPBOARD_GUEST_FN_ GET_HOST_MSG:768 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT: 506 769 RT_FALL_THROUGH(); 507 case VBOX_SHARED_CLIPBOARD_GUEST_FN_TRANSFER_REPORT: 770 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT: 771 RT_FALL_THROUGH(); 772 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET: 773 RT_FALL_THROUGH(); 774 case VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS: 508 775 break; 509 776 default: … … 535 802 switch (u32Function) 536 803 { 537 case VBOX_SHARED_CLIPBOARD_GUEST_FN_TRANSFER_REPORT: 538 { 539 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_TRANSFER_REPORT\n")); 540 541 if (!SharedClipboardURICtxTransfersMaximumReached(&pClientData->URI)) 804 case VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS: 805 { 806 LogFlowFunc(("[Client %RU32] VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS\n", pClient->uClientID)); 807 808 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_STATUS) 809 break; 810 811 SHAREDCLIPBOARDURITRANSFERSTATUS uStatus = SHAREDCLIPBOARDURITRANSFERSTATUS_NONE; 812 rc = HGCMSvcGetU32(&paParms[1], &uStatus); 813 if (RT_FAILURE(rc)) 814 break; 815 816 LogFlowFunc(("uStatus: %RU32\n", uStatus)); 817 818 if ( uStatus == SHAREDCLIPBOARDURITRANSFERSTATUS_RUNNING 819 && !SharedClipboardURICtxTransfersMaximumReached(&pClientData->URI)) 542 820 { 543 821 SharedClipboardURICtxTransfersCleanup(&pClientData->URI); … … 592 870 SharedClipboardURITransferSetCallbacks(pTransfer, &Callbacks); 593 871 594 rc = SharedClipboardURITransfer ProviderCreate(pTransfer, &creationCtx);872 rc = SharedClipboardURITransferSetInterface(pTransfer, &creationCtx); 595 873 if (RT_SUCCESS(rc)) 596 874 rc = SharedClipboardURICtxTransferAdd(&pClientData->URI, pTransfer); … … 614 892 rc = VERR_SHCLPB_MAX_TRANSFERS_REACHED; 615 893 616 LogF unc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_TRANSFER_REPORT: %Rrc\n", rc));894 LogFlowFunc(("[Client %RU32] VBOX_SHARED_CLIPBOARD_GUEST_FN_STATUS: %Rrc\n", pClient->uClientID, rc)); 617 895 618 896 if (RT_FAILURE(rc)) … … 622 900 } 623 901 624 case VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG: 625 { 626 if (cParms == VBOX_SHARED_CLIPBOARD_CPARMS_GET_HOST_MSG) 627 { 628 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_GET_HOST_MSG\n")); 629 rc = vboxSvcClipboardMsgGetNextInfo(&pClientData->State, 630 &paParms[0].u.uint32 /* uMsg */, &paParms[1].u.uint32 /* cParms */); 631 632 /* No (new) messages available or some error occurred? */ 633 if ( rc == VERR_NO_DATA 634 || RT_FAILURE(rc)) 902 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_NOWAIT: 903 { 904 rc = vboxSvcClipboardMsgPeek(pClient, callHandle, cParms, paParms, false /*fWait*/); 905 break; 906 } 907 908 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_PEEK_WAIT: 909 { 910 rc = vboxSvcClipboardMsgPeek(pClient, callHandle, cParms, paParms, true /*fWait*/); 911 break; 912 } 913 914 case VBOX_SHARED_CLIPBOARD_GUEST_FN_MSG_GET: 915 { 916 rc = vboxSvcClipboardMsgGet(pClient, callHandle, cParms, paParms); 917 break; 918 } 919 920 case VBOX_SHARED_CLIPBOARD_GUEST_FN_REPLY: 921 { 922 rc = VBoxSvcClipboardURITransferHandleReply(pClient, pTransfer, cParms, paParms); 923 break; 924 } 925 926 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN: 927 { 928 VBOXCLIPBOARDLISTOPENPARMS listOpenParms; 929 rc = VBoxSvcClipboardURIGetListOpen(cParms, paParms, &listOpenParms); 930 if (RT_SUCCESS(rc)) 931 { 932 SHAREDCLIPBOARDLISTHANDLE hList; 933 rc = SharedClipboardURITransferListOpen(pTransfer, &listOpenParms, &hList); 934 if (RT_SUCCESS(rc)) 635 935 { 636 uint32_t fFlags = 0; 637 int rc2 = HGCMSvcGetU32(&paParms[2], &fFlags); 638 if ( RT_SUCCESS(rc2) 639 && fFlags) /* Blocking flag set? */ 640 { 641 /* Defer client returning. */ 642 rc = VINF_HGCM_ASYNC_EXECUTE; 643 } 644 else 645 rc = VERR_INVALID_PARAMETER; 646 647 LogFlowFunc(("Message queue is empty, returning %Rrc to guest\n", rc)); 936 /* Return list handle. */ 937 HGCMSvcSetU32(&paParms[1], hList); 648 938 } 649 939 } … … 651 941 } 652 942 653 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN:654 {655 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_OPEN\n"));656 rc = VINF_SUCCESS;657 break;658 }659 660 943 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE: 661 944 { 662 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_CLOSE\n")); 663 rc = VINF_SUCCESS; 945 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_LIST_CLOSE) 946 break; 947 948 SHAREDCLIPBOARDLISTHANDLE hList; 949 /* Note: Context ID (paParms[0]) not used yet. */ 950 rc = HGCMSvcGetU64(&paParms[1], &hList); 951 if (RT_SUCCESS(rc)) 952 { 953 rc = SharedClipboardURITransferListClose(pTransfer, hList); 954 } 664 955 break; 665 956 } … … 667 958 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_READ: 668 959 { 669 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_LIST_HDR\n")); 670 671 VBOXCLIPBOARDLISTHANDLE hList; 672 VBOXCLIPBOARDLISTHDR hdrList; 673 rc = VBoxSvcClipboardURIGetListHdr(cParms, paParms, &hList, &hdrList); 960 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_LIST_HDR) 961 break; 962 963 SHAREDCLIPBOARDLISTHANDLE hList; 964 /* Note: Context ID (paParms[0]) not used yet. */ 965 rc = HGCMSvcGetU64(&paParms[1], &hList); /* Get list handle. */ 674 966 if (RT_SUCCESS(rc)) 675 967 { 968 VBOXCLIPBOARDLISTHDR hdrList; 969 rc = SharedClipboardURITransferListGetHeader(pTransfer, hList, &hdrList); 676 970 if (RT_SUCCESS(rc)) 677 971 rc = VBoxSvcClipboardURISetListHdr(cParms, paParms, &hdrList); … … 682 976 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_HDR_WRITE: 683 977 { 684 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_LIST_HDR\n"));685 686 978 VBOXCLIPBOARDLISTHDR hdrList; 687 979 rc = SharedClipboardURIListHdrInit(&hdrList); 688 980 if (RT_SUCCESS(rc)) 689 981 { 690 VBOXCLIPBOARDLISTHANDLE hList;982 SHAREDCLIPBOARDLISTHANDLE hList; 691 983 rc = VBoxSvcClipboardURIGetListHdr(cParms, paParms, &hList, &hdrList); 692 984 if (RT_SUCCESS(rc)) … … 696 988 697 989 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 698 rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_ READ,990 rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE, 699 991 pvData, cbData, &pPayload); 700 992 if (RT_SUCCESS(rc)) 701 993 { 702 rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_ READ,994 rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_HDR_WRITE, 703 995 pPayload); 704 996 } … … 710 1002 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_READ: 711 1003 { 712 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_READ_LIST_ENTRY\n")); 1004 if (cParms != VBOX_SHARED_CLIPBOARD_CPARMS_LIST_ENTRY) 1005 break; 1006 1007 SHAREDCLIPBOARDLISTHANDLE hList; 1008 /* Note: Context ID (paParms[0]) not used yet. */ 1009 rc = HGCMSvcGetU64(&paParms[1], &hList); /* Get list handle. */ 1010 if (RT_SUCCESS(rc)) 1011 { 1012 VBOXCLIPBOARDLISTENTRY entryList; 1013 rc = SharedClipboardURITransferListRead(pTransfer, hList, &entryList); 1014 } 713 1015 break; 714 1016 } … … 716 1018 case VBOX_SHARED_CLIPBOARD_GUEST_FN_LIST_ENTRY_WRITE: 717 1019 { 718 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_LIST_ENTRY\n"));719 720 1020 VBOXCLIPBOARDLISTENTRY entryList; 721 1021 rc = SharedClipboardURIListEntryInit(&entryList); 722 1022 if (RT_SUCCESS(rc)) 723 1023 { 724 VBOXCLIPBOARDLISTHANDLE hList;1024 SHAREDCLIPBOARDLISTHANDLE hList; 725 1025 rc = VBoxSvcClipboardURIGetListEntry(cParms, paParms, &hList, &entryList); 726 1026 if (RT_SUCCESS(rc)) … … 730 1030 731 1031 PSHAREDCLIPBOARDURITRANSFERPAYLOAD pPayload; 732 rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_ READ,1032 rc = SharedClipboardURITransferPayloadAlloc(SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE, 733 1033 pvData, cbData, &pPayload); 734 1034 if (RT_SUCCESS(rc)) 735 1035 { 736 rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_ READ,1036 rc = SharedClipboardURITransferEventSignal(pTransfer, SHAREDCLIPBOARDURITRANSFEREVENTTYPE_LIST_ENTRY_WRITE, 737 1037 pPayload); 738 1038 } … … 742 1042 break; 743 1043 } 744 #if 0 1044 1045 #if 0 745 1046 case VBOX_SHARED_CLIPBOARD_GUEST_FN_WRITE_DIR: 746 1047 { … … 913 1214 #endif 914 1215 case VBOX_SHARED_CLIPBOARD_GUEST_FN_CANCEL: 915 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_CANCEL\n")); 916 1216 { 917 1217 LogRel2(("Shared Clipboard: Transfer canceled\n")); 918 1218 break; 1219 } 919 1220 920 1221 case VBOX_SHARED_CLIPBOARD_GUEST_FN_ERROR: 921 1222 { 922 LogFlowFunc(("VBOX_SHARED_CLIPBOARD_FN_ERROR\n"));923 924 1223 int rcGuest; 925 1224 rc = VBoxSvcClipboardURIGetError(cParms,paParms, &rcGuest); … … 930 1229 931 1230 default: 932 AssertMsgFailed(("Not implemented\n")); 933 break; 934 } 935 936 if (rc == VINF_HGCM_ASYNC_EXECUTE) 937 { 938 try 939 { 940 vboxSvcClipboardClientDefer(pClient, callHandle, u32Function, cParms, paParms); 941 g_listClientsDeferred.push_back(pClient->uClientID); 942 } 943 catch (std::bad_alloc &) 944 { 945 rc = VERR_NO_MEMORY; 946 /* Don't report to guest. */ 947 } 948 } 949 else if (pClient) 950 { 951 int rc2 = vboxSvcClipboardClientComplete(pClient, callHandle, rc); 952 AssertRC(rc2); 953 } 954 955 LogFlowFunc(("Returning uClient=%RU32, rc=%Rrc\n", pClient->uClientID, rc)); 1231 LogFunc(("Not implemented\n")); 1232 break; 1233 } 1234 1235 if (rc != VINF_HGCM_ASYNC_EXECUTE) 1236 { 1237 /* Tell the client that the call is complete (unblocks waiting). */ 1238 LogFlowFunc(("[Client %RU32] Calling pfnCallComplete w/ rc=%Rrc\n", pClient->uClientID, rc)); 1239 AssertPtr(g_pHelpers); 1240 g_pHelpers->pfnCallComplete(callHandle, rc); 1241 } 1242 1243 LogFlowFunc(("[Client %RU32] Returning rc=%Rrc\n", pClient->uClientID, rc)); 956 1244 return rc; 957 1245 }
Note:
See TracChangeset
for help on using the changeset viewer.