VirtualBox

Changeset 85474 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Jul 27, 2020 6:07:14 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
139528
Message:

DnD/VbglR3: More fixes needed for new DnDTransferList and DnDTransferObject implementations.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibDragAndDrop.cpp

    r85437 r85474  
    381381    uint64_t cbFileWritten = 0; /* Written bytes. */
    382382
    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 
    393383    const char *pszDropDir = DnDDroppedFilesGetDirAbs(pDroppedFiles);
    394384    AssertPtr(pszDropDir);
     385
     386    int rc;
    395387
    396388    /*
     
    820812    AssertPtrReturn(pMeta, VERR_INVALID_POINTER);
    821813
     814    AssertMsgReturn(pCtx->cbMaxChunkSize, ("Maximum chunk size must not be 0\n"), VERR_INVALID_PARAMETER);
     815
    822816    VBOXDNDDATAHDR dataHdr;
    823817    RT_ZERO(dataHdr);
    824 
    825     AssertMsg(pCtx->cbMaxChunkSize, ("Maximum chunk size must not be 0\n"));
    826 
    827818    dataHdr.cbMetaFmt = pCtx->cbMaxChunkSize;
    828819    dataHdr.pvMetaFmt = RTMemAlloc(dataHdr.cbMetaFmt);
     
    831822
    832823    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    }
    833835
    834836    void    *pvData = NULL;
    835837    uint64_t cbData = 0;
    836838
    837     int rc = vbglR3DnDHGRecvDataLoop(pCtx, &dataHdr, &pvData, &cbData);
     839    rc = vbglR3DnDHGRecvDataLoop(pCtx, &dataHdr, &pvData, &cbData);
    838840    if (RT_SUCCESS(rc))
    839841    {
     
    857859            if (RT_SUCCESS(rc))
    858860            {
    859                 rc = DnDTransferListAppendPathsFromBuffer(&pMeta->u.URI.Transfer, DNDTRANSFERLISTFMT_URI, (const char *)pvData, cbData,
     861                rc = DnDTransferListAppendRootsFromBuffer(&pMeta->u.URI.Transfer, DNDTRANSFERLISTFMT_URI, (const char *)pvData, cbData,
    860862                                                          DND_PATH_SEPARATOR, 0 /* fFlags */);
    861863                if (RT_SUCCESS(rc))
     864                {
    862865                    rc = vbglR3DnDHGRecvURIData(pCtx, &dataHdr, &droppedFiles);
     866                    if (RT_SUCCESS(rc))
     867                    {
     868                        pMeta->enmType = VBGLR3GUESTDNDMETADATATYPE_URI_LIST;
     869                    }
     870                }
    863871            }
    864872        }
     
    14271435    {
    14281436        HGCMMsgGHSendData MsgData;
    1429 
    14301437        VBGL_HGCM_HDR_INIT(&MsgData.hdr, pCtx->uClientID, GUEST_DND_GH_SND_DATA, 5);
    14311438        MsgData.u.v3.uContext.SetUInt32(0);      /** @todo Not used yet. */
     
    14371444        uint32_t       cbSent     = 0;
    14381445
    1439         HGCMFunctionParameter *pParm = &MsgData.u.v3.pvData;
    1440 
    14411446        while (cbSent < cbData)
    14421447        {
    14431448            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);
    14461450            MsgData.u.v3.cbData.SetUInt32(cbCurChunk);
    14471451
     
    14791483
    14801484    const char *pcszPath = DnDTransferObjectGetDestPath(pObj);
    1481     const size_t cchPath = RTStrNLen(pcszPath, RTPATH_MAX);
     1485    const size_t cbPath  = RTStrNLen(pcszPath, RTPATH_MAX) + 1 /* Include termination. */;
    14821486    const RTFMODE fMode  = DnDTransferObjectGetMode(pObj);
    14831487
    1484     LogFlowFunc(("strDir=%s (%zu), fMode=0x%x\n", pcszPath, cchPath, fMode));
    1485 
    1486     if (cchPath > 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. */
    14871491        return VERR_INVALID_PARAMETER;
    14881492
     
    14911495    /** @todo Context ID not used yet. */
    14921496    Msg.u.v3.uContext.SetUInt32(0);
    1493     Msg.u.v3.pvName.SetPtr((void *)pcszPath, (uint32_t)cchPath);
    1494     Msg.u.v3.cbName.SetUInt32((uint32_t)cchPath + 1); /* Include termination. */
     1497    Msg.u.v3.pvName.SetPtr((void *)pcszPath, (uint32_t)cbPath);
     1498    Msg.u.v3.cbName.SetUInt32((uint32_t)cbPath);
    14951499    Msg.u.v3.fMode.SetUInt32(fMode);
    14961500
     
    15081512static int vbglR3DnDGHSendFile(PVBGLR3GUESTDNDCMDCTX pCtx, PDNDTRANSFEROBJECT pObj)
    15091513{
    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);
    15121517    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;
    15141524
    15151525    uint32_t cbBuf = _64K;           /** @todo Make this configurable? */
    15161526    void *pvBuf = RTMemAlloc(cbBuf); /** @todo Make this buffer part of PVBGLR3GUESTDNDCMDCTX? */
    15171527    if (!pvBuf)
     1528    {
     1529        DnDTransferObjectClose(pObj);
    15181530        return VERR_NO_MEMORY;
     1531    }
    15191532
    15201533    const char *pcszPath  = DnDTransferObjectGetDestPath(pObj);
     
    15341547    MsgHdr.cbTotal.SetUInt64(cbSize);                                                /* File size (in bytes). */
    15351548
    1536     int rc = VbglR3HGCMCall(&MsgHdr.hdr, sizeof(MsgHdr));
     1549    rc = VbglR3HGCMCall(&MsgHdr.hdr, sizeof(MsgHdr));
    15371550
    15381551    LogFlowFunc(("Sending file header resulted in %Rrc\n", rc));
     
    15861599
    15871600    RTMemFree(pvBuf);
     1601    DnDTransferObjectClose(pObj);
    15881602
    15891603    LogFlowFuncLeaveRC(rc);
     
    17381752    {
    17391753        DNDTRANSFERLIST lstTransfer;
     1754        RT_ZERO(lstTransfer);
     1755
    17401756        rc = DnDTransferListInit(&lstTransfer);
    17411757        if (RT_SUCCESS(rc))
     
    17431759            /** @todo Add symlink support (DNDTRANSFERLIST_FLAGS_RESOLVE_SYMLINKS) here. */
    17441760            /** @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,
    17481764                                                      DND_PATH_SEPARATOR, fFlags);
    17491765            if (RT_SUCCESS(rc))
     
    17511767            DnDTransferListDestroy(&lstTransfer);
    17521768        }
     1769
     1770        if (RT_FAILURE(rc))
     1771            LogRel(("DnD: Sending guest meta data to host failed with %Rrc\n", rc));
    17531772    }
    17541773    else
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette