VirtualBox

Changeset 50308 in vbox for trunk/src/VBox/HostServices


Ignore:
Timestamp:
Feb 3, 2014 2:20:52 PM (11 years ago)
Author:
vboxsync
Message:

DnD/HostServices: A bit of cleanup.

Location:
trunk/src/VBox/HostServices/DragAndDrop
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/DragAndDrop/dndmanager.cpp

    r49891 r50308  
    137137 ******************************************************************************/
    138138
    139 DnDHGSendFilePrivate::DnDHGSendFilePrivate(const RTCString &strHostPath, const RTCString &strGuestPath, uint32_t fMode, uint64_t cbSize, PFNDNDPRIVATEPROGRESS pfnProgressCallback, void *pvProgressUser)
    140   : m_strHostPath(strHostPath)
    141   , m_strGuestPath(strGuestPath)
    142   , m_cbFileSize(cbSize)
    143   , m_cbFileProcessed(0)
    144   , m_hCurFile(0)
    145   , m_pfnProgressCallback(pfnProgressCallback)
    146   , m_pvProgressUser(pvProgressUser)
     139DnDHGSendFilePrivate::DnDHGSendFilePrivate(const RTCString &strHostPath, const RTCString &strGuestPath,
     140                                           uint32_t fMode, uint64_t cbSize,
     141                                           PFNDNDPRIVATEPROGRESS pfnProgressCallback, void *pvProgressUser)
     142    : m_strHostPath(strHostPath)
     143    , m_strGuestPath(strGuestPath)
     144    , m_cbFileSize(cbSize)
     145    , m_cbFileProcessed(0)
     146    , m_hCurFile(0)
     147    , m_pfnProgressCallback(pfnProgressCallback)
     148    , m_pvProgressUser(pvProgressUser)
    147149{
    148150    m_paSkelParms[0].setString(m_strGuestPath.c_str());
     
    155157}
    156158
    157 DnDHGSendFilePrivate::~DnDHGSendFilePrivate()
     159DnDHGSendFilePrivate::~DnDHGSendFilePrivate(void)
    158160{
    159161    if (m_hCurFile)
     
    161163}
    162164
    163 int DnDHGSendFilePrivate::currentMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
     165int DnDHGSendFilePrivate::currentMessage(uint32_t uMsg, uint32_t cParms,
     166                                         VBOXHGCMSVCPARM paParms[])
    164167{
    165168    if (!m_pNextMsg)
     
    220223        if (   RT_SUCCESS(rc)
    221224            && m_pfnProgressCallback)
     225        {
    222226            rc = m_pfnProgressCallback(cbRead, m_pvProgressUser);
     227        }
    223228
    224229        if (   fDone
     
    237242 ******************************************************************************/
    238243
    239 DnDHGSendDataMessagePrivate::DnDHGSendDataMessagePrivate(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[], PFNDNDPRIVATEPROGRESS pfnProgressCallback, void *pvProgressUser)
    240   : m_cbSize(paParms[4].u.uint32)
    241   , m_cbDone(0)
    242   , m_pfnProgressCallback(pfnProgressCallback)
    243   , m_pvProgressUser(pvProgressUser)
    244 {
    245     /* Create the initial data message. */
     244DnDHGSendDataMessagePrivate::DnDHGSendDataMessagePrivate(uint32_t uMsg, uint32_t cParms,
     245                                                         VBOXHGCMSVCPARM paParms[],
     246                                                         PFNDNDPRIVATEPROGRESS pfnProgressCallback,
     247                                                         void *pvProgressUser)
     248    : m_cbSize(paParms[4].u.uint32)
     249    , m_cbDone(0)
     250    , m_pfnProgressCallback(pfnProgressCallback)
     251    , m_pvProgressUser(pvProgressUser)
     252{
     253    /* Create the initial data message. This might throw
     254     * a bad_alloc exception. */
    246255    m_pNextMsg = new HGCM::Message(uMsg, cParms, paParms);
    247256}
    248257
    249 int DnDHGSendDataMessagePrivate::currentMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
    250 {
    251     /* Todo: don't copy the data parts ... just move the data pointer in
    252      * the original data ptr. */
     258int DnDHGSendDataMessagePrivate::currentMessage(uint32_t uMsg, uint32_t cParms,
     259                                                VBOXHGCMSVCPARM paParms[])
     260{
     261    /** @todo Don't copy the data parts ... just move the data pointer in
     262     *        the original data ptr. */
    253263    if (!m_pNextMsg)
    254264        return VERR_NO_DATA;
     
    261271    m_pNextMsg = 0;
    262272    rc = pCurMsg->getData(uMsg, cParms, paParms);
     273
    263274    /* Depending on the current message, the data pointer is on a
    264275     * different position (HOST_DND_HG_SND_DATA=3;
     
    266277    int iPos = uMsg == DragAndDropSvc::HOST_DND_HG_SND_DATA ? 3 : 0;
    267278    m_cbDone += paParms[iPos + 1].u.uint32;
    268     /* Info & data send already? */
     279
     280    /* Info + data send already? */
    269281    if (rc == VERR_BUFFER_OVERFLOW)
    270282    {
     
    287299    }
    288300
    289     delete pCurMsg;
    290 
    291     /* Advance progress info */
     301    if (pCurMsg)
     302        delete pCurMsg;
     303
     304    /* Advance progress info. */
    292305    if (   RT_SUCCESS(rc)
    293306        && m_pfnProgressCallback)
     307    {
    294308        rc = m_pfnProgressCallback(m_cbDone, m_pvProgressUser);
     309    }
    295310
    296311    return rc;
     
    303318/*
    304319 * This class is a meta message class. It doesn't consist of any own message
    305  * data, but handle the meta info, the data itself as well any files or
     320 * data, but handle the meta info, the data itself as well as any files or
    306321 * directories which have to be transfered to the guest.
    307322 */
    308 DnDHGSendDataMessage::DnDHGSendDataMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[], PFNDNDPROGRESS pfnProgressCallback, void *pvProgressUser)
     323DnDHGSendDataMessage::DnDHGSendDataMessage(uint32_t uMsg, uint32_t cParms,
     324                                           VBOXHGCMSVCPARM paParms[],
     325                                           PFNDNDPROGRESS pfnProgressCallback,
     326                                           void *pvProgressUser)
    309327    : m_cbAll(0)
    310328    , m_cbTransfered(0)
     
    312330    , m_pvProgressUser(pvProgressUser)
    313331{
    314     RTCString strNewUris;
     332    RTCString strNewURIs;
     333
    315334    /* Check the format for any uri type. */
    316     if (hasFileUrls(static_cast<const char*>(paParms[1].u.pointer.addr), paParms[1].u.pointer.size))
     335    if (hasFileUrls(static_cast<const char*>(paParms[1].u.pointer.addr),
     336                    paParms[1].u.pointer.size))
    317337    {
    318338        LogFlowFunc(("Old data: '%s'\n", (char*)paParms[3].u.pointer.addr));
    319         /* The list is separated by newline (Even if only one file is
    320          * listed). */
    321         RTCList<RTCString> oldUriList = RTCString(static_cast<const char*>(paParms[3].u.pointer.addr),
    322                                                   paParms[3].u.pointer.size).split("\r\n");
    323         if (!oldUriList.isEmpty())
    324         {
    325             RTCList<RTCString> newUriList;
    326             for (size_t i = 0; i < oldUriList.size(); ++i)
    327             {
    328                 const RTCString &strUri = oldUriList.at(i);
     339
     340        /* The list is separated by newline (even if only one file is listed). */
     341        RTCList<RTCString> lstURIOrg = RTCString(static_cast<const char*>(paParms[3].u.pointer.addr),
     342                                                 paParms[3].u.pointer.size).split("\r\n");
     343        if (!lstURIOrg.isEmpty())
     344        {
     345            RTCList<RTCString> lstURINew;
     346            for (size_t i = 0; i < lstURIOrg.size(); ++i)
     347            {
     348                const RTCString &strURI = lstURIOrg.at(i);
     349
    329350                /* Query the path component of a file URI. If this hasn't a
    330                  * file scheme null is returned. */
    331                 if (char *pszFilePath = RTUriFilePath(strUri.c_str(), URI_FILE_FORMAT_AUTO))
     351                 * file scheme NULL is returned. */
     352                char *pszFilePath;
     353                if (pszFilePath = RTUriFilePath(strURI.c_str(), URI_FILE_FORMAT_AUTO))
    332354                {
    333355                    /* Add the path to our internal file list (recursive in
    334356                     * the case of a directory). */
    335                     if (char *pszFilename = RTPathFilename(pszFilePath))
     357                    char *pszFilename;
     358                    if (pszFilename = RTPathFilename(pszFilePath))
    336359                    {
    337                         char *pszNewUri = RTUriFileCreate(pszFilename);
    338                         if (pszNewUri)
     360                        char *pszNewURI = RTUriFileCreate(pszFilename);
     361                        if (pszNewURI)
    339362                        {
    340                             newUriList.append(pszNewUri);
    341                             RTStrFree(pszNewUri);
     363                            lstURINew.append(pszNewURI);
     364                            RTStrFree(pszNewURI);
     365
    342366                            buildFileTree(pszFilePath, pszFilename - pszFilePath);
    343367                        }
    344368                    }
     369
    345370                    RTStrFree(pszFilePath);
    346371                }
    347                 else
    348                     newUriList.append(strUri);
    349             }
     372                else /* Just append the raw data. */
     373                    lstURINew.append(strURI);
     374            }
     375
    350376            /* We have to change the actual DnD data. Remove any host paths and
    351377             * just decode the filename into the new data. The guest tools will
    352378             * add the correct path again, before sending the DnD drop event to
    353379             * some window. */
    354             strNewUris = RTCString::join(newUriList, "\r\n") + "\r\n";
    355             /* Remark: We don't delete the old pointer here, cause this is done
    356              * by the caller. We just use the RTString data, which has the
    357              * scope of this ctor. This is enough cause the data is copied in
    358              * the DnDHGSendDataMessagePrivate anyway. */
    359             paParms[3].u.pointer.addr = (void*)strNewUris.c_str();
    360             paParms[3].u.pointer.size = strNewUris.length() + 1;
    361             paParms[4].u.uint32       = strNewUris.length() + 1;
    362         }
    363     }
     380            strNewURIs = RTCString::join(lstURINew, "\r\n") + "\r\n";
     381
     382            /* Note: We don't delete the old pointer here, cause this is done
     383             *       by the caller. We just use the RTString data, which has the
     384             *       scope of this ctor. This is enough cause the data is copied in
     385             *       the DnDHGSendDataMessagePrivate anyway. */
     386            paParms[3].u.pointer.addr = (void*)strNewURIs.c_str();
     387            paParms[3].u.pointer.size = strNewURIs.length() + 1;
     388            paParms[4].u.uint32       = strNewURIs.length() + 1;
     389        }
     390    }
     391
    364392    /* Add the size of the data to the todo list. */
    365393    m_cbAll += paParms[4].u.uint32;
     394
    366395    /* The first message is the meta info for the data and the data itself. */
    367396    m_pNextPathMsg = new DnDHGSendDataMessagePrivate(uMsg, cParms, paParms,
    368397                                                     &DnDHGSendDataMessage::progressCallback, this);
    369 
     398#ifdef DEBUG
    370399    LogFlowFunc(("new data '%s'\n", (char*)paParms[3].u.pointer.addr));
    371400    LogFlowFunc(("cbAll: %zu\n", m_cbAll));
     
    376405                     m_uriList.at(i).m_strHostPath.c_str(), m_uriList.at(i).m_strGuestPath.c_str(),
    377406                     m_uriList.at(i).m_fMode, m_uriList.at(i).m_cbSize));
    378 }
    379 
    380 DnDHGSendDataMessage::~DnDHGSendDataMessage()
     407#endif
     408}
     409
     410DnDHGSendDataMessage::~DnDHGSendDataMessage(void)
    381411{
    382412    if (m_pNextPathMsg)
     
    384414}
    385415
    386 HGCM::Message* DnDHGSendDataMessage::nextHGCMMessage()
     416HGCM::Message* DnDHGSendDataMessage::nextHGCMMessage(void)
    387417{
    388418    if (!m_pNextPathMsg)
     
    450480{
    451481    LogFlowFunc(("format %s\n", pcszFormat));
     482
    452483    /** @todo text/uri also an official variant? */
    453     return    RTStrNICmp(pcszFormat, "text/uri-list", cbMax)             == 0
    454            || RTStrNICmp(pcszFormat, "x-special/gnome-icon-list", cbMax) == 0;
     484    return (   RTStrNICmp(pcszFormat, "text/uri-list", cbMax)             == 0
     485            || RTStrNICmp(pcszFormat, "x-special/gnome-icon-list", cbMax) == 0);
    455486}
    456487
     
    462493        return rc;
    463494
    464     /* These are the types we currently support. Symlinks are not directly
     495    /*
     496     * These are the types we currently support. Symlinks are not directly
    465497     * supported. First the guest could be an OS which doesn't support it and
    466498     * second the symlink could point to a file which is out of the base tree.
    467499     * Both things are hard to support. For now we just copy the target file in
    468      * this case. */
     500     * this case.
     501     */
    469502    if (!(   RTFS_IS_DIRECTORY(objInfo.Attr.fMode)
    470503          || RTFS_IS_FILE(objInfo.Attr.fMode)
     
    476509    if (rc == VERR_IS_A_DIRECTORY)
    477510        rc = VINF_SUCCESS;
     511
    478512    if (RT_FAILURE(rc))
    479513        return rc;
     514
    480515    m_uriList.append(PathEntry(pcszPath, &pcszPath[cbBaseLen], objInfo.Attr.fMode, cbSize));
    481516    m_cbAll += cbSize;
     
    523558            case RTDIRENTRYTYPE_FILE:
    524559            {
    525                 if (char *pszNewFile = RTStrAPrintf2("%s%c%s", pcszPath, RTPATH_DELIMITER, DirEntry.szName))
     560                char *pszNewFile;
     561                if (pszNewFile = RTStrAPrintf2("%s%c%s", pcszPath, RTPATH_DELIMITER, DirEntry.szName))
    526562                {
    527563                    /* We need the size and the mode of the file. */
     
    533569                    if (RT_FAILURE(rc))
    534570                        break;
    535                     m_uriList.append(PathEntry(pszNewFile, &pszNewFile[cbBaseLen], objInfo1.Attr.fMode, cbSize));
     571
     572                    m_uriList.append(PathEntry(pszNewFile, &pszNewFile[cbBaseLen],
     573                                               objInfo1.Attr.fMode, cbSize));
    536574                    m_cbAll += cbSize;
     575
    537576                    RTStrFree(pszNewFile);
    538577                }
     
    541580                break;
    542581            }
    543             default: break;
    544         }
    545     }
     582
     583            default:
     584                break;
     585        }
     586    }
     587
    546588    RTDirClose(hDir);
    547589
     
    554596
    555597    DnDHGSendDataMessage *pSelf = static_cast<DnDHGSendDataMessage *>(pvUser);
     598    AssertPtr(pSelf);
    556599
    557600    /* How many bytes are transfered already. */
     
    562605    if (   pSelf->m_pfnProgressCallback
    563606        && pSelf->m_cbAll)
     607    {
    564608        rc = pSelf->m_pfnProgressCallback((uint64_t)pSelf->m_cbTransfered * 100 / pSelf->m_cbAll,
    565                                           DragAndDropSvc::DND_PROGRESS_RUNNING, VINF_SUCCESS /* rc */, pSelf->m_pvProgressUser);
     609                                          DragAndDropSvc::DND_PROGRESS_RUNNING,
     610                                          VINF_SUCCESS /* rc */, pSelf->m_pvProgressUser);
     611    }
    566612
    567613    return rc;
     
    603649                break;
    604650            }
     651
    605652            case DragAndDropSvc::HOST_DND_HG_EVT_MOVE:
    606653            {
     
    616663                    || paParms[5].type != VBOX_HGCM_SVC_PARM_PTR   /* data */
    617664                    || paParms[6].type != VBOX_HGCM_SVC_PARM_32BIT /* size */)
     665                {
    618666                    rc = VERR_INVALID_PARAMETER;
     667                }
    619668                else
    620669                {
     
    625674                break;
    626675            }
     676
    627677            case DragAndDropSvc::HOST_DND_HG_EVT_LEAVE:
    628678            {
     
    637687                    m_dndMessageQueue.append(pMessage);
    638688                }
     689
    639690                m_fOpInProcess = false;
    640691                break;
    641692            }
     693
    642694            case DragAndDropSvc::HOST_DND_HG_EVT_DROPPED:
    643695            {
     
    653705                    || paParms[5].type != VBOX_HGCM_SVC_PARM_PTR   /* data */
    654706                    || paParms[6].type != VBOX_HGCM_SVC_PARM_32BIT /* size */)
     707                {
    655708                    rc = VERR_INVALID_PARAMETER;
     709                }
    656710                else
    657711                {
     
    661715                break;
    662716            }
     717
    663718            case DragAndDropSvc::HOST_DND_HG_SND_DATA:
    664719            {
     
    672727                    || paParms[3].type != VBOX_HGCM_SVC_PARM_PTR   /* data */
    673728                    || paParms[4].type != VBOX_HGCM_SVC_PARM_32BIT /* data size */)
     729                {
    674730                    rc = VERR_INVALID_PARAMETER;
     731                }
    675732                else
    676733                {
    677                     DnDHGSendDataMessage *pMessage = new DnDHGSendDataMessage(uMsg, cParms, paParms, m_pfnProgressCallback, m_pvProgressUser);
     734                    DnDHGSendDataMessage *pMessage =
     735                        new DnDHGSendDataMessage(uMsg, cParms, paParms,
     736                                                 m_pfnProgressCallback, m_pvProgressUser);
    678737                    m_dndMessageQueue.append(pMessage);
    679738                }
    680739                break;
    681740            }
    682     #ifdef VBOX_WITH_DRAG_AND_DROP_GH
     741
     742#ifdef VBOX_WITH_DRAG_AND_DROP_GH
    683743            case DragAndDropSvc::HOST_DND_GH_REQ_PENDING:
    684744            {
     
    688748                if (   cParms != 1
    689749                    || paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* screen id */)
     750                {
    690751                    rc = VERR_INVALID_PARAMETER;
     752                }
    691753                else
    692754                {
     
    696758                break;
    697759            }
     760
    698761            case DragAndDropSvc::HOST_DND_GH_EVT_DROPPED:
    699762            {
     
    705768                    || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* format size */
    706769                    || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* action */)
     770                {
    707771                    rc = VERR_INVALID_PARAMETER;
     772                }
    708773                else
    709774                {
     
    721786                break;
    722787            }
    723     #endif
     788#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
     789
    724790            default:
    725791                rc = VERR_NOT_IMPLEMENTED;
     
    735801}
    736802
    737 HGCM::Message* DnDManager::nextHGCMMessage()
     803HGCM::Message* DnDManager::nextHGCMMessage(void)
    738804{
    739805    if (m_pCurMsg)
    740806        return m_pCurMsg->nextHGCMMessage();
    741     else
    742     {
    743         if (m_dndMessageQueue.isEmpty())
    744             return 0;
    745 
    746         return m_dndMessageQueue.first()->nextHGCMMessage();
    747     }
     807
     808    if (m_dndMessageQueue.isEmpty())
     809        return NULL;
     810
     811    return m_dndMessageQueue.first()->nextHGCMMessage();
    748812}
    749813
     
    832896}
    833897
    834 void DnDManager::clear()
     898void DnDManager::clear(void)
    835899{
    836900    if (m_pCurMsg)
     
    839903        m_pCurMsg = 0;
    840904    }
     905
    841906    while (!m_dndMessageQueue.isEmpty())
    842907    {
  • trunk/src/VBox/HostServices/DragAndDrop/dndmanager.h

    r49891 r50308  
    105105{
    106106public:
     107
    107108    DnDHGSendDataMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[], PFNDNDPROGRESS pfnProgressCallback, void *pvProgressUser);
    108     ~DnDHGSendDataMessage();
    109 
    110     HGCM::Message* nextHGCMMessage();
     109    virtual ~DnDHGSendDataMessage(void);
     110
     111    HGCM::Message* nextHGCMMessage(void);
    111112    int currentMessageInfo(uint32_t *puMsg, uint32_t *pcParms);
    112113    int currentMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
    113114
    114     bool isMessageWaiting() const { return !!m_pNextPathMsg; }
     115    bool isMessageWaiting(void) const { return !!m_pNextPathMsg; }
    115116
    116117protected:
     118
    117119    struct PathEntry
    118120    {
    119121        PathEntry(const RTCString &strHostPath, const RTCString &strGuestPath, uint32_t fMode, uint64_t cbSize)
    120           : m_strHostPath(strHostPath)
    121           , m_strGuestPath(strGuestPath)
    122           , m_fMode(fMode)
    123           , m_cbSize(cbSize) {}
     122            : m_strHostPath(strHostPath)
     123            , m_strGuestPath(strGuestPath)
     124            , m_fMode(fMode)
     125            , m_cbSize(cbSize) {}
    124126        RTCString m_strHostPath;
    125127        RTCString m_strGuestPath;
     
    135137    DnDMessage         *m_pNextPathMsg;
    136138
    137     /* Progress stuff */
     139    /* Total size (in bytes). */
    138140    size_t              m_cbAll;
     141    /* Transferred size (in bytes). */
    139142    size_t              m_cbTransfered;
    140143    PFNDNDPROGRESS      m_pfnProgressCallback;
  • trunk/src/VBox/HostServices/DragAndDrop/service.cpp

    r50265 r50308  
    208208                && modeGet() != VBOX_DRAG_AND_DROP_MODE_HOST_TO_GUEST)
    209209            {
    210                 LogFlowFunc(("=> ignoring!\n"));
     210                LogFlowFunc(("Wrong DnD mode, ignoring request\n"));
    211211                break;
    212212            }
     
    232232                && modeGet() != VBOX_DRAG_AND_DROP_MODE_HOST_TO_GUEST)
    233233            {
    234                 LogFlowFunc(("=> ignoring!\n"));
     234                LogFlowFunc(("Wrong DnD mode, ignoring request\n"));
    235235                break;
    236236            }
     
    262262                && modeGet() != VBOX_DRAG_AND_DROP_MODE_GUEST_TO_HOST)
    263263            {
    264                 LogFlowFunc(("=> ignoring!\n"));
     264                LogFlowFunc(("Wrong DnD mode, ignoring request\n"));
    265265                break;
    266266            }
     
    290290                && modeGet() != VBOX_DRAG_AND_DROP_MODE_GUEST_TO_HOST)
    291291            {
    292                 LogFlowFunc(("=> ignoring\n"));
     292                LogFlowFunc(("Wrong DnD mode, ignoring request\n"));
    293293                break;
    294294            }
     
    315315                && modeGet() != VBOX_DRAG_AND_DROP_MODE_GUEST_TO_HOST)
    316316            {
    317                 LogFlowFunc(("=> ignoring!\n"));
     317                LogFlowFunc(("Wrong DnD mode, ignoring request\n"));
    318318                break;
    319319            }
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