VirtualBox

Ignore:
Timestamp:
Feb 26, 2016 10:58:05 AM (9 years ago)
Author:
vboxsync
Message:

DnD/VBoxTray: VBoxDnD.cpp: Fixes for cancellation and error handling.

File:
1 edited

Legend:

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

    r58307 r59844  
    55
    66/*
    7  * Copyright (C) 2013-2015 Oracle Corporation
     7 * Copyright (C) 2013-2016 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    799799         */
    800800        size_t cFormatsSup    = this->lstFmtSup.size();
    801         size_t cFormatsActive = 0;
     801        ULONG cFormatsActive = 0;
    802802
    803803        LPFORMATETC pFormatEtc = new FORMATETC[cFormatsSup];
     
    12201220        uAllActions = uDefAction;
    12211221
    1222         rc = VbglR3DnDGHSendAckPending(&mDnDCtx,
    1223                                        uDefAction, uAllActions,
    1224                                        strFormats.c_str(), strFormats.length() + 1 /* Include termination */);
    1225         if (RT_FAILURE(rc))
     1222        int rc2 = VbglR3DnDGHSendAckPending(&mDnDCtx,
     1223                                            uDefAction, uAllActions,
     1224                                            strFormats.c_str(), strFormats.length() + 1 /* Include termination */);
     1225        if (RT_FAILURE(rc2))
    12261226        {
    12271227            char szMsg[256]; /* Sizes according to MSDN. */
     
    12331233                                              "Please enable Guest to Host or Bidirectional drag and drop mode "
    12341234                                              "or re-install the VirtualBox Guest Additions.");
    1235             switch (rc)
     1235            switch (rc2)
    12361236            {
    12371237                case VERR_ACCESS_DENIED:
     1238                {
    12381239                    rc = hlpShowBalloonTip(g_hInstance, g_hwndToolWindow, ID_TRAYICON,
    12391240                                           szMsg, szTitle,
     
    12411242                    AssertRC(rc);
    12421243                    break;
     1244                }
    12431245
    12441246                default:
    12451247                    break;
    12461248            }
     1249
     1250            LogRel2(("DnD: Host refuses drag and drop operation from guest: %Rrc\n", rc2));
     1251            reset();
    12471252        }
    12481253    }
     
    12691274{
    12701275    AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
    1271     AssertReturn(cbFormat, VERR_INVALID_PARAMETER);
     1276    AssertReturn(cbFormat,     VERR_INVALID_PARAMETER);
    12721277
    12731278    LogFlowThisFunc(("mMode=%ld, mState=%ld, pDropTarget=0x%p, pszFormat=%s, uDefAction=0x%x\n",
     
    12791284        {
    12801285            AssertPtr(pDropTarget);
    1281             rc = pDropTarget->WaitForDrop(30 * 1000 /* Timeout in ms */);
     1286            rc = pDropTarget->WaitForDrop(5 * 1000 /* 5s timeout */);
    12821287
    12831288            reset();
     
    12931298        {
    12941299            /** @todo Respect uDefAction. */
    1295             void *pvData = pDropTarget->DataMutableRaw();
    1296             AssertPtr(pvData);
     1300            void *pvData    = pDropTarget->DataMutableRaw();
    12971301            uint32_t cbData = pDropTarget->DataSize();
    1298             Assert(cbData);
    1299 
    1300             rc = VbglR3DnDGHSendData(&mDnDCtx, pszFormat, pvData, cbData);
    1301             LogFlowFunc(("Sent pvData=0x%p, cbData=%RU32, rc=%Rrc\n", pvData, cbData, rc));
     1302
     1303            if (   pvData
     1304                && cbData)
     1305            {
     1306                rc = VbglR3DnDGHSendData(&mDnDCtx, pszFormat, pvData, cbData);
     1307                LogFlowFunc(("Sent pvData=0x%p, cbData=%RU32, rc=%Rrc\n", pvData, cbData, rc));
     1308            }
     1309            else
     1310                rc = VERR_NO_DATA;
    13021311        }
    13031312    }
    13041313    else
    13051314        rc = VERR_WRONG_ORDER;
     1315
     1316    if (RT_FAILURE(rc))
     1317    {
     1318        /*
     1319         * If an error occurred or the guest is in a wrong DnD mode,
     1320         * send an error to the host in any case so that the host does
     1321         * not wait for the data it expects from the guest.
     1322         */
     1323        int rc2 = VbglR3DnDGHSendError(&mDnDCtx, rc);
     1324        AssertRC(rc2);
     1325    }
    13061326
    13071327    LogFlowFuncLeaveRC(rc);
     
    14991519int VBoxDnDWnd::mouseRelease(void)
    15001520{
    1501 #ifdef DEBUG_andy
    1502     LogFlowFunc(("\n"));
    1503 #endif
     1521    LogFlowFuncEnter();
     1522
    15041523    int rc;
    15051524
     
    17861805            }
    17871806            else
    1788                 LogFlowFunc(("Processing event failed with rc=%Rrc\n", rc));
     1807                LogRel(("DnD: Processing proxy window event %RU32 on screen %RU32 failed with %Rrc\n",
     1808                        pEvent->Event.uType, pEvent->Event.uScreenId, rc));
    17891809        }
    17901810        else if (rc == VERR_INTERRUPTED) /* Disconnected from service. */
    17911811        {
    1792             LogFlowFunc(("Posting quit message ...\n"));
     1812            LogRel(("DnD: Received quit message, shutting down ...\n"));
    17931813            pWnd->PostMessage(WM_QUIT, 0 /* wParm */, 0 /* lParm */);
    17941814            rc = VINF_SUCCESS;
    17951815        }
    1796         else
     1816
     1817        if (RT_FAILURE(rc))
    17971818        {
    17981819            LogFlowFunc(("Processing next message failed with rc=%Rrc\n", rc));
     
    18091830            }
    18101831
     1832            /* Make sure our proxy window is hidden when an error occured to
     1833             * not block the guest's UI. */
     1834            pWnd->hide();
     1835
    18111836            int rc2 = VbglR3DnDGHSendError(&pCtx->cmdCtx, rc);
    1812             AssertRC(rc2);
     1837            if (RT_FAILURE(rc2))
     1838            {
     1839                /* Ignore the following errors reported back from the host. */
     1840                if (   rc2 != VERR_NOT_SUPPORTED
     1841                    && rc2 != VERR_NOT_IMPLEMENTED)
     1842                {
     1843                    LogRel(("DnD: Could not report error %Rrc back to host: %Rrc\n", rc, rc2));
     1844                }
     1845            }
    18131846        }
    18141847
     
    18261859    }
    18271860
    1828     LogFlowFunc(("Shutting down ...\n"));
    1829 
    18301861    VbglR3DnDDisconnect(&pCtx->cmdCtx);
     1862
     1863    LogRel(("DnD: Ended\n"));
    18311864
    18321865    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