VirtualBox

Ignore:
Timestamp:
May 4, 2015 12:38:57 PM (10 years ago)
Author:
vboxsync
Message:

DnD:

  • Overhauled "dropped files" directory + general file handling: Keep the directories/files open when doing the actual transfers (only protocol >= 2)
  • Unified "dropped files" directory creation/rollback handling for guest/host parts.
Location:
trunk/src/VBox/GuestHost/DragAndDrop
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/DragAndDrop/DnDDir.cpp

    r50460 r55640  
    55
    66/*
    7  * Copyright (C) 2014 Oracle Corporation
     7 * Copyright (C) 2014-2015 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    2727#include <VBox/GuestHost/DragAndDrop.h>
    2828
    29 int DnDDirCreateDroppedFilesEx(const char *pszPath,
    30                                char *pszDropDir, size_t cbDropDir)
     29int DnDDirDroppedAddFile(PDNDDIRDROPPEDFILES pDir, const char *pszFile)
     30{
     31    AssertPtrReturn(pDir, VERR_INVALID_POINTER);
     32    AssertPtrReturn(pszFile, VERR_INVALID_POINTER);
     33
     34    if (!pDir->lstFiles.contains(pszFile))
     35        pDir->lstFiles.append(pszFile);
     36    return VINF_SUCCESS;
     37}
     38
     39int DnDDirDroppedAddDir(PDNDDIRDROPPEDFILES pDir, const char *pszDir)
     40{
     41    AssertPtrReturn(pDir, VERR_INVALID_POINTER);
     42    AssertPtrReturn(pszDir, VERR_INVALID_POINTER);
     43
     44    if (!pDir->lstDirs.contains(pszDir))
     45        pDir->lstDirs.append(pszDir);
     46    return VINF_SUCCESS;
     47}
     48
     49int DnDDirDroppedFilesCreateAndOpenEx(const char *pszPath, PDNDDIRDROPPEDFILES pDir)
    3150{
    3251    AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
    33     AssertPtrReturn(pszDropDir, VERR_INVALID_POINTER);
    34     AssertReturn(cbDropDir, VERR_INVALID_PARAMETER);
     52    AssertPtrReturn(pDir, VERR_INVALID_POINTER);
    3553
    36     if (RTStrPrintf(pszDropDir, cbDropDir, "%s", pszPath) <= 0)
     54    char pszDropDir[RTPATH_MAX];
     55    if (RTStrPrintf(pszDropDir, sizeof(pszDropDir), "%s", pszPath) <= 0)
    3756        return VERR_NO_MEMORY;
    3857
     
    4261
    4362    /* Append our base drop directory. */
    44     int rc = RTPathAppend(pszDropDir, cbDropDir, "VirtualBox Dropped Files");
     63    int rc = RTPathAppend(pszDropDir, sizeof(pszDropDir), "VirtualBox Dropped Files"); /** @todo Make this tag configurable? */
    4564    if (RT_FAILURE(rc))
    4665        return rc;
     
    6483        return rc;
    6584
    66     rc = RTPathAppend(pszDropDir, cbDropDir, pszTime);
     85    rc = RTPathAppend(pszDropDir, sizeof(pszDropDir), pszTime);
    6786    if (RT_FAILURE(rc))
    6887        return rc;
    6988
    7089    /* Create it (only accessible by the current user) */
    71     return RTDirCreateUniqueNumbered(pszDropDir, cbDropDir, RTFS_UNIX_IRWXU, 3, '-');
     90    rc = RTDirCreateUniqueNumbered(pszDropDir, sizeof(pszDropDir), RTFS_UNIX_IRWXU, 3, '-');
     91    if (RT_SUCCESS(rc))
     92    {
     93        PRTDIR phDir;
     94        rc = RTDirOpen(&phDir, pszDropDir);
     95        if (RT_SUCCESS(rc))
     96        {
     97            pDir->hDir       = phDir;
     98            pDir->strPathAbs = pszDropDir;
     99        }
     100    }
     101
     102    return rc;
    72103}
    73104
    74 int DnDDirCreateDroppedFiles(char *pszDropDir, size_t cbDropDir)
     105int DnDDirDroppedFilesCreateAndOpenTemp(PDNDDIRDROPPEDFILES pDir)
    75106{
    76     AssertPtrReturn(pszDropDir, VERR_INVALID_POINTER);
    77     AssertReturn(cbDropDir, VERR_INVALID_PARAMETER);
     107    AssertPtrReturn(pDir, VERR_INVALID_POINTER);
    78108
    79109    char szTemp[RTPATH_MAX];
    80110
    81     /* Get the user's temp directory. Don't use the user's root directory (or
     111    /*
     112     * Get the user's temp directory. Don't use the user's root directory (or
    82113     * something inside it) because we don't know for how long/if the data will
    83      * be kept after the guest OS used it. */
     114     * be kept after the guest OS used it.
     115     */
    84116    int rc = RTPathTemp(szTemp, sizeof(szTemp));
    85117    if (RT_FAILURE(rc))
    86118        return rc;
    87119
    88     return DnDDirCreateDroppedFilesEx(szTemp, pszDropDir, cbDropDir);
     120    return DnDDirDroppedFilesCreateAndOpenEx(szTemp, pDir);
    89121}
    90122
     123int DnDDirDroppedFilesClose(PDNDDIRDROPPEDFILES pDir, bool fRemove)
     124{
     125    AssertPtrReturn(pDir, VERR_INVALID_POINTER);
     126
     127    int rc = RTDirClose(pDir->hDir);
     128    if (RT_SUCCESS(rc))
     129    {
     130        pDir->lstDirs.clear();
     131        pDir->lstFiles.clear();
     132
     133        if (fRemove)
     134        {
     135            /* Try removing the (empty) drop directory in any case. */
     136            rc = RTDirRemove(pDir->strPathAbs.c_str());
     137            if (RT_SUCCESS(rc)) /* Only clear if successfully removed. */
     138                pDir->strPathAbs = "";
     139        }
     140    }
     141
     142    return rc;
     143}
     144
     145const char *DnDDirDroppedFilesGetDirAbs(PDNDDIRDROPPEDFILES pDir)
     146{
     147    AssertPtrReturn(pDir, NULL);
     148    return pDir->strPathAbs.c_str();
     149}
     150
     151int DnDDirDroppedFilesRollback(PDNDDIRDROPPEDFILES pDir)
     152{
     153    AssertPtrReturn(pDir, VERR_INVALID_POINTER);
     154
     155    if (pDir->strPathAbs.isEmpty())
     156        return VINF_SUCCESS;
     157
     158    int rc = VINF_SUCCESS;
     159    int rc2;
     160
     161    /* Rollback by removing any stuff created.
     162     * Note: Only remove empty directories, never ever delete
     163     *       anything recursive here! Steam (tm) knows best ... :-) */
     164    for (size_t i = 0; i < pDir->lstFiles.size(); i++)
     165    {
     166        rc2 = RTFileDelete(pDir->lstFiles.at(i).c_str());
     167        if (RT_SUCCESS(rc))
     168            rc = rc2;
     169    }
     170
     171    for (size_t i = 0; i < pDir->lstDirs.size(); i++)
     172    {
     173        rc2 = RTDirRemove(pDir->lstDirs.at(i).c_str());
     174        if (RT_SUCCESS(rc))
     175            rc = rc2;
     176    }
     177
     178    /* Try to remove the empty root dropped files directory as well. */
     179    rc2 = RTDirRemove(pDir->strPathAbs.c_str());
     180    if (RT_SUCCESS(rc))
     181        rc = rc2;
     182
     183    return rc;
     184}
     185
  • trunk/src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp

    r55556 r55640  
    336336}
    337337
    338 int DnDURIList::RootFromURIData(const void *pvData, size_t cbData,
    339                                 uint32_t fFlags)
     338int DnDURIList::RootFromURIData(const void *pvData, size_t cbData, uint32_t fFlags)
    340339{
    341340    AssertPtrReturn(pvData, VERR_INVALID_POINTER);
     
    380379}
    381380
    382 RTCString DnDURIList::RootToString(const RTCString &strBasePath /* = "" */,
     381RTCString DnDURIList::RootToString(const RTCString &strPathBase /* = "" */,
    383382                                   const RTCString &strSeparator /* = "\r\n" */)
    384383{
     
    390389        LogFlowFunc(("pszCurRoot=%s\n", pszCurRoot));
    391390#endif
    392         if (strBasePath.isNotEmpty())
    393         {
    394             char *pszPath = RTPathJoinA(strBasePath.c_str(), pszCurRoot);
     391        if (strPathBase.isNotEmpty())
     392        {
     393            char *pszPath = RTPathJoinA(strPathBase.c_str(), pszCurRoot);
    395394            if (pszPath)
    396395            {
     
    399398                {
    400399                    strRet += RTCString(pszPathURI) + strSeparator;
    401 #ifdef DEBUG_andy
    402400                    LogFlowFunc(("URI: %s\n", strRet.c_str()));
    403 #endif
    404401                    RTStrFree(pszPathURI);
    405402                }
     
    417414            {
    418415                strRet += RTCString(pszPathURI) + strSeparator;
    419 #ifdef DEBUG_andy
    420416                LogFlowFunc(("URI: %s\n", strRet.c_str()));
    421 #endif
    422417                RTStrFree(pszPathURI);
    423418            }
  • trunk/src/VBox/GuestHost/DragAndDrop/DnDURIObject.cpp

    r55556 r55640  
    3737DnDURIObject::DnDURIObject(void)
    3838    : m_Type(Unknown)
    39     , m_fCreationMode(0)
     39    , m_fMode(0)
    4040    , m_cbSize(0)
    4141    , m_cbProcessed(0)
     
    5151    , m_strSrcPath(strSrcPath)
    5252    , m_strTgtPath(strDstPath)
    53     , m_fCreationMode(fMode)
     53    , m_fMode(fMode)
    5454    , m_cbSize(cbSize)
    5555    , m_cbProcessed(0)
     
    155155}
    156156
    157 int DnDURIObject::Open(Dest enmDest, uint64_t fOpen)
     157int DnDURIObject::Open(Dest enmDest, uint64_t fOpen /* = 0 */, uint32_t fMode /* = 0 */)
    158158{
    159159    return OpenEx(  enmDest == Source
    160160                  ? m_strSrcPath : m_strTgtPath
    161                   , m_Type, enmDest, fOpen, 0 /* fFlag s*/);
     161                  , m_Type, enmDest, fOpen, fMode, 0 /* fFlags */);
    162162}
    163163
    164164int DnDURIObject::OpenEx(const RTCString &strPath, Type enmType, Dest enmDest,
    165                          uint64_t fOpen /* = 0 */, uint32_t fFlags /* = 0 */)
     165                         uint64_t fOpen /* = 0 */, uint32_t fMode /* = 0 */, uint32_t fFlags /* = 0 */)
    166166{
    167167    int rc = VINF_SUCCESS;
     
    198198                    if (RT_SUCCESS(rc))
    199199                        rc = RTFileGetSize(u.m_hFile, &m_cbSize);
     200                    if (RT_SUCCESS(rc)
     201                        && fMode)
     202                    {
     203                        rc = RTFileSetMode(u.m_hFile, fMode);
     204                    }
    200205                    if (RT_SUCCESS(rc))
    201206                    {
    202                         LogFlowFunc(("cbSize=%RU64, fMode=%RU32\n", m_cbSize, m_fCreationMode));
     207                        LogFlowFunc(("cbSize=%RU64, fMode=%RU32\n", m_cbSize, m_fMode));
    203208                        m_cbProcessed = 0;
    204209                    }
     
    293298        case File:
    294299        {
    295             bool fDone = false;
    296 
    297300            rc = OpenEx(m_strSrcPath, File, Source,
    298301                        /* Use some sensible defaults. */
     
    307310
    308311                    /* End of file reached or error occurred? */
    309                     if (m_cbProcessed == m_cbSize)
     312                    if (   m_cbSize
     313                        && m_cbProcessed == m_cbSize)
    310314                    {
    311315                        rc = VINF_EOF;
    312                         fDone = true;
    313316                    }
    314317                }
    315                 else
    316                     fDone = true;
    317 
    318                 if (fDone)
    319                     closeInternal();
    320318            }
    321319
     
    351349    m_strSrcPath    = "";
    352350    m_strTgtPath    = "";
    353     m_fCreationMode = 0;
     351    m_fMode = 0;
    354352    m_cbSize        = 0;
    355353    m_cbProcessed   = 0;
     
    369367        case File:
    370368        {
    371             bool fDone = false;
    372 
    373369            rc = OpenEx(m_strTgtPath, File, Target,
    374370                        /* Use some sensible defaults. */
     
    379375                if (RT_SUCCESS(rc))
    380376                    m_cbProcessed += cbWritten;
    381                 else
    382                     fDone = true;
    383 
    384                 if (fDone)
    385                     closeInternal();
    386377            }
    387378
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