VirtualBox

Changeset 59848 in vbox


Ignore:
Timestamp:
Feb 26, 2016 12:53:19 PM (9 years ago)
Author:
vboxsync
Message:

DnD/VbglR3: Added more code required for raw data processing, logging fixes.

File:
1 edited

Legend:

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

    r58404 r59848  
    55
    66/*
    7  * Copyright (C) 2011-2015 Oracle Corporation
     7 * Copyright (C) 2011-2016 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    640640                            }
    641641                            else
     642                            {
     643                                AssertMsgFailed(("ObjType=%RU32, Proto=%RU32\n", objFile.GetType(), pCtx->uProtocol));
    642644                                rc = VERR_WRONG_ORDER;
     645                            }
    643646
    644647                            RTStrFree(pszPathAbs);
     
    651654                        && uNextMsg == HOST_DND_HG_SND_FILE_DATA)
    652655                    {
    653                         bool fClose = false;
    654 
    655656                        uint32_t cbChunkWritten;
    656657                        rc = objFile.Write(pvChunk, cbChunkRead, &cbChunkWritten);
     
    661662                                         cbChunkRead, cbChunkWritten, cbFileWritten + cbChunkWritten, cbFileSize));
    662663
    663                             if (pCtx->uProtocol >= 2)
     664                            cbFileWritten += cbChunkWritten;
     665
     666                            if (fDoAccounting)
    664667                            {
    665                                 /* Data transfer complete? Close the file. */
    666                                 fClose = objFile.IsComplete();
    667                                 if (   fClose
    668                                     && fDoAccounting)
    669                                 {
    670                                     Assert(cToRecvObjs);
    671                                     cToRecvObjs--;
    672                                 }
    673 
    674                                 /* Only since protocol v2 we know the file size upfront. */
    675                                 Assert(cbFileWritten <= cbFileSize);
    676                             }
    677                             else
    678                                 fClose = true; /* Always close the file after each chunk. */
    679 
    680                             cbFileWritten += cbChunkWritten;
    681 
    682                             if (pCtx->uProtocol >= 3)
    683                             {
    684                                 Assert(cbToRecvBytes >= cbChunkRead);
     668                                Assert(cbChunkRead <= cbToRecvBytes);
    685669                                cbToRecvBytes -= cbChunkRead;
    686670                            }
    687671                        }
    688 
    689                         if (fClose)
     672                    }
     673
     674                    bool fClose = false;
     675                    if (pCtx->uProtocol >= 2)
     676                    {
     677                        /* Data transfer complete? Close the file. */
     678                        fClose = objFile.IsComplete();
     679                        if (   fClose
     680                            && fDoAccounting)
    690681                        {
    691                             LogFlowFunc(("Closing file\n"));
    692                             objFile.Close();
     682                            Assert(cToRecvObjs);
     683                            cToRecvObjs--;
    693684                        }
     685
     686                        /* Only since protocol v2 we know the file size upfront. */
     687                        Assert(cbFileWritten <= cbFileSize);
    694688                    }
     689                    else
     690                        fClose = true; /* Always close the file after each chunk. */
     691
     692                    if (fClose)
     693                    {
     694                        LogFlowFunc(("Closing file\n"));
     695                        objFile.Close();
     696                    }
     697
    695698                    break;
    696699                }
     
    741744    {
    742745        objFile.Close();
    743 
    744         int rc2 = pDroppedFiles->Rollback();
    745         AssertRC(rc2); /* Not fatal, don't report back to host. */
     746        pDroppedFiles->Rollback();
    746747    }
    747748    else
     
    12011202
    12021203        int rc2 = VbglR3DnDHGSendProgress(pCtx, DND_PROGRESS_ERROR, 100 /* Percent */, rc);
    1203         AssertRC(rc2);
     1204        if (RT_FAILURE(rc2))
     1205            LogFlowFunc(("Unable to send progress error %Rrc to host: %Rrc\n", rc, rc2));
    12041206    }
    12051207    else if (RT_SUCCESS(rc))
     
    14191421            Msg.hdr.cParms = 3;
    14201422
    1421              /** @todo Context ID not used yet. */
     1423            /** @todo Context ID not used yet. */
    14221424            Msg.u.v3.uContext.SetUInt32(0);
    14231425            Msg.u.v3.uProtocol.SetUInt32(pCtx->uProtocol);
     
    17111713
    17121714    if (!RTStrIsValidEncoding(pcszFormats))
    1713         return VERR_INVALID_PARAMETER;
     1715        return VERR_INVALID_UTF8_ENCODING;
    17141716
    17151717    VBOXDNDGHACKPENDINGMSG Msg;
     
    17861788            rc = Msg.hdr.result;
    17871789
    1788         LogFlowFunc(("cbTotal=%RU64, cbMeta=%RU64, cObjects=%RU64, rc=%Rrc\n",
     1790        LogFlowFunc(("cbTotal=%RU64, cbMeta=%RU32, cObjects=%RU64, rc=%Rrc\n",
    17891791                     pDataHdr->cbTotal, pDataHdr->cbMeta, pDataHdr->cObjects, rc));
    17901792    }
     
    18391841        }
    18401842
     1843        LogFlowFunc(("cbMaxChunk=%RU32, cbData=%RU64, cbSent=%RU32, rc=%Rrc\n",
     1844                     cbMaxChunk, cbData, cbSent, rc));
     1845
    18411846        if (RT_SUCCESS(rc))
    18421847            Assert(cbSent == cbData);
    18431848    }
    18441849
    1845     LogFlowFunc(("Returning rc=%Rrc, cbData=%RU64\n", rc, cbData));
     1850    LogFlowFuncLeaveRC(rc);
    18461851    return rc;
    18471852}
     
    20732078}
    20742079
    2075 static int vbglR3DnDGHSendURIData(PVBGLR3GUESTDNDCMDCTX pCtx,
    2076                                   const void *pvData, uint32_t cbData)
     2080static int vbglR3DnDGHSendRawData(PVBGLR3GUESTDNDCMDCTX pCtx, void *pvData, size_t cbData)
     2081{
     2082    AssertPtrReturn(pCtx,   VERR_INVALID_POINTER);
     2083    AssertPtrReturn(pvData, VERR_INVALID_POINTER);
     2084    /* cbData can be 0. */
     2085
     2086    VBOXDNDDATAHDR dataHdr;
     2087    RT_ZERO(dataHdr);
     2088
     2089    /* For raw data only the total size is required to be specified. */
     2090    dataHdr.cbTotal = cbData;
     2091
     2092    return vbglR3DnDGHSendDataInternal(pCtx, pvData, cbData, &dataHdr);
     2093}
     2094
     2095static int vbglR3DnDGHSendURIData(PVBGLR3GUESTDNDCMDCTX pCtx, const void *pvData, size_t cbData)
    20772096{
    20782097    AssertPtrReturn(pCtx,   VERR_INVALID_POINTER);
     
    21092128            const uint32_t cbMetaFmt   = (uint32_t)strlen(szMetaFmt) + 1; /* Include termination. */
    21102129
    2111             VBOXDNDDATAHDR dataHeader;
    2112             dataHeader.uFlags    = 0; /* Flags not used yet. */
    2113             dataHeader.cbTotal   = cbTotal;
    2114             dataHeader.cbMeta    = cbURLIist;
    2115             dataHeader.pvMetaFmt = (void *)szMetaFmt;
    2116             dataHeader.cbMetaFmt = cbMetaFmt;
    2117             dataHeader.cObjects  = lstURI.TotalCount();
     2130            VBOXDNDDATAHDR dataHdr;
     2131            dataHdr.uFlags    = 0; /* Flags not used yet. */
     2132            dataHdr.cbTotal   = cbTotal;
     2133            dataHdr.cbMeta    = cbURLIist;
     2134            dataHdr.pvMetaFmt = (void *)szMetaFmt;
     2135            dataHdr.cbMetaFmt = cbMetaFmt;
     2136            dataHdr.cObjects  = lstURI.TotalCount();
    21182137
    21192138            rc = vbglR3DnDGHSendDataInternal(pCtx,
    2120                                              pvURIList, cbURLIist, &dataHeader);
     2139                                             pvURIList, cbURLIist, &dataHdr);
    21212140        }
    21222141        else
     
    21532172    if (DnDMIMEHasFileURLs(pszFormat, strlen(pszFormat)))
    21542173    {
     2174        /* Send file data. */
    21552175        rc = vbglR3DnDGHSendURIData(pCtx, pvData, cbData);
    21562176    }
    2157     else /* Send raw data. */
    2158     {
    2159         rc = vbglR3DnDGHSendDataInternal(pCtx, pvData, cbData, NULL /* pDataHdr */);
    2160     }
     2177    else
     2178        rc = vbglR3DnDGHSendRawData(pCtx, pvData, cbData);
    21612179
    21622180    if (RT_FAILURE(rc))
     
    21972215    int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
    21982216    if (RT_SUCCESS(rc))
    2199         rc = Msg.hdr.result;
    2200 
    2201     if (RT_FAILURE(rc))
    2202         LogFlowFunc(("Sending error %Rrc failed with rc=%Rrc\n", rcErr, rc));
     2217    {
     2218        if (RT_FAILURE(Msg.hdr.result))
     2219        {
     2220            LogFlowFunc(("Sending error %Rrc failed with rc=%Rrc\n", rcErr, Msg.hdr.result));
     2221
     2222            /* Never return an error if the host did not accept the error at
     2223             * the current time. This can be due to the host not having any appropriate
     2224             * callbacks set which would handle that error. */
     2225            rc = VINF_SUCCESS;
     2226        }
     2227    }
     2228
    22032229    return rc;
    22042230}
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