VirtualBox

Ignore:
Timestamp:
Apr 27, 2015 5:17:07 PM (10 years ago)
Author:
vboxsync
Message:

DnD: Bugfixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/GuestDnDTargetImpl.cpp

    r55427 r55459  
    530530    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    531531
    532     HRESULT hr;
     532    HRESULT hr = S_OK;
    533533    int vrc;
    534534
     
    682682    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
    683683
    684     RTCString strPath = aFile.GetDestPath();
    685     if (strPath.isEmpty())
     684    RTCString strPathSrc = aFile.GetSourcePath();
     685    if (strPathSrc.isEmpty())
    686686        return VERR_INVALID_PARAMETER;
    687687
     
    689689
    690690    LogFlowFunc(("Sending \"%s\" (%RU32 bytes buffer) using protocol v%RU32 ...\n",
    691                  aFile.GetDestPath().c_str(), m_cbBlockSize, mData.mProtocolVersion));
     691                 strPathSrc.c_str(), m_cbBlockSize, mData.mProtocolVersion));
     692
     693    bool fOpen = aFile.IsOpen();
     694    if (!fOpen)
     695    {
     696        LogFlowFunc(("Opening \"%s\" ...\n", strPathSrc.c_str()));
     697        rc = aFile.OpenEx(strPathSrc, DnDURIObject::File, DnDURIObject::Source,
     698                          RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE, 0 /* fFlags */);           
     699    }
    692700
    693701    bool fSendFileData = false;
    694     if (mData.mProtocolVersion >= 2)
    695     {
    696         if (!aFile.IsOpen())
    697         {
    698             rc = aFile.OpenEx(aFile.GetSourcePath(), DnDURIObject::File, DnDURIObject::Source,
    699                               RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE, 0 /* fFlags */);
    700             if (RT_SUCCESS(rc))
     702    if (RT_SUCCESS(rc))
     703    {
     704        if (mData.mProtocolVersion >= 2)
     705        {
     706            if (!fOpen)
    701707            {
    702708                /*
     
    706712                 */
    707713                pMsg->setType(DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR);
    708                 pMsg->setNextUInt32(0);                                /* context ID */
    709                 pMsg->setNextString(strPath.c_str());                  /* pvName */
    710                 pMsg->setNextUInt32((uint32_t)(strPath.length() + 1)); /* cbName */
    711                 pMsg->setNextUInt32(0);                                /* uFlags */
    712                 pMsg->setNextUInt32(aFile.GetMode());                  /* fMode */
    713                 pMsg->setNextUInt64(aFile.GetSize());                  /* uSize */
     714                pMsg->setNextUInt32(0);                                            /* context ID */
     715                rc = pMsg->setNextString(aFile.GetDestPath().c_str());             /* pvName */
     716                AssertRC(rc);
     717                pMsg->setNextUInt32((uint32_t)(aFile.GetDestPath().length() + 1)); /* cbName */
     718                pMsg->setNextUInt32(0);                                            /* uFlags */
     719                pMsg->setNextUInt32(aFile.GetMode());                              /* fMode */
     720                pMsg->setNextUInt64(aFile.GetSize());                              /* uSize */
    714721
    715722                LogFlowFunc(("Sending file header ...\n"));
    716723            }
    717         }
    718         else
    719         {
    720             /* File header was sent, so only send the actual file data. */
     724            else
     725            {
     726                /* File header was sent, so only send the actual file data. */
     727                fSendFileData = true;
     728            }
     729        }
     730        else /* Protocol v1. */
     731        {
     732            /* Always send the file data, every time. */
    721733            fSendFileData = true;
    722734        }
    723     }
    724     else /* Protocol v1. */
    725     {
    726         /* Always send the file data, every time. */
    727         fSendFileData = true;
    728735    }
    729736
     
    766773    if (mData.mProtocolVersion <= 1)
    767774    {
    768         pMsg->setNextUInt32(0);                                              /* context ID */
    769775        pMsg->setNextString(aFile.GetSourcePath().c_str());                  /* pvName */
    770776        pMsg->setNextUInt32((uint32_t)(aFile.GetSourcePath().length() + 1)); /* cbName */
     777    }
     778    else
     779    {
     780        /* Protocol version 2 also sends the context ID. Currently unused. */
     781        pMsg->setNextUInt32(0);                                              /* context ID */
    771782    }
    772783
     
    869880            AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_GET_NEXT_HOST_MSG_DATA == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
    870881
     882            LogFlowFunc(("pCBData->uMsg=%RU32, paParms=%p, cParms=%RU32\n", pCBData->uMsg, pCBData->paParms, pCBData->cParms));
     883
    871884            GuestDnDMsg *pMsg = pThis->nextMsg();
    872885            if (pMsg)
     
    884897                if (RT_SUCCESS(rc))
    885898                {
    886                     LogFlowFunc(("Sending uMsg=%RU32, cParms=%RU32 ...\n", uMsg, pCBData->cParms));
     899                    LogFlowFunc(("Returning uMsg=%RU32\n", uMsg));
    887900                    rc = HGCM::Message::copyParms(pMsg->getCount(), pMsg->getParms(), pCBData->paParms);
    888901                    if (RT_SUCCESS(rc))
     
    891904                        pThis->removeNext();
    892905                    }
     906                    else
     907                        LogFlowFunc(("Copying parameters failed with rc=%Rrc\n", rc));
    893908                }
    894909            }
     
    896911                rc = VERR_NO_DATA;
    897912
    898             LogFlowFunc(("Returning msg %RU32, rc=%Rrc\n", uMsg, rc));
     913            LogFlowFunc(("Processing next message ended with rc=%Rrc\n", rc));
    899914            break;
    900915        }
     
    9921007            break;
    9931008
     1009        pCtx->mURI.cbProcessed = 0;
     1010        pCtx->mURI.cProcessed  = 0;
     1011        pCtx->mURI.cbToProcess = lstURI.TotalBytes();
     1012
    9941013        /*
    9951014         * The first message always is the meta info for the data. The meta
     
    10441063#undef UNREGISTER_CALLBACK
    10451064
     1065    /* Destroy temporary scratch buffer. */
    10461066    if (pvBuf)
    10471067        RTMemFree(pvBuf);
     
    10551075int GuestDnDTarget::i_sendURIDataLoop(PSENDDATACTX pCtx, GuestDnDMsg *pMsg)
    10561076{
    1057     AssertPtrReturn(pCtx,  VERR_INVALID_POINTER);
     1077    AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
    10581078
    10591079    DnDURIList &lstURI = pCtx->mURI.lstURI;
     
    10611081    int rc;
    10621082
    1063     uint64_t cbTotal = pCtx->mURI.lstURI.TotalBytes();
     1083    uint64_t cbTotal = pCtx->mURI.cbToProcess;
    10641084    uint8_t uPercent = pCtx->mURI.cbProcessed * 100 / (cbTotal ? cbTotal : 1);
    1065     Assert(uPercent <= 100);
    10661085
    10671086    LogFlowFunc(("%RU64 / %RU64 -- %RU8%%\n", pCtx->mURI.cbProcessed, cbTotal, uPercent));
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