VirtualBox

Changeset 72045 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Apr 26, 2018 3:39:10 PM (7 years ago)
Author:
vboxsync
Message:

Guest Control/Main: CopyTo/CopyFrom bugfixes.

Location:
trunk/src/VBox/Main
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/GuestSessionImplTasks.h

    r72001 r72045  
    173173    }
    174174
    175     const ComObjPtr<Progress>& GetProgressObject() const { return mProgress; }
    176 
    177     const ComObjPtr<GuestSession>& GetSession() const { return mSession; }
     175    const ComObjPtr<Progress>& GetProgressObject(void) const { return mProgress; }
     176
     177    const ComObjPtr<GuestSession>& GetSession(void) const { return mSession; }
    178178
    179179protected:
  • trunk/src/VBox/Main/src-client/GuestSessionImpl.cpp

    r72007 r72045  
    812812
    813813    }
    814     catch(std::bad_alloc &)
     814    catch (std::bad_alloc &)
    815815    {
    816816        hrc = E_OUTOFMEMORY;
    817817    }
    818     catch(HRESULT eHR)
     818    catch (HRESULT eHR)
    819819    {
    820820        hrc = eHR;
    821         LogFlowThisFunc(("Exception was caught in the function\n"));
    822     }
    823 
     821    }
     822
     823    LogFlowFunc(("Returning %Rhrc\n", hrc));
    824824    return hrc;
    825825}
     
    913913
    914914    }
    915     catch(std::bad_alloc &)
     915    catch (std::bad_alloc &)
    916916    {
    917917        hrc = E_OUTOFMEMORY;
    918918    }
    919     catch(HRESULT eHR)
     919    catch (HRESULT eHR)
    920920    {
    921921        hrc = eHR;
    922         LogFlowThisFunc(("Exception was caught in the function\n"));
    923     }
    924 
     922    }
     923
     924    LogFlowFunc(("Returning %Rhrc\n", hrc));
    925925    return hrc;
    926926}
  • trunk/src/VBox/Main/src-client/GuestSessionImplTasks.cpp

    r72023 r72045  
    124124}
    125125
    126 
    127126int GuestSessionTask::getGuestProperty(const ComObjPtr<Guest> &pGuest,
    128127                                       const Utf8Str &strPath, Utf8Str &strValue)
     
    213212 * Creates a directory on the guest.
    214213 *
    215  * @return VBox status code. VWRN_ALREADY_EXISTS if directory on the guest already exists.
     214 * @return VBox status code. VERR_ALREADY_EXISTS if directory on the guest already exists.
    216215 * @param  strPath                  Absolute path to directory on the guest (guest style path) to create.
    217216 * @param  enmDirectoryCreateFlags  Directory creation flags.
     
    229228    if (RT_SUCCESS(rc))
    230229    {
    231         return VWRN_ALREADY_EXISTS;
     230        return VERR_ALREADY_EXISTS;
    232231    }
    233232    else
     
    747746                if (   !strDest.endsWith("\\")
    748747                    && !strDest.endsWith("/"))
    749                     RTStrCat(szDstPath, sizeof(szDstPath), mPathStyle.c_str());
     748                    RTStrCat(szDstPath, sizeof(szDstPath), "/");
    750749
    751750                RTStrCat(szDstPath, sizeof(szDstPath), RTPathFilename(strSource.c_str()));
     
    985984        if (   !mSrcRootAbs.endsWith("/")
    986985            && !mSrcRootAbs.endsWith("\\"))
    987             mSrcRootAbs += mSourceSpec.enmPathStyle == PathStyle_DOS ? "\\" : "/";
     986            mSrcRootAbs += "/";
    988987
    989988        if (   !mDstRootAbs.endsWith("/")
     
    10291028    if (   !strPathAbs.endsWith("/")
    10301029        && !strPathAbs.endsWith("\\"))
    1031         strPathAbs += mSourceSpec.enmPathStyle == PathStyle_DOS ? "\\" : "/";
     1030        strPathAbs += "/";
    10321031
    10331032    Utf8Str strPathSub = strSubDir;
     
    10351034        && !strPathSub.endsWith("/")
    10361035        && !strPathSub.endsWith("\\"))
    1037         strPathSub += mSourceSpec.enmPathStyle == PathStyle_DOS ? "\\" : "/";
     1036        strPathSub += "/";
    10381037
    10391038    strPathAbs += strPathSub;
     
    11291128            }
    11301129        }
     1130
     1131        if (rc == VERR_NO_MORE_FILES) /* End of listing reached? */
     1132            rc = VINF_SUCCESS;
    11311133    }
    11321134
     
    13591361
    13601362    ULONG cOperations = 0;
     1363    Utf8Str strErrorInfo;
     1364
     1365    /**
     1366     * Note: We need to build up the file/directory here instead of GuestSessionTaskCopyFrom::Run
     1367     *       because the caller expects a ready-for-operation progress object on return.
     1368     *       The progress object will have a variable operation count, based on the elements to
     1369     *       be processed.
     1370     */
    13611371
    13621372    GuestSessionFsSourceSet::iterator itSrc = mSources.begin();
     
    13751385                if (   !strDst.endsWith("/")
    13761386                    && !strDst.endsWith("\\"))
    1377                     strDst += mPathStyle;
     1387                    strDst += "/";
    13781388
    13791389                strDst += Utf8StrFmt("%s", RTPathFilenameEx(strSrc.c_str(), mfPathStyle));
    13801390            }
    13811391        }
     1392
     1393        LogFlowFunc(("strSrc=%s, strDst=%s\n", strSrc.c_str(), strDst.c_str()));
    13821394
    13831395        GuestFsObjData srcObjData; int rcGuest;
     
    13861398        if (RT_FAILURE(rc))
    13871399        {
     1400            strErrorInfo = Utf8StrFmt(GuestSession::tr("No such source file/directory: %s"), strSrc.c_str());
    13881401            break;
    13891402        }
     
    13931406            if (itSrc->enmType != FsObjType_Directory)
    13941407            {
     1408                strErrorInfo = Utf8StrFmt(GuestSession::tr("Source is not a file: %s"), strSrc.c_str());
    13951409                rc = VERR_NOT_A_FILE;
    13961410                break;
     
    14011415            if (itSrc->enmType != FsObjType_File)
    14021416            {
     1417                strErrorInfo = Utf8StrFmt(GuestSession::tr("Source is not a directory: %s"), strSrc.c_str());
    14031418                rc = VERR_NOT_A_DIRECTORY;
    14041419                break;
    14051420            }
    14061421        }
    1407 
    1408         LogFlowFunc(("strSrc=%s, strDst=%s\n", strSrc.c_str(), strDst.c_str()));
    1409 
    1410 #if 0
    1411         if (itSrc->enmType == FsObjType_Directory)
    1412         {
    1413             bool fDstExists = RTDirExists(strDstDir.c_str());
    1414             if (fDstExists)
    1415             {
    1416                 if (!(itSrc->Type.Dir.fCopyFlags & DirectoryCopyFlag_CopyIntoExisting))
    1417                 {
    1418                     setProgressErrorMsg(VBOX_E_IPRT_ERROR,
    1419                                         Utf8StrFmt(GuestSession::tr("Destination directory \"%s\" exists when it must not"), mDest.c_str()));
    1420                     rc = VERR_ALREADY_EXISTS;
    1421                     break;
    1422                 }
    1423             }
    1424 
    1425             if (   !strSrcDir.endsWith("/")
    1426                 && !strSrcDir.endsWith("\\"))
    1427             {
    1428                 if (   !strDstDir.endsWith("/")
    1429                     && !strDstDir.endsWith("\\"))
    1430                         strDstDir += "/"; /* IPRT can handle / on all hosts. */
    1431 
    1432                 strDstDir += Utf8StrFmt("%s", RTPathFilenameEx(strSrcDir.c_str(), mfPathStyle));
    1433             }
    1434 
    1435             /* Create the final target directory on the host.
    1436              * The target directory might already exist on the host (which can be controlled by the copy flags). */
    1437             fDstExists = RTDirExists(strDstDir.c_str());
    1438             if (fDstExists)
    1439             {
    1440                 if (!(itSrc->Type.Dir.fCopyFlags & DirectoryCopyFlag_CopyIntoExisting))
    1441                 {
    1442                     setProgressErrorMsg(VBOX_E_IPRT_ERROR,
    1443                                         Utf8StrFmt(GuestSession::tr("Destination directory \"%s\" exists when it must not"), strDstDir.c_str()));
    1444                     rc = VERR_ALREADY_EXISTS;
    1445                     break;
    1446                 }
    1447             }
    1448             else
    1449             {
    1450                 rc = RTDirCreate(strDstDir.c_str(), fDirMode, 0);
    1451                 if (RT_FAILURE(rc))
    1452                 {
    1453                     setProgressErrorMsg(VBOX_E_IPRT_ERROR,
    1454                                         Utf8StrFmt(GuestSession::tr("Error creating destination directory \"%s\", rc=%Rrc"),
    1455                                                    strDstDir.c_str(), rc));
    1456                     break;
    1457                 }
    1458             }
    1459         }
    1460         else if (itSrc->enmType == FsObjType_File)
    1461         {
    1462 
    1463         }
    1464         else
    1465             AssertFailed();
    1466 #endif
    14671422
    14681423        FsList *pFsList = NULL;
     
    14841439            {
    14851440                delete pFsList;
     1441                strErrorInfo = Utf8StrFmt(GuestSession::tr("Error adding source '%s' to list: %Rrc"), strSrc.c_str(), rc);
    14861442                break;
    14871443            }
     
    15011457    }
    15021458
    1503     if (RT_SUCCESS(rc))
    1504     {
    1505         Utf8Str strFirstOp;
    1506         if (cOperations) /* Use the first element as description (if available). */
    1507         {
    1508             Assert(mVecLists.size());
    1509             Assert(mVecLists[0]->mVecEntries.size());
    1510 
    1511             strFirstOp = mDest + mVecLists[0]->mVecEntries[0]->strPath;
    1512         }
    1513 
     1459    if (cOperations) /* Use the first element as description (if available). */
     1460    {
     1461        Assert(mVecLists.size());
     1462        Assert(mVecLists[0]->mVecEntries.size());
     1463
     1464        Utf8Str strFirstOp = mDest + mVecLists[0]->mVecEntries[0]->strPath;
    15141465        hr = pProgress->init(static_cast<IGuestSession*>(mSession), Bstr(mDesc).raw(),
    15151466                             TRUE /* aCancelable */, cOperations + 1 /* Number of operations */,
    15161467                             Bstr(strFirstOp).raw());
    15171468    }
    1518 
     1469    else /* If no operations have been defined, go with an "empty" progress object when will be used for error handling. */
     1470        hr = pProgress->init(static_cast<IGuestSession*>(mSession), Bstr(mDesc).raw(),
     1471                             TRUE /* aCancelable */, 1 /* cOperations */, Bstr(mDesc).raw());
     1472
     1473    if (RT_FAILURE(rc))
     1474    {
     1475        Assert(strErrorInfo.isNotEmpty());
     1476        setProgressErrorMsg(VBOX_E_IPRT_ERROR, strErrorInfo);
     1477    }
     1478
     1479    LogFlowFunc(("Returning %Rhrc (%Rrc)\n", hr, rc));
    15191480    return rc;
    15201481}
     
    15631524                strSrcAbs += pEntry->strPath;
    15641525                strDstAbs += pEntry->strPath;
    1565             }
    1566 
    1567             LogFlowFunc(("Entry '%s': %s -> %s\n", pEntry->strPath.c_str(), strSrcAbs.c_str(), strDstAbs.c_str()));
     1526
     1527                if (pList->mSourceSpec.enmPathStyle == PathStyle_DOS)
     1528                    strDstAbs.findReplace('\\', '/');
     1529            }
    15681530
    15691531            switch (pEntry->fMode & RTFS_TYPE_MASK)
    15701532            {
    15711533                case RTFS_TYPE_DIRECTORY:
     1534                    LogFlowFunc(("Directory '%s': %s -> %s\n", pEntry->strPath.c_str(), strSrcAbs.c_str(), strDstAbs.c_str()));
    15721535                    if (!pList->mSourceSpec.fDryRun)
    15731536                    {
     
    15771540                            if (!fCopyIntoExisting)
    15781541                            {
     1542                                setProgressErrorMsg(VBOX_E_IPRT_ERROR,
     1543                                                    Utf8StrFmt(GuestSession::tr("Destination directory \"%s\" already exists"),
     1544                                                               strDstAbs.c_str()));
    15791545                                break;
    15801546                            }
     
    15891555
    15901556                case RTFS_TYPE_FILE:
     1557                    LogFlowFunc(("File '%s': %s -> %s\n", pEntry->strPath.c_str(), strSrcAbs.c_str(), strDstAbs.c_str()));
    15911558                    if (!pList->mSourceSpec.fDryRun)
    15921559                        rc = fileCopyFromGuest(strSrcAbs, strDstAbs, FileCopyFlag_None);
     
    16501617
    16511618    ULONG cOperations = 0;
     1619    Utf8Str strErrorInfo;
     1620
     1621    /**
     1622     * Note: We need to build up the file/directory here instead of GuestSessionTaskCopyTo::Run
     1623     *       because the caller expects a ready-for-operation progress object on return.
     1624     *       The progress object will have a variable operation count, based on the elements to
     1625     *       be processed.
     1626     */
    16521627
    16531628    GuestSessionFsSourceSet::iterator itSrc = mSources.begin();
     
    16661641                if (   !strDst.endsWith("/")
    16671642                    && !strDst.endsWith("\\"))
    1668                     strDst += mPathStyle;
     1643                    strDst += "/";
    16691644
    16701645                strDst += Utf8StrFmt("%s", RTPathFilenameEx(strSrc.c_str(), mfPathStyle));
    16711646            }
    16721647        }
     1648
     1649        LogFlowFunc(("strSrc=%s, strDst=%s\n", strSrc.c_str(), strDst.c_str()));
    16731650
    16741651        RTFSOBJINFO srcFsObjInfo;
    16751652        rc = RTPathQueryInfo(strSrc.c_str(), &srcFsObjInfo, RTFSOBJATTRADD_NOTHING);
    16761653        if (RT_FAILURE(rc))
     1654        {
     1655            strErrorInfo = Utf8StrFmt(GuestSession::tr("No such source file/directory: %s"), strSrc.c_str());
    16771656            break;
     1657        }
    16781658
    16791659        if (RTFS_IS_DIRECTORY(srcFsObjInfo.Attr.fMode))
     
    16811661            if (itSrc->enmType != FsObjType_Directory)
    16821662            {
     1663                strErrorInfo = Utf8StrFmt(GuestSession::tr("Source is not a file: %s"), strSrc.c_str());
    16831664                rc = VERR_NOT_A_FILE;
    16841665                break;
     
    16891670            if (itSrc->enmType == FsObjType_Directory)
    16901671            {
     1672                strErrorInfo = Utf8StrFmt(GuestSession::tr("Source is not a directory: %s"), strSrc.c_str());
    16911673                rc = VERR_NOT_A_DIRECTORY;
    16921674                break;
    16931675            }
    16941676        }
    1695 
    1696         LogFlowFunc(("strSrc=%s, strDst=%s\n", strSrc.c_str(), strDst.c_str()));
    16971677
    16981678        FsList *pFsList = NULL;
     
    17121692
    17131693            if (RT_FAILURE(rc))
    1714                 break;
     1694            {
     1695                delete pFsList;
     1696                strErrorInfo = Utf8StrFmt(GuestSession::tr("Error adding source '%s' to list: %Rrc"), strSrc.c_str(), rc);
     1697                break;
     1698            }
    17151699
    17161700            mVecLists.push_back(pFsList);
     
    17281712    }
    17291713
    1730     if (RT_SUCCESS(rc))
    1731     {
    1732         Utf8Str strFirstOp;
    1733         if (cOperations) /* Use the first element as description (if available). */
    1734         {
    1735             Assert(mVecLists.size());
    1736             Assert(mVecLists[0]->mVecEntries.size());
    1737 
    1738             strFirstOp = mDest + mVecLists[0]->mVecEntries[0]->strPath;
    1739         }
     1714    if (cOperations) /* Use the first element as description (if available). */
     1715    {
     1716        Assert(mVecLists.size());
     1717        Assert(mVecLists[0]->mVecEntries.size());
     1718
     1719        Utf8Str strFirstOp = mDest + mVecLists[0]->mVecEntries[0]->strPath;
    17401720
    17411721        hr = pProgress->init(static_cast<IGuestSession*>(mSession), Bstr(mDesc).raw(),
     
    17431723                             Bstr(strFirstOp).raw());
    17441724    }
    1745 
    1746     LogFlowFunc(("rc=%Rrc\n", rc));
     1725    else /* If no operations have been defined, go with an "empty" progress object when will be used for error handling. */
     1726        hr = pProgress->init(static_cast<IGuestSession*>(mSession), Bstr(mDesc).raw(),
     1727                             TRUE /* aCancelable */, 1 /* cOperations */, Bstr(mDesc).raw());
     1728
     1729    if (RT_FAILURE(rc))
     1730    {
     1731        Assert(strErrorInfo.isNotEmpty());
     1732        setProgressErrorMsg(VBOX_E_IPRT_ERROR, strErrorInfo);
     1733    }
     1734
     1735    LogFlowFunc(("Returning %Rhrc (%Rrc)\n", hr, rc));
    17471736    return hr;
    17481737}
     
    17941783            }
    17951784
    1796             LogFlowFunc(("Entry '%s': %s -> %s\n", pEntry->strPath.c_str(), strSrcAbs.c_str(), strDstAbs.c_str()));
    1797 
    17981785            switch (pEntry->fMode & RTFS_TYPE_MASK)
    17991786            {
    18001787                case RTFS_TYPE_DIRECTORY:
     1788                    LogFlowFunc(("Directory '%s': %s -> %s\n", pEntry->strPath.c_str(), strSrcAbs.c_str(), strDstAbs.c_str()));
    18011789                    if (!pList->mSourceSpec.fDryRun)
    18021790                    {
    18031791                        rc = directoryCreate(strDstAbs.c_str(), DirectoryCreateFlag_None, fDirMode, fFollowSymlinks);
    1804                         if (   rc == VWRN_ALREADY_EXISTS
     1792                        if (   rc == VERR_ALREADY_EXISTS
    18051793                            && !fCopyIntoExisting)
    18061794                        {
     1795                            setProgressErrorMsg(VBOX_E_IPRT_ERROR,
     1796                                                Utf8StrFmt(GuestSession::tr("Destination directory \"%s\" already exists"),
     1797                                                           strDstAbs.c_str()));
    18071798                            break;
    18081799                        }
     
    18111802
    18121803                case RTFS_TYPE_FILE:
     1804                    LogFlowFunc(("File '%s': %s -> %s\n", pEntry->strPath.c_str(), strSrcAbs.c_str(), strDstAbs.c_str()));
    18131805                    if (!pList->mSourceSpec.fDryRun)
    18141806                        rc = fileCopyToGuest(strSrcAbs, strDstAbs, FileCopyFlag_None);
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