Changeset 85474 in vbox for trunk/src/VBox/Additions/common
- Timestamp:
- Jul 27, 2020 6:07:14 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 139528
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibDragAndDrop.cpp
r85437 r85474 381 381 uint64_t cbFileWritten = 0; /* Written bytes. */ 382 382 383 /*384 * Create and query the (unique) drop target directory in the user's temporary directory.385 */386 int rc = DnDDroppedFilesOpenTemp(pDroppedFiles, 0 /* fFlags */);387 if (RT_FAILURE(rc))388 {389 RTMemFree(pvChunk);390 return rc;391 }392 393 383 const char *pszDropDir = DnDDroppedFilesGetDirAbs(pDroppedFiles); 394 384 AssertPtr(pszDropDir); 385 386 int rc; 395 387 396 388 /* … … 820 812 AssertPtrReturn(pMeta, VERR_INVALID_POINTER); 821 813 814 AssertMsgReturn(pCtx->cbMaxChunkSize, ("Maximum chunk size must not be 0\n"), VERR_INVALID_PARAMETER); 815 822 816 VBOXDNDDATAHDR dataHdr; 823 817 RT_ZERO(dataHdr); 824 825 AssertMsg(pCtx->cbMaxChunkSize, ("Maximum chunk size must not be 0\n"));826 827 818 dataHdr.cbMetaFmt = pCtx->cbMaxChunkSize; 828 819 dataHdr.pvMetaFmt = RTMemAlloc(dataHdr.cbMetaFmt); … … 831 822 832 823 DNDDROPPEDFILES droppedFiles; 824 RT_ZERO(droppedFiles); 825 826 int rc = DnDDroppedFilesInit(&droppedFiles); 827 if (RT_SUCCESS(rc)) 828 rc = DnDDroppedFilesOpenTemp(&droppedFiles, DNDURIDROPPEDFILE_FLAGS_NONE); 829 830 if (RT_FAILURE(rc)) 831 { 832 LogRel(("DnD: Initializing dropped files directory failed with %Rrc\n", rc)); 833 return rc; 834 } 833 835 834 836 void *pvData = NULL; 835 837 uint64_t cbData = 0; 836 838 837 intrc = vbglR3DnDHGRecvDataLoop(pCtx, &dataHdr, &pvData, &cbData);839 rc = vbglR3DnDHGRecvDataLoop(pCtx, &dataHdr, &pvData, &cbData); 838 840 if (RT_SUCCESS(rc)) 839 841 { … … 857 859 if (RT_SUCCESS(rc)) 858 860 { 859 rc = DnDTransferListAppend PathsFromBuffer(&pMeta->u.URI.Transfer, DNDTRANSFERLISTFMT_URI, (const char *)pvData, cbData,861 rc = DnDTransferListAppendRootsFromBuffer(&pMeta->u.URI.Transfer, DNDTRANSFERLISTFMT_URI, (const char *)pvData, cbData, 860 862 DND_PATH_SEPARATOR, 0 /* fFlags */); 861 863 if (RT_SUCCESS(rc)) 864 { 862 865 rc = vbglR3DnDHGRecvURIData(pCtx, &dataHdr, &droppedFiles); 866 if (RT_SUCCESS(rc)) 867 { 868 pMeta->enmType = VBGLR3GUESTDNDMETADATATYPE_URI_LIST; 869 } 870 } 863 871 } 864 872 } … … 1427 1435 { 1428 1436 HGCMMsgGHSendData MsgData; 1429 1430 1437 VBGL_HGCM_HDR_INIT(&MsgData.hdr, pCtx->uClientID, GUEST_DND_GH_SND_DATA, 5); 1431 1438 MsgData.u.v3.uContext.SetUInt32(0); /** @todo Not used yet. */ … … 1437 1444 uint32_t cbSent = 0; 1438 1445 1439 HGCMFunctionParameter *pParm = &MsgData.u.v3.pvData;1440 1441 1446 while (cbSent < cbData) 1442 1447 { 1443 1448 cbCurChunk = RT_MIN(cbData - cbSent, cbMaxChunk); 1444 pParm->SetPtr(static_cast<uint8_t *>(pvData) + cbSent, cbCurChunk); 1445 1449 MsgData.u.v3.pvData.SetPtr(static_cast<uint8_t *>(pvData) + cbSent, cbCurChunk); 1446 1450 MsgData.u.v3.cbData.SetUInt32(cbCurChunk); 1447 1451 … … 1479 1483 1480 1484 const char *pcszPath = DnDTransferObjectGetDestPath(pObj); 1481 const size_t c chPath = RTStrNLen(pcszPath, RTPATH_MAX);1485 const size_t cbPath = RTStrNLen(pcszPath, RTPATH_MAX) + 1 /* Include termination. */; 1482 1486 const RTFMODE fMode = DnDTransferObjectGetMode(pObj); 1483 1487 1484 LogFlowFunc(("strDir=%s (%zu ), fMode=0x%x\n", pcszPath, cchPath, fMode));1485 1486 if (c chPath > RTPATH_MAX) /* Can't happen, but check anyway. */1488 LogFlowFunc(("strDir=%s (%zu bytes), fMode=0x%x\n", pcszPath, cbPath, fMode)); 1489 1490 if (cbPath > RTPATH_MAX + 1) /* Can't happen, but check anyway. */ 1487 1491 return VERR_INVALID_PARAMETER; 1488 1492 … … 1491 1495 /** @todo Context ID not used yet. */ 1492 1496 Msg.u.v3.uContext.SetUInt32(0); 1493 Msg.u.v3.pvName.SetPtr((void *)pcszPath, (uint32_t)c chPath);1494 Msg.u.v3.cbName.SetUInt32((uint32_t)c chPath + 1); /* Include termination. */1497 Msg.u.v3.pvName.SetPtr((void *)pcszPath, (uint32_t)cbPath); 1498 Msg.u.v3.cbName.SetUInt32((uint32_t)cbPath); 1495 1499 Msg.u.v3.fMode.SetUInt32(fMode); 1496 1500 … … 1508 1512 static int vbglR3DnDGHSendFile(PVBGLR3GUESTDNDCMDCTX pCtx, PDNDTRANSFEROBJECT pObj) 1509 1513 { 1510 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 1511 AssertPtrReturn(pObj, VERR_INVALID_POINTER); 1514 AssertPtrReturn(pCtx, VERR_INVALID_POINTER); 1515 AssertPtrReturn(pObj, VERR_INVALID_POINTER); 1516 AssertReturn(DnDTransferObjectIsOpen(pObj) == false, VERR_INVALID_STATE); 1512 1517 AssertReturn(DnDTransferObjectGetType(pObj) == DNDTRANSFEROBJTYPE_FILE, VERR_INVALID_PARAMETER); 1513 AssertReturn(DnDTransferObjectIsOpen(pObj), VERR_INVALID_STATE); 1518 1519 uint64_t fOpen = RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE; 1520 1521 int rc = DnDTransferObjectOpen(pObj, fOpen, 0 /* fMode */, DNDTRANSFEROBJECT_FLAGS_NONE); 1522 if (RT_FAILURE(rc)) 1523 return rc; 1514 1524 1515 1525 uint32_t cbBuf = _64K; /** @todo Make this configurable? */ 1516 1526 void *pvBuf = RTMemAlloc(cbBuf); /** @todo Make this buffer part of PVBGLR3GUESTDNDCMDCTX? */ 1517 1527 if (!pvBuf) 1528 { 1529 DnDTransferObjectClose(pObj); 1518 1530 return VERR_NO_MEMORY; 1531 } 1519 1532 1520 1533 const char *pcszPath = DnDTransferObjectGetDestPath(pObj); … … 1534 1547 MsgHdr.cbTotal.SetUInt64(cbSize); /* File size (in bytes). */ 1535 1548 1536 intrc = VbglR3HGCMCall(&MsgHdr.hdr, sizeof(MsgHdr));1549 rc = VbglR3HGCMCall(&MsgHdr.hdr, sizeof(MsgHdr)); 1537 1550 1538 1551 LogFlowFunc(("Sending file header resulted in %Rrc\n", rc)); … … 1586 1599 1587 1600 RTMemFree(pvBuf); 1601 DnDTransferObjectClose(pObj); 1588 1602 1589 1603 LogFlowFuncLeaveRC(rc); … … 1738 1752 { 1739 1753 DNDTRANSFERLIST lstTransfer; 1754 RT_ZERO(lstTransfer); 1755 1740 1756 rc = DnDTransferListInit(&lstTransfer); 1741 1757 if (RT_SUCCESS(rc)) … … 1743 1759 /** @todo Add symlink support (DNDTRANSFERLIST_FLAGS_RESOLVE_SYMLINKS) here. */ 1744 1760 /** @todo Add lazy loading (DNDTRANSFERLIST_FLAGS_LAZY) here. */ 1745 const DNDTRANSFERLISTFLAGS fFlags = DNDTRANSFERLIST_FLAGS_ KEEP_OPEN;1746 1747 rc = DnDTransferListAppendPathsFromBuffer(&lstTransfer, DNDTRANSFERLISTFMT_ NATIVE, (const char *)pvData, cbData,1761 const DNDTRANSFERLISTFLAGS fFlags = DNDTRANSFERLIST_FLAGS_RECURSIVE; 1762 1763 rc = DnDTransferListAppendPathsFromBuffer(&lstTransfer, DNDTRANSFERLISTFMT_URI, (const char *)pvData, cbData, 1748 1764 DND_PATH_SEPARATOR, fFlags); 1749 1765 if (RT_SUCCESS(rc)) … … 1751 1767 DnDTransferListDestroy(&lstTransfer); 1752 1768 } 1769 1770 if (RT_FAILURE(rc)) 1771 LogRel(("DnD: Sending guest meta data to host failed with %Rrc\n", rc)); 1753 1772 } 1754 1773 else
Note:
See TracChangeset
for help on using the changeset viewer.