VirtualBox

Ignore:
Timestamp:
Jan 29, 2014 11:12:44 AM (11 years ago)
Author:
vboxsync
Message:

DnD: First working implementation for Windows guest->host support; still work in progress. As for now only pure text data can be dragged over.

File:
1 edited

Legend:

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

    r50179 r50265  
    229229        } while (RT_SUCCESS(rc));
    230230
     231        int rc2 = pThis->UnregisterAsDropTarget();
     232        if (RT_SUCCESS(rc))
     233            rc = rc2;
     234
    231235        OleUninitialize();
    232236    }
     
    405409                    reset();
    406410
    407                     Assert(mMode == Unknown);
    408411                    mMode = HG;
    409412
     
    464467
    465468                    rc = OnHgCancel();
    466 
    467                     reset();
    468469                    break;
    469470                }
     
    473474                    LogFlowThisFunc(("HOST_DND_GH_REQ_PENDING\n"));
    474475#ifdef VBOX_WITH_DRAG_AND_DROP_GH
    475                     Assert(   mMode == Unknown
    476                            || mMode == GH);
    477                     mMode = GH;
    478                     rc = OnGhIsDnDPending(pEvent->Event.uScreenId);
     476                    if (   mMode == Unknown
     477                        /* There can be more than one HOST_DND_GH_REQ_PENDING
     478                         * messages coming in. */
     479                        || mMode == GH)
     480                    {
     481                        mMode = GH;
     482                        rc = OnGhIsDnDPending(pEvent->Event.uScreenId);
     483                    }
     484                    else
     485                        rc = VERR_WRONG_ORDER;
    479486#else
    480487                    rc = VERR_NOT_SUPPORTED;
     
    487494                    LogFlowThisFunc(("HOST_DND_GH_EVT_DROPPED\n"));
    488495#ifdef VBOX_WITH_DRAG_AND_DROP_GH
    489                     Assert(mMode == GH);
    490                     rc = OnGhDropped(pEvent->Event.pszFormats,
    491                                      pEvent->Event.cbFormats,
    492                                      pEvent->Event.u.a.uDefAction);
    493                     mMode = Unknown;
     496                    if (mMode == GH)
     497                    {
     498                        rc = OnGhDropped(pEvent->Event.pszFormats,
     499                                         pEvent->Event.cbFormats,
     500                                         pEvent->Event.u.a.uDefAction);
     501                    }
     502                    else
     503                        rc = VERR_WRONG_ORDER;
    494504#else
    495505                    rc = VERR_NOT_SUPPORTED;
     
    585595        }
    586596        else
     597        {
    587598            rc = VINF_SUCCESS;
     599        }
    588600    }
    589601    catch (std::bad_alloc)
     
    598610int VBoxDnDWnd::UnregisterAsDropTarget(void)
    599611{
     612    LogFlowFuncEnter();
     613
    600614    if (!pDropTarget) /* No drop target? Bail out. */
    601615        return VINF_SUCCESS;
     
    606620                                  TRUE /* fLastUnlockReleases */);
    607621    if (SUCCEEDED(hr))
    608         pDropTarget->Release();
     622    {
     623        ULONG cRefs = pDropTarget->Release();
     624
     625        Assert(cRefs == 0);
     626        pDropTarget = NULL;
     627    }
    609628
    610629    int rc = SUCCEEDED(hr)
     
    652671     */
    653672    const RTCList<RTCString> lstAllowedMimeTypes = RTCList<RTCString>()
    654         /* Uri's */
     673        /* URI's */
    655674        << "text/uri-list"
    656675        /* Text */
     
    661680        << "TEXT"
    662681        << "STRING"
    663         /* OpenOffice formates */
     682        /* OpenOffice formats */
    664683        << "application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\""
    665684        << "application/x-openoffice-drawing;windows_formatname=\"Drawing Format\"";
     
    855874    if (RT_SUCCESS(rc))
    856875        rc = rc2;
     876
     877    reset();
    857878
    858879    return rc;
     
    959980    if (RT_SUCCESS(rc))
    960981    {
     982        AssertPtr(pDropTarget);
     983
    961984        uint32_t uDefAction = DND_IGNORE_ACTION;
    962985        RTCString strFormat = "unknown";
    963         if (   pDropTarget
    964             && pDropTarget->HasData())
     986        if (pDropTarget->HasData())
    965987        {
    966988            uDefAction = DND_COPY_ACTION;
     
    970992             *        with \r\n. */
    971993            strFormat = "text/plain;charset=utf-8";
    972         }
    973 
    974         LogFlowFunc(("Acknowledging pDropTarget=0x%p, uDefAction=0x%x, uAllActions=0x%x, strFormat=%s\n",
    975                      pDropTarget, uDefAction, uAllActions, strFormat.c_str()));
    976         rc = VbglR3DnDGHAcknowledgePending(mClientID,
    977                                            uDefAction, uAllActions, strFormat.c_str());
     994
     995            LogFlowFunc(("Acknowledging pDropTarget=0x%p, uDefAction=0x%x, uAllActions=0x%x, strFormat=%s\n",
     996                         pDropTarget, uDefAction, uAllActions, strFormat.c_str()));
     997            rc = VbglR3DnDGHAcknowledgePending(mClientID,
     998                                               uDefAction, uAllActions, strFormat.c_str());
     999        }
    9781000    }
    9791001
     
    9851007                            uint32_t uDefAction)
    9861008{
    987     LogFlowThisFunc(("mMode=%ld, mState=%ld, cbFormats=%RU32, uDefAction=0x%x\n",
    988                      mMode, mState, cbFormats, uDefAction));
     1009    LogFlowThisFunc(("mMode=%ld, mState=%ld, pDropTarget=0x%p, cbFormats=%RU32, uDefAction=0x%x\n",
     1010                     mMode, mState, pDropTarget, cbFormats, uDefAction));
    9891011    int rc;
    9901012    if (mState == Dragging)
    9911013    {
    9921014        AssertPtr(pDropTarget);
     1015        rc = pDropTarget->WaitForDrop(30 * 1000 /* Timeout */);
     1016        if (RT_SUCCESS(rc))
     1017        {
     1018            /** @todo Respect uDefAction. */
     1019            /** @todo Do data checking / conversion based on pszFormats. */
     1020
     1021            void *pvData = pDropTarget->DataMutableRaw();
     1022            AssertPtr(pvData);
     1023            uint32_t cbData = pDropTarget->DataSize();
     1024            Assert(cbData);
     1025
     1026            rc = VbglR3DnDGHSendData(mClientID, pvData, cbData);
     1027            LogFlowFunc(("Sent pvData=0x%p, cbData=%RU32, rc=%Rrc\n",
     1028                         pvData, cbData, rc));
     1029        }
     1030
     1031        reset();
    9931032    }
    9941033    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