VirtualBox

Changeset 57776 in vbox for trunk/src


Ignore:
Timestamp:
Sep 16, 2015 9:40:54 AM (9 years ago)
Author:
vboxsync
Message:

DnD: Renamed DNDDIRDROPPEDFILES to DnDDroppedFiles and restructured it for being a class.

Location:
trunk/src/VBox
Files:
4 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp

    r57743 r57776  
    373373     * Create and query the (unique) drop target directory in the user's temporary directory.
    374374     */
    375     PDNDDIRDROPPEDFILES pDroppedFiles;
    376     const char *pszDropDir = NULL;
    377     int rc = DnDDirDroppedFilesCreateAndOpenTemp(0 /* fFlags */, &pDroppedFiles);
    378     if (RT_SUCCESS(rc))
    379         pszDropDir = DnDDirDroppedFilesGetDirAbs(pDroppedFiles);
     375    DnDDroppedFiles droppedFiles;
     376    int rc = droppedFiles.OpenTemp(0 /* fFlags */);
     377    if (RT_FAILURE(rc))
     378    {
     379        RTMemFree(pvChunk);
     380        return VERR_NO_MEMORY;
     381    }
     382
     383    const char *pszDropDir = droppedFiles.GetDirAbs();
     384    AssertPtr(pszDropDir);
    380385
    381386    /*
     
    421426                        rc = RTDirCreate(pszPathAbs, fCreationMode, 0);
    422427                        if (RT_SUCCESS(rc))
    423                             rc = DnDDirDroppedAddDir(pDroppedFiles, pszPathAbs);
     428                            rc = droppedFiles.AddDir(pszPathAbs);
    424429
    425430                        RTStrFree(pszPathAbs);
     
    488493                                if (RT_SUCCESS(rc))
    489494                                {
    490                                     rc = DnDDirDroppedAddFile(pDroppedFiles, strPathAbs.c_str());
     495                                    rc = droppedFiles.AddFile(strPathAbs.c_str());
    491496                                    if (RT_SUCCESS(rc))
    492497                                    {
     
    571576    if (RT_FAILURE(rc))
    572577    {
    573         int rc2 = DnDDirDroppedFilesRollback(pDroppedFiles);
     578        int rc2 = droppedFiles.Rollback();
    574579        AssertRC(rc2); /* Not fatal, don't report back to host. */
    575580    }
     
    620625     * by the client's drag'n drop operation lateron.
    621626     */
    622     int rc2 = DnDDirDroppedFilesClose(pDroppedFiles, false);
     627    int rc2 = droppedFiles.Reset(false /* fRemoveDropDir */);
    623628    if (RT_FAILURE(rc2)) /* Not fatal, don't report back to host. */
    624629        LogFlowFunc(("Closing dropped files directory failed with %Rrc\n", rc2));
    625 
    626     DnDDirDroppedFilesDestroy(pDroppedFiles);
    627630
    628631    LogFlowFuncLeaveRC(rc);
  • trunk/src/VBox/GuestHost/DragAndDrop/DnDDroppedFiles.cpp

    r57756 r57776  
    2828#include <VBox/GuestHost/DragAndDrop.h>
    2929
    30 int DnDDirDroppedAddFile(PDNDDIRDROPPEDFILES pDir, const char *pszFile)
    31 {
    32     AssertPtrReturn(pDir, VERR_INVALID_POINTER);
     30DnDDroppedFiles::DnDDroppedFiles(void)
     31    : hDir(NULL)
     32    , fOpen(false) { }
     33
     34DnDDroppedFiles::DnDDroppedFiles(const char *pszPath, uint32_t fFlags)
     35    : hDir(NULL)
     36    , fOpen(false)
     37{
     38    OpenEx(pszPath, fFlags);
     39}
     40
     41DnDDroppedFiles::~DnDDroppedFiles(void)
     42{
     43    Reset(true /* fRemoveDropDir */);
     44}
     45
     46int DnDDroppedFiles::AddFile(const char *pszFile)
     47{
    3348    AssertPtrReturn(pszFile, VERR_INVALID_POINTER);
    3449
    35     if (!pDir->lstFiles.contains(pszFile))
    36         pDir->lstFiles.append(pszFile);
     50    if (!this->lstFiles.contains(pszFile))
     51        this->lstFiles.append(pszFile);
    3752    return VINF_SUCCESS;
    3853}
    3954
    40 int DnDDirDroppedAddDir(PDNDDIRDROPPEDFILES pDir, const char *pszDir)
    41 {
    42     AssertPtrReturn(pDir, VERR_INVALID_POINTER);
     55int DnDDroppedFiles::AddDir(const char *pszDir)
     56{
    4357    AssertPtrReturn(pszDir, VERR_INVALID_POINTER);
    4458
    45     if (!pDir->lstDirs.contains(pszDir))
    46         pDir->lstDirs.append(pszDir);
     59    if (!this->lstDirs.contains(pszDir))
     60        this->lstDirs.append(pszDir);
    4761    return VINF_SUCCESS;
    4862}
    4963
    50 static int dndDirDroppedFilesCreate(uint32_t fFlags, PDNDDIRDROPPEDFILES *ppDir)
    51 {
     64const char *DnDDroppedFiles::GetDirAbs(void) const
     65{
     66    return this->strPathAbs.c_str();
     67}
     68
     69bool DnDDroppedFiles::IsOpen(void) const
     70{
     71    return this->fOpen;
     72}
     73
     74int DnDDroppedFiles::OpenEx(const char *pszPath, uint32_t fFlags)
     75{
     76    AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
    5277    AssertReturn(fFlags == 0, VERR_INVALID_PARAMETER); /* Flags not supported yet. */
    53     AssertPtrReturn(ppDir, VERR_INVALID_POINTER);
    54 
    55     PDNDDIRDROPPEDFILES pDir = (PDNDDIRDROPPEDFILES)RTMemAlloc(sizeof(DNDDIRDROPPEDFILES));
    56     if (pDir)
    57     {
    58         pDir->hDir  = NULL;
    59         pDir->fOpen = false;
    60 
    61         *ppDir = pDir;
    62         return VINF_SUCCESS;
    63     }
    64 
    65     return VERR_NO_MEMORY;
    66 }
    67 
    68 int DnDDirDroppedFilesCreateAndOpenEx(const char *pszPath, uint32_t fFlags, PDNDDIRDROPPEDFILES *ppDir)
    69 {
    70     AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
    71     AssertPtrReturn(ppDir, VERR_INVALID_POINTER);
    72 
    73     PDNDDIRDROPPEDFILES pDir;
    74     int rc = dndDirDroppedFilesCreate(fFlags, &pDir);
    75     if (RT_FAILURE(rc))
    76         return rc;
     78
     79    int rc;
    7780
    7881    do
    7982    {
    8083        char pszDropDir[RTPATH_MAX];
    81         if (RTStrPrintf(pszDropDir, sizeof(pszDropDir), "%s", pszPath) <= 0)
    82         {
    83             rc = VERR_NO_MEMORY;
    84             break;
    85         }
     84        size_t cchDropDir = RTStrPrintf(pszDropDir, sizeof(pszDropDir), "%s", pszPath);
    8685
    8786        /** @todo On Windows we also could use the registry to override
     
    9089
    9190        /* Append our base drop directory. */
    92         int rc = RTPathAppend(pszDropDir, sizeof(pszDropDir), "VirtualBox Dropped Files"); /** @todo Make this tag configurable? */
     91        rc = RTPathAppend(pszDropDir, sizeof(pszDropDir), "VirtualBox Dropped Files"); /** @todo Make this tag configurable? */
    9392        if (RT_FAILURE(rc))
    9493            break;
     
    128127            if (RT_SUCCESS(rc))
    129128            {
    130                 pDir->hDir       = phDir;
    131                 pDir->strPathAbs = pszDropDir;
    132                 pDir->fOpen      = true;
     129                this->hDir       = phDir;
     130                this->strPathAbs = pszDropDir;
     131                this->fOpen      = true;
    133132            }
    134133        }
     
    136135    } while (0);
    137136
    138     if (RT_SUCCESS(rc))
    139     {
    140         *ppDir = pDir;
    141     }
    142     else
    143         DnDDirDroppedFilesDestroy(pDir);
    144 
    145     return rc;
    146 }
    147 
    148 int DnDDirDroppedFilesCreateAndOpenTemp(uint32_t fFlags, PDNDDIRDROPPEDFILES *ppDir)
     137    return rc;
     138}
     139
     140int DnDDroppedFiles::OpenTemp(uint32_t fFlags)
    149141{
    150142    AssertReturn(fFlags == 0, VERR_INVALID_PARAMETER); /* Flags not supported yet. */
    151     AssertPtrReturn(ppDir, VERR_INVALID_POINTER);
    152 
    153     PDNDDIRDROPPEDFILES pDir;
    154143
    155144    /*
     
    161150    int rc = RTPathTemp(szTemp, sizeof(szTemp));
    162151    if (RT_SUCCESS(rc))
    163         rc = DnDDirDroppedFilesCreateAndOpenEx(szTemp, fFlags, &pDir);
    164 
     152        rc = OpenEx(szTemp, fFlags);
     153
     154    return rc;
     155}
     156
     157int DnDDroppedFiles::Reset(bool fRemoveDropDir)
     158{
     159    int rc = VINF_SUCCESS;
     160    if (this->fOpen)
     161    {
     162        rc = RTDirClose(this->hDir);
     163        if (RT_SUCCESS(rc))
     164        {
     165            this->fOpen = false;
     166            this->hDir  = NULL;
     167        }
     168    }
    165169    if (RT_SUCCESS(rc))
    166170    {
    167         *ppDir = pDir;
    168     }
    169     else
    170         DnDDirDroppedFilesDestroy(pDir);
    171 
    172     return rc;
    173 }
    174 
    175 void DnDDirDroppedFilesDestroy(PDNDDIRDROPPEDFILES pDir)
    176 {
    177     AssertPtrReturnVoid(pDir);
    178 
    179     RTMemFree(pDir);
    180 }
    181 
    182 int DnDDirDroppedFilesClose(PDNDDIRDROPPEDFILES pDir, bool fRemove)
    183 {
    184     AssertPtrReturn(pDir, VERR_INVALID_POINTER);
    185 
    186     int rc = VINF_SUCCESS;
    187     if (pDir->fOpen)
    188     {
    189         rc = RTDirClose(pDir->hDir);
    190         if (RT_SUCCESS(rc))
    191         {
    192             pDir->fOpen = false;
    193             pDir->hDir  = NULL;
    194         }
    195     }
    196     if (RT_SUCCESS(rc))
    197     {
    198         pDir->lstDirs.clear();
    199         pDir->lstFiles.clear();
    200 
    201         if (   fRemove
    202             && pDir->strPathAbs.isNotEmpty())
     171        this->lstDirs.clear();
     172        this->lstFiles.clear();
     173
     174        if (   fRemoveDropDir
     175            && this->strPathAbs.isNotEmpty())
    203176        {
    204177            /* Try removing the (empty) drop directory in any case. */
    205             rc = RTDirRemove(pDir->strPathAbs.c_str());
     178            rc = RTDirRemove(this->strPathAbs.c_str());
    206179            if (RT_SUCCESS(rc)) /* Only clear if successfully removed. */
    207                 pDir->strPathAbs = "";
    208         }
    209     }
    210 
    211     return rc;
    212 }
    213 
    214 const char *DnDDirDroppedFilesGetDirAbs(PDNDDIRDROPPEDFILES pDir)
    215 {
    216     AssertPtrReturn(pDir, NULL);
    217     return pDir->strPathAbs.c_str();
    218 }
    219 
    220 int DnDDirDroppedFilesRollback(PDNDDIRDROPPEDFILES pDir)
    221 {
    222     AssertPtrReturn(pDir, VERR_INVALID_POINTER);
    223 
    224     if (pDir->strPathAbs.isEmpty())
     180                this->strPathAbs = "";
     181        }
     182    }
     183
     184    return rc;
     185}
     186
     187int DnDDroppedFiles::Rollback(void)
     188{
     189    if (this->strPathAbs.isEmpty())
    225190        return VINF_SUCCESS;
     191
     192    Assert(this->fOpen);
     193    Assert(this->hDir != NULL);
    226194
    227195    int rc = VINF_SUCCESS;
     
    231199     * Note: Only remove empty directories, never ever delete
    232200     *       anything recursive here! Steam (tm) knows best ... :-) */
    233     for (size_t i = 0; i < pDir->lstFiles.size(); i++)
    234     {
    235         rc2 = RTFileDelete(pDir->lstFiles.at(i).c_str());
     201    for (size_t i = 0; i < this->lstFiles.size(); i++)
     202    {
     203        rc2 = RTFileDelete(this->lstFiles.at(i).c_str());
    236204        if (RT_SUCCESS(rc))
    237205            rc = rc2;
    238206    }
    239207
    240     for (size_t i = 0; i < pDir->lstDirs.size(); i++)
    241     {
    242         rc2 = RTDirRemove(pDir->lstDirs.at(i).c_str());
     208    for (size_t i = 0; i < this->lstDirs.size(); i++)
     209    {
     210        rc2 = RTDirRemove(this->lstDirs.at(i).c_str());
    243211        if (RT_SUCCESS(rc))
    244212            rc = rc2;
     
    246214
    247215    /* Try to remove the empty root dropped files directory as well. */
    248     rc2 = RTDirRemove(pDir->strPathAbs.c_str());
     216    rc2 = RTDirRemove(this->strPathAbs.c_str());
    249217    if (RT_SUCCESS(rc))
    250218        rc = rc2;
  • trunk/src/VBox/GuestHost/DragAndDrop/Makefile.kmk

    r55422 r57776  
    2020
    2121VBOX_DND_GUESTHOST_FILES := \
    22         DnDDir.cpp \
     22        DnDDroppedFiles.cpp \
    2323        DnDMIME.cpp \
    2424        DnDPath.cpp \
  • trunk/src/VBox/Main/include/GuestDnDPrivate.h

    r57654 r57776  
    138138{
    139139    GuestDnDURIData(void)
    140         : pDropDir(NULL)
    141         , pvScratchBuf(NULL)
     140        : pvScratchBuf(NULL)
    142141        , cbScratchBuf(0) { }
    143142
     
    159158    }
    160159
    161     void * GetBufferMutable(void) { return pvScratchBuf; }
    162 
    163     size_t GetBufferSize(void) { return cbScratchBuf; }
     160    const void *GetBuffer(void) const { return pvScratchBuf; }
     161
     162    void *GetBufferMutable(void) { return pvScratchBuf; }
     163
     164    size_t GetBufferSize(void) const { return cbScratchBuf; }
    164165
    165166    void Reset(void)
     
    168169        objCtx.Reset();
    169170
    170         if (pDropDir)
    171         {
    172             int rc2 = DnDDirDroppedFilesRollback(pDropDir);
    173             AssertRC(rc2);
    174             rc2 = DnDDirDroppedFilesClose(pDropDir, true /* fRemove */);
    175             AssertRC(rc2);
    176 
    177             DnDDirDroppedFilesDestroy(pDropDir);
    178             pDropDir = NULL;
    179         }
     171        int rc2 = droppedFiles.Rollback();
     172        AssertRC(rc2);
     173        rc2 = droppedFiles.Reset(true /* fRemoveDropDir */);
     174        AssertRC(rc2);
    180175
    181176        if (pvScratchBuf)
     
    188183    }
    189184
    190     /** Pointer to dropped files object. */
    191     PDNDDIRDROPPEDFILES             pDropDir;
     185    /** Handles all drop files for this operation. */
     186    DnDDroppedFiles                 droppedFiles;
    192187    /** (Non-recursive) List of URI objects to handle. */
    193188    DnDURIList                      lstURI;
  • trunk/src/VBox/Main/src-client/GuestDnDSourceImpl.cpp

    r57654 r57776  
    419419        if (fHasURIList)
    420420        {
    421             Utf8Str strURIs = pCtx->mURI.lstURI.RootToString(RTCString(DnDDirDroppedFilesGetDirAbs(pCtx->mURI.pDropDir)));
     421            const char *pszDroppedFilesDir = pCtx->mURI.droppedFiles.GetDirAbs();
     422            Utf8Str strURIs = pCtx->mURI.lstURI.RootToString(RTCString(pszDroppedFilesDir));
    422423            cbData = strURIs.length();
    423424
     
    604605
    605606    int rc;
    606     char *pszDir = RTPathJoinA(DnDDirDroppedFilesGetDirAbs(pCtx->mURI.pDropDir), pszPath);
     607
     608    const char *pszDroppedFilesDir = pCtx->mURI.droppedFiles.GetDirAbs();
     609    char *pszDir = RTPathJoinA(pszDroppedFilesDir, pszPath);
    607610    if (pszDir)
    608611    {
     
    662665        }
    663666
     667        const char *pszDroppedFilesDir = pCtx->mURI.droppedFiles.GetDirAbs();
     668
    664669        char pszPathAbs[RTPATH_MAX];
    665         rc = RTPathJoin(pszPathAbs, sizeof(pszPathAbs), DnDDirDroppedFilesGetDirAbs(pCtx->mURI.pDropDir), pszPath);
     670        rc = RTPathJoin(pszPathAbs, sizeof(pszPathAbs), pszDroppedFilesDir, pszPath);
    666671        if (RT_FAILURE(rc))
    667672        {
     
    10341039    REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_FILE_DATA);
    10351040
     1041    DnDDroppedFiles &droppedFiles = pCtx->mURI.droppedFiles;
     1042
    10361043    do
    10371044    {
    1038         rc = DnDDirDroppedFilesCreateAndOpenTemp(0 /* fFlags */, &pCtx->mURI.pDropDir);
     1045        rc = droppedFiles.OpenTemp(0 /* fFlags */);
    10391046        if (RT_FAILURE(rc))
    10401047            break;
    1041         LogFlowFunc(("rc=%Rrc, strDropDir=%s\n", rc, DnDDirDroppedFilesGetDirAbs(pCtx->mURI.pDropDir)));
     1048        LogFlowFunc(("rc=%Rrc, strDropDir=%s\n", rc, droppedFiles.GetDirAbs()));
    10421049        if (RT_FAILURE(rc))
    10431050            break;
     
    11001107    }
    11011108
    1102     if (pCtx->mURI.pDropDir)
    1103     {
    1104         if (RT_FAILURE(rc))
    1105         {
    1106             rc2 = DnDDirDroppedFilesRollback(pCtx->mURI.pDropDir); /** @todo Inform user on rollback failure? */
    1107             LogFlowFunc(("Rolling back ended with rc=%Rrc\n", rc2));
    1108         }
    1109 
    1110         rc2 = DnDDirDroppedFilesClose(pCtx->mURI.pDropDir, RT_FAILURE(rc) ? true : false /* fRemove */);
    1111         if (RT_SUCCESS(rc))
    1112             rc = rc2;
    1113 
    1114         DnDDirDroppedFilesDestroy(pCtx->mURI.pDropDir);
    1115         pCtx->mURI.pDropDir = NULL;
    1116     }
     1109    if (RT_FAILURE(rc))
     1110    {
     1111        rc2 = droppedFiles.Rollback(); /** @todo Inform user on rollback failure? */
     1112        LogFlowFunc(("Rolling back ended with rc=%Rrc\n", rc2));
     1113    }
     1114
     1115    rc2 = droppedFiles.Reset(RT_FAILURE(rc) ? true : false /* fRemoveDropDir */);
     1116    if (RT_SUCCESS(rc))
     1117        rc = rc2;
    11171118
    11181119    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