Changeset 103366 in vbox for trunk/src/VBox
- Timestamp:
- Feb 14, 2024 6:43:42 PM (12 months ago)
- svn:sync-xref-src-repo-rev:
- 161683
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp
r103365 r103366 476 476 else 477 477 { 478 uint32_t const cbPrealloc = _4K;479 uint32_t cb = 0;480 481 /* Preallocate a buffer, most of small text transfers will fit into it. */482 HANDLE hMem = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, cbPrealloc);483 if ( hMem)484 { 485 void *pvMem = GlobalLock(hMem);486 if ( pvMem)478 void *pvData = NULL; 479 uint32_t cbData; 480 481 HANDLE hMem; 482 int rc = VbglR3ClipboardReadDataEx(&pCtx->CmdCtx, uFmtVBox, &pvData, &cbData); 483 if (RT_SUCCESS(rc)) 484 { 485 /* Verify the size of returned text, the memory block for clipboard must have the exact string size. */ 486 if (uFmtVBox == VBOX_SHCL_FMT_UNICODETEXT) 487 487 { 488 /* Read the host data to the preallocated buffer. */489 int rc = VbglR3ClipboardReadDataEx(&pCtx->CmdCtx, uFmtVBox, pvMem, cbPrealloc, &cb);488 size_t cwcActual = 0; 489 rc = RTUtf16NLenEx((PCRTUTF16)pvData, cbData / sizeof(RTUTF16), &cwcActual); 490 490 if (RT_SUCCESS(rc)) 491 cbData = (uint32_t)((cwcActual + 1 /* '\0' */) * sizeof(RTUTF16)); 492 else 493 LogRel(("Shared Clipboard: Invalid UTF16 string from host: cb=%RU32, cwcActual=%zu, rc=%Rrc\n", 494 cbData, cwcActual, rc)); 495 } 496 else if (uFmtVBox == VBOX_SHCL_FMT_HTML) 497 { 498 /* Wrap content into CF_HTML clipboard format if needed. */ 499 if (!SharedClipboardWinIsCFHTML((const char *)pvMem)) 491 500 { 492 if (cb == 0) 501 char *pszWrapped = NULL; 502 uint32_t cbWrapped = 0; 503 rc = SharedClipboardWinConvertMIMEToCFHTML((const char *)pvData, cbData, &pszWrapped, &cbWrapped); 504 if (RT_SUCCESS(rc)) 493 505 { 494 /* 0 bytes returned means the clipboard is empty. 495 * Deallocate the memory and set hMem to NULL to get to 496 * the clipboard empty code path. */ 497 GlobalUnlock(hMem); 498 GlobalFree(hMem); 499 hMem = NULL; 500 } 501 else if (cb > cbPrealloc) 502 { 503 GlobalUnlock(hMem); 504 505 LogRel2(("Shared Clipboard: Buffer too small (%RU32), needs %RU32 bytes\n", cbPrealloc, cb)); 506 507 /* The preallocated buffer is too small, adjust the size. */ 508 hMem = GlobalReAlloc(hMem, cb, 0); 509 if (hMem) 506 AssertBreakStmt(cbWrapped, rc = VERR_INVALID_PARAMETER); 507 pvData = RTMemReAlloc(pvData, cbWrapped); 508 if (pvData) 510 509 { 511 pvMem = GlobalLock(hMem); 512 if (pvMem) 513 { 514 /* Read the host data to the preallocated buffer. */ 515 uint32_t cbNew = 0; 516 rc = VbglR3ClipboardReadDataEx(&pCtx->CmdCtx, uFmtVBox, pvMem, cb, &cbNew); 517 if ( RT_SUCCESS(rc) 518 && cbNew <= cb) 519 { 520 cb = cbNew; 521 } 522 else 523 { 524 LogRel(("Shared Clipboard: Receiving host data failed with %Rrc\n", rc)); 525 526 GlobalUnlock(hMem); 527 GlobalFree(hMem); 528 hMem = NULL; 529 } 530 } 531 else 532 { 533 LogRel(("Shared Clipboard: Error locking reallocated host data buffer\n")); 534 535 GlobalFree(hMem); 536 hMem = NULL; 537 } 510 memcpy(pvData, pszWrapped, cbWrapped); 511 cbData = cbWrapped; 538 512 } 539 513 else 540 LogRel(("Shared Clipboard: No memory for reallocating host data buffer\n")); 514 rc = VERR_NO_MEMORY; 515 RTMemFree(pszWrapped); 541 516 } 542 517 543 if (hMem) 518 if (RT_FAILURE(rc)) 519 LogRel(("Shared Clipboard: Cannot convert HTML clipboard data into CF_HTML clipboard format, rc=%Rrc\n", rc)); 520 } 521 } 522 523 hMem = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, cbData); 524 if (hMem) 525 { 526 void *pvMem = GlobalLock(hMem); 527 if (pvMem) 528 { 529 memcpy(pvMem, pvData, cbData); 530 GlobalUnlock(hMem); 531 532 HANDLE hClip = SetClipboardData(uFmtWin, hMem); 533 if (!hClip) 544 534 { 545 /* pvMem is the address of the data. cb is the size of returned data. */ 546 /* Verify the size of returned text, the memory block for clipboard 547 * must have the exact string size. 548 */ 549 if (uFmtVBox == VBOX_SHCL_FMT_UNICODETEXT) 550 { 551 size_t cwcActual = 0; 552 rc = RTUtf16NLenEx((PCRTUTF16)pvMem, cb / sizeof(RTUTF16), &cwcActual); 553 if (RT_SUCCESS(rc)) 554 cb = (uint32_t)((cwcActual + 1 /* '\0' */) * sizeof(RTUTF16)); 555 else 556 { 557 LogRel(("Shared Clipboard: Invalid UTF16 string from host: cb=%RU32, cwcActual=%zu, rc=%Rrc\n", 558 cb, cwcActual, rc)); 559 560 /* Discard invalid data. */ 561 GlobalUnlock(hMem); 562 GlobalFree(hMem); 563 hMem = NULL; 564 } 565 } 566 else if (uFmtVBox == VBOX_SHCL_FMT_HTML) 567 { 568 /* Wrap content into CF_HTML clipboard format if needed. */ 569 if (!SharedClipboardWinIsCFHTML((const char *)pvMem)) 570 { 571 char *pszWrapped = NULL; 572 uint32_t cbWrapped = 0; 573 rc = SharedClipboardWinConvertMIMEToCFHTML((const char *)pvMem, cb, 574 &pszWrapped, &cbWrapped); 575 if (RT_SUCCESS(rc)) 576 { 577 if (GlobalUnlock(hMem) == 0) 578 { 579 hMem = GlobalReAlloc(hMem, cbWrapped, 0); 580 if (hMem) 581 { 582 pvMem = GlobalLock(hMem); 583 if (pvMem) 584 { 585 /* Copy wrapped content back to memory passed to system clipboard. */ 586 memcpy(pvMem, pszWrapped, cbWrapped); 587 cb = cbWrapped; 588 } 589 else 590 { 591 LogRel(("Shared Clipboard: Failed to lock memory (%u), HTML clipboard data won't be converted into CF_HTML clipboard format\n", GetLastError())); 592 GlobalFree(hMem); 593 hMem = NULL; 594 } 595 } 596 else 597 LogRel(("Shared Clipboard: Failed to re-allocate memory (%u), HTML clipboard data won't be converted into CF_HTML clipboard format\n", GetLastError())); 598 } 599 else 600 LogRel(("Shared Clipboard: Failed to unlock memory (%u), HTML clipboard data won't be converted into CF_HTML clipboard format\n", GetLastError())); 601 602 RTMemFree(pszWrapped); 603 } 604 else 605 LogRel(("Shared Clipboard: Cannot convert HTML clipboard data into CF_HTML clipboard format, rc=%Rrc\n", rc)); 606 } 607 } 535 /* The hMem ownership has gone to the system. Finish the processing. */ 536 break; 608 537 } 609 610 if (hMem) 611 { 612 GlobalUnlock(hMem); 613 614 hMem = GlobalReAlloc(hMem, cb, 0); 615 if (hMem) 616 { 617 /* 'hMem' contains the host clipboard data. 618 * size is 'cb' and format is 'format'. */ 619 HANDLE hClip = SetClipboardData(uFmtWin, hMem); 620 if (hClip) 621 { 622 /* The hMem ownership has gone to the system. Finish the processing. */ 623 break; 624 } 625 else 626 LogRel(("Shared Clipboard: Setting host data buffer to clipboard failed with %ld\n", 627 GetLastError())); 628 629 /* Cleanup follows. */ 630 } 631 else 632 LogRel(("Shared Clipboard: No memory for allocating final host data buffer\n")); 633 } 538 else 539 LogRel(("Shared Clipboard: Setting host data buffer to clipboard failed with %Rrc\n", 540 RTErrConvertFromWin32(GetLastError()))); 634 541 } 635 636 if (hMem)637 GlobalUnlock(hMem);542 else 543 LogRel(("Shared Clipboard: Failed to lock memory (%Rrc)\n", RTErrConvertFromWin32(GetLastError()))); 544 GlobalFree(hMem); 638 545 } 639 546 else 640 547 LogRel(("Shared Clipboard: No memory for allocating host data buffer\n")); 641 642 if (hMem)643 GlobalFree(hMem);644 548 } 645 549 }
Note:
See TracChangeset
for help on using the changeset viewer.