VirtualBox

Ignore:
Timestamp:
Feb 24, 2014 9:07:22 PM (11 years ago)
Author:
vboxsync
Message:

DnD: Update, bugfixes.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/runtime
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDDataObject_win.cpp

    r50508 r50561  
    231231    if (mStatus == Dropped)
    232232    {
    233 #ifdef VBOX_DND_DEBUG_FORMATS
    234233        LogFlowFunc(("cfFormat=%RI16, sFormat=%s, tyMed=%RU32, dwAspect=%RU32\n",
    235234                     pThisFormat->cfFormat, UIDnDDataObject::ClipboardFormatToString(pFormatEtc->cfFormat),
     
    237236        LogFlowFunc(("Got strFormat=%s, pvData=%p, cbData=%RU32\n",
    238237                     mstrFormat.toAscii().constData(), mpvData, mcbData));
    239 #endif
     238
    240239        QVariant::Type vaType;
    241240        QString strMIMEType;
     
    256255            vaType = QVariant::StringList;
    257256        }
    258 #if 0
     257#if 0 /* More formats; not needed right now. */
    259258        else if (   (pFormatEtc->tymed & TYMED_ISTREAM)
    260259                && (pFormatEtc->dwAspect == DVASPECT_CONTENT)
     
    285284                     strMIMEType.toAscii().constData(), vaType));
    286285
    287         QVariant va;
    288         int rc = mpParent->RetrieveData(strMIMEType, vaType, va);
     286        int rc;
     287        if (!mVaData.isValid())
     288            rc = mpParent->RetrieveData(strMIMEType, vaType, mVaData);
     289        else
     290            rc = VINF_SUCCESS; /* Data already retrieved. */
     291
    289292        if (RT_SUCCESS(rc))
    290293        {
    291294            if (   strMIMEType.startsWith("text/uri-list")
    292295                       /* One item. */
    293                 && (   va.canConvert(QVariant::String)
     296                && (   mVaData.canConvert(QVariant::String)
    294297                       /* Multiple items. */
    295                     || va.canConvert(QVariant::StringList))
     298                    || mVaData.canConvert(QVariant::StringList))
    296299               )
    297300            {
    298                 QStringList lstFilesURI = va.toStringList();
     301                QStringList lstFilesURI = mVaData.toStringList();
    299302                QStringList lstFiles;
    300303                for (size_t i = 0; i < lstFilesURI.size(); i++)
     
    326329
    327330                size_t cbBuf = sizeof(DROPFILES) + ((cchFiles + 1) * sizeof(RTUTF16));
    328                 DROPFILES *pBuf = (DROPFILES *)RTMemAllocZ(cbBuf);
    329                 if (pBuf)
     331                DROPFILES *pDropFiles = (DROPFILES *)RTMemAllocZ(cbBuf);
     332                if (pDropFiles)
    330333                {
    331                     pBuf->pFiles = sizeof(DROPFILES);
    332                     pBuf->fWide = 1; /* We use unicode. Always. */
    333 
    334                     uint8_t *pCurFile = (uint8_t *)pBuf + pBuf->pFiles;
     334                    pDropFiles->pFiles = sizeof(DROPFILES);
     335                    pDropFiles->fWide = 1; /* We use unicode. Always. */
     336
     337                    uint8_t *pCurFile = (uint8_t *)pDropFiles + pDropFiles->pFiles;
    335338                    AssertPtr(pCurFile);
    336339
     
    368371                        if (pMedium->hGlobal)
    369372                        {
    370                             LPVOID pMem = GlobalLock(pMedium->hGlobal);
    371                             if (pMem)
     373                            LPVOID pvMem = GlobalLock(pMedium->hGlobal);
     374                            if (pvMem)
    372375                            {
    373                                 memcpy(pMem, pBuf, cbBuf);
     376                                memcpy(pvMem, pDropFiles, cbBuf);
    374377                                GlobalUnlock(pMedium->hGlobal);
    375378
     
    383386                    }
    384387
    385                     RTMemFree(pBuf);
     388                    RTMemFree(pDropFiles);
    386389                }
    387390            }
    388391            else if (   strMIMEType.startsWith("text/plain")
    389                      && va.canConvert(QVariant::String))
     392                     && mVaData.canConvert(QVariant::String))
    390393            {
    391394                bool fUnicode = pFormatEtc->cfFormat == CF_UNICODETEXT;
    392                 int cbch = fUnicode
     395                int cbCh = fUnicode
    393396                         ? sizeof(WCHAR) : sizeof(char);
    394397
    395                 QString strText = va.toString();
    396                 size_t cbSrc = (strText.length() + 1) * cbch;
     398                QString strText = mVaData.toString();
     399                size_t cbSrc = strText.length() * cbCh;
    397400                Assert(cbSrc);
    398401                LPCVOID pvSrc = fUnicode
     
    400403                              : (void *)strText.toAscii().constData();
    401404                AssertPtr(pvSrc);
    402 #ifdef DEBUG_andy
     405
    403406                LogFlowFunc(("pvSrc=0x%p, cbSrc=%zu, cbch=%d, fUnicode=%RTbool\n",
    404                              pvSrc, cbSrc, cbch, fUnicode));
    405 #endif
     407                             pvSrc, cbSrc, cbCh, fUnicode));
     408
    406409                pMedium->tymed = TYMED_HGLOBAL;
    407410                pMedium->pUnkForRelease = NULL;
    408411                pMedium->hGlobal = GlobalAlloc(  GMEM_ZEROINIT
    409412                                               | GMEM_MOVEABLE
    410                                                | GMEM_DDESHARE, cbSrc);
     413                                               | GMEM_DDESHARE,
     414                                               cbSrc);
    411415                if (pMedium->hGlobal)
    412416                {
     
    423427                }
    424428                else
    425                     hr  = E_OUTOFMEMORY;
     429                    hr  = VERR_NO_MEMORY;
    426430            }
    427431            else
     
    445449        case TYMED_HGLOBAL:
    446450            pMedium->hGlobal = (HGLOBAL)OleDuplicateData(pThisMedium->hGlobal,
    447                                                          pThisFormat->cfFormat, NULL);
     451                                                         pThisFormat->cfFormat,
     452                                                         0 /* Flags */);
    448453            break;
    449454
     
    452457        }
    453458
    454         pMedium->tymed          = pThisFormat->tymed;
     459        pMedium->tymed          = pFormatEtc->tymed;
    455460        pMedium->pUnkForRelease = NULL;
    456461    }
    457462
    458     LogFlowFunc(("hr=%Rhrc\n", hr));
     463    LogFlowFunc(("Returning hr=%Rhrc\n", hr));
    459464    return hr;
    460465}
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDDataObject_win.h

    r50460 r50561  
    2525#include <QString>
    2626#include <QStringList>
     27#include <QVariant>
    2728
    2829/* Forward declarations: */
     
    9293    QStringList mlstFormats;
    9394    QString     mstrFormat;
     95    /** The retrieved data as a QVariant. Needed
     96     *  for buffering in case a second format needs
     97     *  the same data, e.g. CF_TEXT and CF_UNICODETEXT. */
     98    QVariant    mVaData;
     99    /** The retrieved data as a raw buffer. */
    94100    void       *mpvData;
     101    /** Raw buffer size (in bytes). */
    95102    uint32_t    mcbData;
    96103};
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDDrag.cpp

    r50460 r50561  
    8989        HRESULT hr = ::DoDragDrop(pDataObject, pDropSource,
    9090                                  dwOKEffects, &dwEffect);
    91         LogFlowThisFunc(("hr=%Rhrc, dwEffect=%RI32\n", hr, dwEffect));
     91        LogFlowThisFunc(("DoDragDrop ended with hr=%Rhrc, dwEffect=%RI32\n",
     92                         hr, dwEffect));
    9293
    9394        if (pDropSource)
     
    150151    {
    151152        msgCenter().showModalProgressDialog(progress,
    152                                             tr("Retrieving metadata ..."), ":/progress_dnd_gh_90px.png",
     153                                            tr("Retrieving data ..."), ":/progress_dnd_gh_90px.png",
    153154                                            m_pParent);
    154155        if (!progress.GetCanceled())
     
    161162            {
    162163                /* After the data successfully arrived from the guest, we query it from Main. */
    163                 QVector<uint8_t> data = guest.DragGHGetData();
    164                 if (!data.isEmpty())
     164                QVector<uint8_t> vecData = guest.DragGHGetData();
     165                if (!vecData.isEmpty())
    165166                {
    166167                    switch (vaType)
     
    168169                        case QVariant::String:
    169170                        {
    170                             vaData = QVariant(QString(reinterpret_cast<const char*>(data.data())));
     171                            vaData = QVariant(QString(reinterpret_cast<const char*>(vecData.constData())));
    171172                            break;
    172173                        }
     
    174175                        case QVariant::ByteArray:
    175176                        {
    176                             QByteArray ba(reinterpret_cast<const char*>(data.constData()), data.size());
     177                            QByteArray ba(reinterpret_cast<const char*>(vecData.constData()), vecData.size());
    177178                            vaData = QVariant(ba);
    178179                            break;
     
    181182                        case QVariant::StringList:
    182183                        {
    183                             QString strData = QString(reinterpret_cast<const char*>(data.data()));
     184                            QString strData = QString(reinterpret_cast<const char*>(vecData.constData()));
    184185                            QStringList lstString = strData.split("\r\n", QString::SkipEmptyParts);
    185186
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