VirtualBox

Changeset 50734 in vbox


Ignore:
Timestamp:
Mar 10, 2014 1:54:03 PM (11 years ago)
Author:
vboxsync
Message:

DnD: Bugfixes.

Location:
trunk/src/VBox
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDnDDropTarget.cpp

    r50732 r50734  
    464464                                RTCString strRoot = lstURI.RootToString();
    465465                                size_t cbRoot = strRoot.length() + 1; /* Include termination */
    466                                 Assert(cbRoot);
    467466
    468467                                mpvData = RTMemAlloc(cbRoot);
  • trunk/src/VBox/Additions/x11/VBoxClient/draganddrop.cpp

    r50724 r50734  
    4545 * their behavior. Don't have this enabled in release builds! */
    4646#ifdef DEBUG
    47 # define VBOX_DND_DEBUG_WND
     47//# define VBOX_DND_DEBUG_WND
    4848#endif
    4949
     
    7676 * the data in the specified mime-type. This data is send back to the host.
    7777 * After that we send a XdndLeave event to the source window.
    78  * Todo:
    79  * - this isn't finished, yet. Currently the mouse isn't correctly released
    80  *   in the guest (both, when the drop was successfully or canceled).
    81  * - cancel (e.g. with the ESC key) doesn't work
     78 *
     79 * To-do:
     80 * - Cancelling (e.g. with ESC key) doesn't work.
    8281 *
    83  * Todo:
    84  * - XdndProxy window support
    85  * - INCR support
    86  * - make this much more robust for crashes of the other party
    87  * - really check for the Xdnd version and the supported features
     82 * To-do:
     83 * - INCR (incremental transfers) support.
     84 * - Make this much more robust for crashes of the other party.
     85 * - Really check for the Xdnd version and the supported features.
    8886 */
    8987
     
    390388    void mouseButtonSet(Window wndDest, int rx, int ry, int iButton, bool fPress) const;
    391389    int proxyWinShow(int *piRootX = NULL, int *piRootY = NULL, bool fMouseMove = false) const;
    392     int proxyWinHide(void) const;
     390    int proxyWinHide(void);
    393391    void registerForEvents(Window w) const;
    394392
     
    569567    m_curVer = -1;
    570568    m_state  = Initialized;
     569    m_eventQueue.clear();
    571570}
    572571
     
    740739        case GH:
    741740        {
    742             //if (m_state == Dropped)
    743             //{
    744                 LogFlowThisFunc(("Enqueuing ClientMessage\n"));
    745 
    746                 m_eventQueue.append(e);
    747                 rc = RTSemEventSignal(m_hEventSem);
    748             //}
    749 
    750             //rc = VINF_SUCCESS;
     741            LogFlowThisFunc(("Enqueuing ClientMessage\n"));
     742
     743            m_eventQueue.append(e);
     744            rc = RTSemEventSignal(m_hEventSem);
    751745            break;
    752746        }
     
    885879                    memcpy(&m_eventHgSelection, &e, sizeof(XEvent));
    886880
    887                     const char *pcszFormat = xAtomToString(e.xselectionrequest.target).c_str();
    888                     AssertPtr(pcszFormat);
    889                     rc = VbglR3DnDHGRequestData(m_uClientID, pcszFormat);
     881                    RTCString strFormat = xAtomToString(e.xselectionrequest.target);
     882                    Assert(strFormat.isNotEmpty());
     883                    rc = VbglR3DnDHGRequestData(m_uClientID, strFormat.c_str());
    890884                    LogFlowThisFunc(("Requesting data from host as \"%s\", rc=%Rrc\n",
    891                                      pcszFormat, rc));
     885                                     strFormat.c_str(), rc));
    892886                }
    893887            }
     
    936930    switch (e.type)
    937931    {
     932        case ButtonPress:
     933            LogFlowThisFunc(("ButtonPress\n"));
     934            rc = VINF_SUCCESS;
     935            break;
     936
     937        case ButtonRelease:
     938            LogFlowThisFunc(("ButtonRelease\n"));
     939            rc = VINF_SUCCESS;
     940            break;
     941
     942        case ClientMessage:   
     943            rc = onX11ClientMessage(e);
     944            break;
     945
     946        case SelectionClear:
     947           LogFlowThisFunc(("SelectionClear\n"));
     948           reset();
     949           rc = VINF_SUCCESS;
     950           break;
     951
    938952        case SelectionNotify:
    939953            rc = onX11SelectionNotify(e);
     
    943957            rc = onX11SelectionRequest(e);
    944958            break;
    945 
    946         case ClientMessage:   
    947             rc = onX11ClientMessage(e);
    948             break;
    949 
    950         case SelectionClear:
    951            LogFlowThisFunc(("SelectionClear\n"));
    952            rc = VINF_SUCCESS;
    953            break;
    954959
    955960        /*case MotionNotify:
     
    11351140                                 0, 2, False, AnyPropertyType,
    11361141                                 &atmp, &fmt, &cItems, &cbRemaining, &pcData);
     1142
    11371143        if (RT_UNLIKELY(xrc != Success))
    11381144            LogFlowThisFunc(("Error in getting the window property: %s\n", gX11->xErrorToString(xrc).c_str()));
     
    11461152                LogFlowThisFunc(("wndCursor=%#x, XdndAware=%u\n", newVer));
    11471153            }
     1154
    11481155            XFree(pcData);
    11491156        }
     
    11531160     * Is the window under the cursor another one than our current one?
    11541161     */
    1155     if (wndCursor != m_wndCur && m_curVer != -1)
     1162    if (   wndCursor != m_wndCur
     1163        && m_curVer != -1)
    11561164    {
    11571165        LogFlowThisFunc(("Leaving window=%#x\n", m_wndCur));
     
    12121220         */
    12131221        Atom pa = toX11Action(uAction);
    1214         LogFlowThisFunc(("strAction='%s' ", xAtomToString(pa).c_str()));
     1222        LogFlowThisFunc(("strAction=%s\n", xAtomToString(pa).c_str()));
    12151223
    12161224        XClientMessageEvent m;
     
    12311239    }
    12321240
    1233     if (wndCursor == None && newVer == -1)
     1241    if (   wndCursor == None
     1242        && newVer    == -1)
    12341243    {
    12351244        /* No window to process, so send a ignore ack event to the host. */
     
    13561365            AssertPtr(pEventClient);
    13571366
    1358             LogFlowThisFunc(("Next X event is: %s\n",
     1367            LogFlowThisFunc(("Received event=%s\n",
    13591368                             gX11->xAtomToString(pEventClient->message_type).c_str()));
    13601369
     
    13701379                m_state = Dragging;
    13711380                m_wndCur = wndSelection;
     1381                Assert(m_wndCur == pEventClient->data.l[0]);
    13721382
    13731383                LogFlowThisFunc(("XA_XdndEnter\n"));
     
    14381448                XClientMessageEvent m;
    14391449                RT_ZERO(m);
    1440 
    14411450                m.type         = ClientMessage;
    14421451                m.display      = m_pDisplay;
    1443                 m.window       = pEventClient->data.l[0];
     1452                m.window       = m_wndCur;
    14441453                m.message_type = xAtom(XA_XdndStatus);
    14451454                m.format       = 32;
    14461455                m.data.l[0]    = m_wndProxy;
    1447                 m.data.l[1]    = 1;
    1448                 m.data.l[4]    = xAtom(XA_XdndActionCopy);
    1449 
    1450                 xRc = XSendEvent(m_pDisplay, pEventClient->data.l[0],
     1456                m.data.l[1]    = RT_BIT(0); /* Accept the drop. */
     1457                m.data.l[4]    = xAtom(XA_XdndActionCopy); /** @todo Make the accepted action configurable. */
     1458
     1459                xRc = XSendEvent(m_pDisplay, m_wndCur,
    14511460                                 False, 0, reinterpret_cast<XEvent*>(&m));
    14521461                if (RT_UNLIKELY(xRc == 0))
     
    14641473                m.type         = ClientMessage;
    14651474                m.display      = m_pDisplay;
    1466                 m.window       = pEventClient->data.l[0];
     1475                m.window       = m_wndCur;
    14671476                m.message_type = xAtom(XA_XdndStatus);
    14681477                m.format       = 32;
    14691478                m.data.l[0]    = m_wndProxy;
    1470                 m.data.l[1]    = 1;
    1471                 m.data.l[4]    = pEventClient->data.l[4];
    1472 
    1473                 xRc = XSendEvent(m_pDisplay, pEventClient->data.l[0],
     1479                m.data.l[1]    = RT_BIT(0); /* Accept the drop. */
     1480                m.data.l[4]    = xAtom(XA_XdndActionCopy); /** @todo Make the accepted action configurable. */
     1481
     1482                xRc = XSendEvent(m_pDisplay, m_wndCur,
    14741483                                 False, 0, reinterpret_cast<XEvent*>(&m));
    14751484                if (RT_UNLIKELY(xRc == 0))
     
    14821491        }
    14831492
    1484         proxyWinHide();
    1485 
    14861493        /* Do we need to acknowledge at least one format to the host? */
    14871494        if (!m_formats.isEmpty())
     
    15271534    /* We send a fake release event to the current window, cause
    15281535     * this should have the grab. */
    1529     mouseButtonSet(m_wndCur, iRootX, iRootY,
     1536    mouseButtonSet(m_wndCur /* Source window */, iRootX, iRootY,
    15301537                   1 /* Button */, false /* Release button */);
    15311538
     
    15421549        /* Request to convert the selection in the specific format and
    15431550         * place it to our proxy window as property. */
    1544         Window srcWin = m_wndCur;//clme->data.l[0];
     1551        Window wndSource = evDnDDrop.data.l[0]; /* Source window which sent the message. */
     1552        Assert(wndSource == m_wndCur);
    15451553        Atom aFormat  = gX11->stringToxAtom(strFormat.c_str());
    15461554
     
    15541562        if (waitForX11Msg(evSelNotify, SelectionNotify))
    15551563        {
     1564            bool fCancel = false;
     1565
    15561566            /* Make some paranoid checks. */
    15571567            if (   evSelNotify.xselection.type      == SelectionNotify
     
    16161626                                     strFormat.c_str(), rc));
    16171627
    1618                     /* Confirm the result of the transfer to the source window. */
    1619                     XClientMessageEvent m;
    1620                     RT_ZERO(m);
    1621                     m.type         = ClientMessage;
    1622                     m.display      = m_pDisplay;
    1623                     m.window       = srcWin;
    1624                     m.message_type = xAtom(XA_XdndFinished);
    1625                     m.format       = 32;
    1626                     m.data.l[0]    = m_wndProxy;
    1627                     m.data.l[1]    = RT_SUCCESS(rc) ? 1 : 0;                       /* Confirm or deny success */
    1628                     m.data.l[2]    = RT_SUCCESS(rc) ? toX11Action(uAction) : None; /* Action used on success */
    1629 
    1630                     int xrc = XSendEvent(m_pDisplay, srcWin, True, NoEventMask, reinterpret_cast<XEvent*>(&m));
    1631                     if (RT_UNLIKELY(xrc == 0))
    1632                         LogFlowThisFunc(("Error sending xEvent\n"));
     1628                    if (RT_SUCCESS(rc))
     1629                    {
     1630                        /* Confirm the result of the transfer to the source window. */
     1631                        XClientMessageEvent m;
     1632                        RT_ZERO(m);
     1633                        m.type         = ClientMessage;
     1634                        m.display      = m_pDisplay;
     1635                        m.window       = m_wndProxy;
     1636                        m.message_type = xAtom(XA_XdndFinished);
     1637                        m.format       = 32;
     1638                        m.data.l[0]    = m_wndProxy; /* Target window. */
     1639                        m.data.l[1]    = 0; /* Don't accept the drop to not make the guest stuck. */
     1640                        m.data.l[2]    = RT_SUCCESS(rc) ? toX11Action(uAction) : None; /* Action used on success */
     1641
     1642                        int xrc = XSendEvent(m_pDisplay, wndSource, True, NoEventMask, reinterpret_cast<XEvent*>(&m));
     1643                        if (RT_UNLIKELY(xrc == 0))
     1644                            LogFlowThisFunc(("Error sending xEvent\n"));
     1645                    }
     1646                    else
     1647                        fCancel = true;
    16331648                }
    16341649                else
     
    16421657                    else
    16431658                    {
    1644                         AssertMsgFailed(("Not supported data type\n"));
     1659                        AssertMsgFailed(("Not supported data type (%s)\n",
     1660                                         gX11->xAtomToString(aPropType).c_str()));
    16451661                        rc = VERR_INVALID_PARAMETER;
    16461662                    }
     1663
     1664                    fCancel = true;
     1665                }
     1666
     1667                if (fCancel)
     1668                {
     1669                    LogFlowFunc(("Cancelling drop ...\n"));
    16471670
    16481671                    /* Cancel this. */
     
    16511674                    m.type         = ClientMessage;
    16521675                    m.display      = m_pDisplay;
    1653                     m.window       = srcWin;
     1676                    m.window       = m_wndProxy;
    16541677                    m.message_type = xAtom(XA_XdndFinished);
    16551678                    m.format       = 32;
    1656                     m.data.l[0]    = m_wndProxy;
    1657                     m.data.l[1]    = 0;
    1658                     m.data.l[2]    = None;
    1659 
    1660                     int xrc = XSendEvent(m_pDisplay, srcWin, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
     1679                    m.data.l[0]    = m_wndProxy; /* Target window. */
     1680                    m.data.l[1]    = 0; /* Don't accept the drop to not make the guest stuck. */
     1681
     1682                    int xrc = XSendEvent(m_pDisplay, wndSource, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
    16611683                    if (RT_UNLIKELY(xrc == 0))
    1662                         LogFlowThisFunc(("Error sending xEvent\n"));
    1663                     m_wndCur = 0;
     1684                        LogFlowThisFunc(("Error sending cancel event\n"));
    16641685                }
    16651686
     
    18481869}
    18491870
    1850 int DragInstance::proxyWinHide(void) const
    1851 {
    1852     LogFlowThisFuncEnter();
    1853     return 0;
     1871int DragInstance::proxyWinHide(void)
     1872{
     1873    LogFlowFuncEnter();
    18541874
    18551875    XUnmapWindow(m_pDisplay, m_wndProxy);
     1876    m_eventQueue.clear();
    18561877
    18571878    return VINF_SUCCESS; /** @todo Add error checking. */
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDMIMEData.cpp

    r50640 r50734  
    185185
    186186#ifndef RT_OS_WINDOWS
    187 bool UIDnDMimeData::eventFilter(QObject * /* pObject */, QEvent *pEvent)
     187bool UIDnDMimeData::eventFilter(QObject *pObject, QEvent *pEvent)
    188188{
    189189    if (pEvent)
     
    198198                LogFlowFunc(("MouseMove: x=%d, y=%d\n",
    199199                             pMouseEvent->globalX(), pMouseEvent->globalY()));
    200                 break;
     200               
     201                return true;
     202                /* Never reached. */
    201203            }
    202204#endif
     
    205207                LogFlowFunc(("MouseButtonRelease\n"));
    206208                m_enmState = Dropped;
    207                 break;
     209               
     210                return true;
     211                /* Never reached. */
    208212            }
    209213
     
    216220                    m_enmState = Canceled;
    217221                }
    218                 break;
     222               
     223                return true;
     224                /* Never reached. */
    219225            }
    220226
     
    224230    }
    225231
    226     /* Propagate the event further. */
    227     return false;
     232    return QObject::eventFilter(pObject, pEvent);
    228233}
    229234
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDMIMEData.h

    r50602 r50734  
    8181
    8282#ifndef RT_OS_WINDOWS
    83     bool eventFilter(QObject * /* pObject */, QEvent *pEvent);
     83    bool eventFilter(QObject *pObject, QEvent *pEvent);
    8484#endif
    8585    /** @}  */
  • trunk/src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp

    r50724 r50734  
    410410    AssertPtrReturn(pszURI, VERR_INVALID_POINTER);
    411411
     412    /** @todo Check for string termination?  */
    412413#ifdef DEBUG_andy
    413414    LogFlowFunc(("pszPath=%s, fFlags=0x%x\n", pszURI, fFlags));
     
    422423        /* Add the path to our internal file list (recursive in
    423424         * the case of a directory). */
    424         char *pszFileName = RTPathFilename(pszFilePath);
    425         if (pszFileName)
    426         {
    427             Assert(pszFileName >= pszFilePath);
    428             char *pszRoot = &pszFilePath[pszFileName - pszFilePath];
    429             m_lstRoot.append(pszRoot);
    430 #ifdef DEBUG_andy
    431             LogFlowFunc(("pszFilePath=%s, pszFileName=%s, pszRoot=%s\n",
    432                          pszFilePath, pszFileName, pszRoot));
    433 #endif
    434             rc = appendPathRecursive(pszFilePath,
    435                                      pszFileName - pszFilePath,
    436                                      fFlags);
     425        size_t cbPathLen = RTPathStripTrailingSlash(pszFilePath);
     426        if (cbPathLen)
     427        {
     428            char *pszFileName = RTPathFilename(pszFilePath);
     429            if (pszFileName)
     430            {
     431                Assert(pszFileName >= pszFilePath);
     432                char *pszRoot = &pszFilePath[pszFileName - pszFilePath];
     433                m_lstRoot.append(pszRoot);
     434#ifdef DEBUG_andy
     435                LogFlowFunc(("pszFilePath=%s, pszFileName=%s, pszRoot=%s\n",
     436                             pszFilePath, pszFileName, pszRoot));
     437#endif
     438                rc = appendPathRecursive(pszFilePath,
     439                                         pszFileName - pszFilePath,
     440                                         fFlags);
     441            }
     442            else
     443                rc = VERR_NOT_FOUND;
    437444        }
    438445        else
    439             rc = VERR_NOT_FOUND;
     446            rc = VERR_INVALID_PARAMETER;
    440447
    441448        RTStrFree(pszFilePath);
  • trunk/src/VBox/Main/src-client/GuestDnDImpl.cpp

    r50724 r50734  
    204204    HRESULT queryProgressTo(IProgress **ppProgress);
    205205
     206    int writeToFile(const char *pszPath, size_t cbPath, void *pvData, size_t cbData, uint32_t fMode);
     207
    206208public:
    207209
     
    223225    /** Dropped files directory on the host. */
    224226    Utf8Str              m_strDropDir;
     227    /** The handle of the currently opened file being written to
     228     *  or read from. */
     229    RTFILE               m_hFile;
     230    Utf8Str              m_strFile;
    225231
    226232    ComObjPtr<Guest>     m_parent;
     
    294300  , m_cbDataCurrent(0)
    295301  , m_cbDataTotal(0)
     302  , m_hFile(NIL_RTFILE)
    296303  , m_parent(pGuest)
    297304{
     
    303310{
    304311    reset();
     312
    305313    int rc = RTSemEventDestroy(m_EventSem);
    306314    AssertRC(rc);
     
    346354            break;
    347355
     356        case VERR_NOT_FOUND:
     357            /* Should not happen due to file locking on the guest, but anyway ... */
     358            strError += Utf8StrFmt(pGuest->tr("One or more guest files or directories selected for transferring to the host were not"
     359                                              "found on the guest anymore. This can be the case if the guest files were moved and/or"
     360                                              "altered while the drag'n drop operation was in progress."));
     361            break;
     362
    348363        case VERR_SHARING_VIOLATION:
    349364            strError += Utf8StrFmt(pGuest->tr("One or more guest files or directories selected for transferring to the host were locked. "
     
    367382void DnDGuestResponse::reset(void)
    368383{
     384    LogFlowThisFuncEnter();
     385
     386    m_defAction = 0;
     387    m_allActions = 0;
     388
    369389    m_strDropDir = "";
    370390    m_strFormat = "";
     
    375395        m_pvData = NULL;
    376396    }
    377     m_cbData = 0;
    378 
     397    m_cbData = 0;   
    379398    m_cbDataCurrent = 0;
    380399    m_cbDataTotal = 0;
     400
     401    if (m_hFile != NIL_RTFILE)
     402    {
     403        RTFileClose(m_hFile);
     404        m_hFile = NIL_RTFILE;
     405    }
     406    m_strFile = "";
    381407}
    382408
     
    492518}
    493519
     520int DnDGuestResponse::writeToFile(const char *pszPath, size_t cbPath,
     521                                  void *pvData, size_t cbData, uint32_t fMode)
     522{
     523    /** @todo Support locking more than one file at a time! We
     524     *        might want to have a table in DnDGuestImpl which
     525     *        keeps those file pointers around, or extend the
     526     *        actual protocol for explicit open calls.
     527     * 
     528     *        For now we only keep one file open at a time, so if
     529     *        a client does alternating writes to different files
     530     *        this function will close the old and re-open the new
     531     *        file on every call. */
     532    int rc;
     533    if (   m_hFile == NIL_RTFILE
     534        || m_strFile != pszPath)
     535    {
     536        char *pszFile = RTPathJoinA(m_strDropDir.c_str(), pszPath);
     537        if (pszFile)
     538        {
     539            RTFILE hFile;
     540            /** @todo Respect fMode!  */
     541            rc = RTFileOpen(&hFile, pszFile,
     542                              RTFILE_O_OPEN_CREATE | RTFILE_O_DENY_WRITE
     543                            | RTFILE_O_WRITE | RTFILE_O_APPEND);
     544            if (RT_SUCCESS(rc))
     545            {
     546                LogFlowFunc(("Opening \"%s\" (fMode=0x%x) for writing ...\n",
     547                             pszFile, fMode));
     548
     549                m_hFile = hFile;
     550                m_strFile = pszPath;
     551            }
     552
     553            RTStrFree(pszFile);
     554        }
     555        else
     556            rc = VERR_NO_MEMORY;
     557    }
     558    else
     559        rc = VINF_SUCCESS;
     560
     561    if (RT_SUCCESS(rc))
     562    {
     563        rc = RTFileWrite(m_hFile, pvData, cbData,
     564                         NULL /* No partial writes */);
     565
     566        if (RT_SUCCESS(rc))
     567            rc = dataSetStatus(cbData);
     568    }
     569
     570    return rc;
     571}
     572
    494573///////////////////////////////////////////////////////////////////////////////
    495574
     
    719798
    720799        DnDGuestResponse *pResp = d->response();
    721         /* This blocks until the request is answered (or timeout). */
    722800        if (pResp->waitForGuestResponse() == VERR_TIMEOUT)
    723801            return S_OK;
     
    783861
    784862        DnDGuestResponse *pResp = d->response();
    785         /* This blocks until the request is answered (or timeout). */
    786863        if (pResp->waitForGuestResponse() == VERR_TIMEOUT)
    787864            return S_OK;
     
    813890
    814891        DnDGuestResponse *pResp = d->response();
    815         /* This blocks until the request is answered (or timeout). */
    816892        pResp->waitForGuestResponse();
    817893    }
     
    873949
    874950        DnDGuestResponse *pResp = d->response();
    875         /* This blocks until the request is answered (or timeout). */
    876951        if (pResp->waitForGuestResponse() == VERR_TIMEOUT)
    877952            return S_OK;
    878953
    879         /* Copy the response info */
     954        /* Get the resulting action from the guest. */
    880955        *pResultAction = d->toMainAction(pResp->defAction());
     956
     957        LogFlowFunc(("resFormat=%s, resAction=%RU32\n",
     958                     pResp->format().c_str(), pResp->defAction()));
     959
    881960        Bstr(pResp->format()).cloneTo(pstrFormat);
    882 
    883         LogFlowFunc(("*pResultAction=%ld\n", *pResultAction));
    884961    }
    885962    catch (HRESULT hr2)
     
    9571034                    paParms);
    9581035
    959         /* This blocks until the request is answered (or timed out). */
    9601036        DnDGuestResponse *pResp = d->response();
    9611037        if (pResp->waitForGuestResponse() == VERR_TIMEOUT)
     
    11671243                 pszPath, cbPath, fMode));
    11681244
    1169     /** @todo Add file locking between calls! */
    1170     int rc;
    1171     char *pszFile = RTPathJoinA(pResp->dropDir().c_str(), pszPath);
    1172     if (pszFile)
    1173     {
    1174         RTFILE hFile;
    1175         rc = RTFileOpen(&hFile, pszFile,
    1176                         RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_WRITE | RTFILE_O_WRITE);
    1177         if (RT_SUCCESS(rc))
    1178         {
    1179             rc = RTFileWrite(hFile, pvData, cbData,
    1180                              NULL /* No partial writes */);
    1181             RTFileClose(hFile);
    1182         }
    1183         RTStrFree(pszFile);
    1184     }
    1185     else
    1186         rc = VERR_NO_MEMORY;
    1187 
    1188     if (RT_SUCCESS(rc))
    1189         rc = pResp->dataSetStatus(cbData);
     1245    int rc = pResp->writeToFile(pszPath, cbPath, pvData, cbData, fMode);
    11901246
    11911247    LogFlowFuncLeaveRC(rc);
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