VirtualBox

Changeset 38420 in vbox


Ignore:
Timestamp:
Aug 11, 2011 2:30:48 PM (13 years ago)
Author:
vboxsync
Message:

Main-Clone: use new Medium::cloneToEx method

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

Legend:

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

    r38308 r38420  
    264264
    265265    HRESULT cloneToEx(const ComObjPtr<Medium> &aTarget, ULONG aVariant,
    266                       const ComObjPtr<Medium> &aParent, const ComObjPtr<Progress> &aProgress,
     266                      const ComObjPtr<Medium> &aParent, IProgress **aProgress,
    267267                      uint32_t idxSrcImageSame, uint32_t idxDstImageSame);
    268268
  • trunk/src/VBox/Main/src-server/MachineImplCloneVM.cpp

    r38264 r38420  
    3939    Utf8Str                 strBaseName;
    4040    ComPtr<IMedium>         pMedium;
     41    uint32_t                uIdx;
    4142    ULONG                   uWeight;
    4243} MEDIUMTASK;
     
    278279
    279280            MEDIUMTASK mt;
     281            mt.uIdx = UINT32_MAX; /* No read/write optimization possible. */
    280282
    281283            /* Save the base name. */
     
    386388
    387389                MEDIUMTASK mt;
     390                mt.uIdx    = UINT32_MAX;
    388391                mt.pMedium = pSrcMedium;
    389392                mt.uWeight = (lSize + _1M - 1) / _1M;
     
    400403        rc = addSaveState(machine, uCount, uTotalWeight);
    401404        if (FAILED(rc)) return rc;
     405    }
     406    /* Build up the index list of the image chain. Unfortunately we can't do
     407     * that in the previous loop, cause there we go from child -> parent and
     408     * didn't know how many are between. */
     409    for (size_t i = 0; i < llMedias.size(); ++i)
     410    {
     411        uint32_t uIdx = 0;
     412        MEDIUMTASKCHAIN &mtc = llMedias.at(i);
     413        for (size_t a = mtc.chain.size(); a > 0; --a)
     414            mtc.chain[a - 1].uIdx = ++uIdx;
    402415    }
    403416#ifdef DEBUG_poetzsch
     
    509522                /* Save the current medium, for later cloning. */
    510523                MEDIUMTASK mt;
     524                mt.uIdx    = UINT32_MAX;
    511525                mt.pMedium = pSrcMedium;
    512526                mt.uWeight = (lSize + _1M - 1) / _1M;
     
    525539        rc = addSaveState(machine, uCount, uTotalWeight);
    526540        if (FAILED(rc)) return rc;
     541    }
     542    /* Build up the index list of the image chain. Unfortunately we can't do
     543     * that in the previous loop, cause there we go from child -> parent and
     544     * didn't know how many are between. */
     545    for (size_t i = 0; i < llMedias.size(); ++i)
     546    {
     547        uint32_t uIdx = 0;
     548        MEDIUMTASKCHAIN &mtc = llMedias.at(i);
     549        for (size_t a = mtc.chain.size(); a > 0; --a)
     550            mtc.chain[a - 1].uIdx = ++uIdx;
    527551    }
    528552
     
    10021026            const MEDIUMTASKCHAIN &mtc = d->llMedias.at(i);
    10031027            ComObjPtr<Medium> pNewParent;
     1028            uint32_t uSrcParentIdx = UINT32_MAX;
     1029            uint32_t uTrgParentIdx = UINT32_MAX;
    10041030            for (size_t a = mtc.chain.size(); a > 0; --a)
    10051031            {
     
    11341160                        /* Do the disk cloning. */
    11351161                        ComPtr<IProgress> progress2;
    1136                         rc = pMedium->CloneTo(pTarget,
    1137                                               srcVar,
    1138                                               pNewParent,
    1139                                               progress2.asOutParam());
     1162
     1163                        ComObjPtr<Medium> pLMedium = static_cast<Medium*>((IMedium*)pMedium);
     1164                        rc = pLMedium->cloneToEx(pTarget,
     1165                                                 srcVar,
     1166                                                 pNewParent,
     1167                                                 progress2.asOutParam(),
     1168                                                 uSrcParentIdx,
     1169                                                 uTrgParentIdx);
    11401170                        if (FAILED(rc)) throw rc;
    11411171
     
    11771207                    }
    11781208                }
     1209                /* Save the current source medium index as the new parent
     1210                 * medium index. */
     1211                uSrcParentIdx = mt.uIdx;
     1212                /* Simply increase the target index. */
     1213                ++uTrgParentIdx;
    11791214            }
    11801215
  • trunk/src/VBox/Main/src-server/MediumImpl.cpp

    r38397 r38420  
    51095109 */
    51105110HRESULT Medium::cloneToEx(const ComObjPtr<Medium> &aTarget, ULONG aVariant,
    5111                           const ComObjPtr<Medium> &aParent, const ComObjPtr<Progress> &aProgress,
     5111                          const ComObjPtr<Medium> &aParent, IProgress **aProgress,
    51125112                          uint32_t idxSrcImageSame, uint32_t idxDstImageSame)
    51135113{
    51145114    CheckComArgNotNull(aTarget);
    5115     AssertReturn(!aProgress.isNull(), E_INVALIDARG);
     5115    CheckComArgOutPointerValid(aProgress);
    51165116    ComAssertRet(aTarget != this, E_INVALIDARG);
    51175117
     
    51915191
    51925192        /* setup task object to carry out the operation asynchronously */
    5193         pTask = new Medium::CloneTask(this, aProgress, aTarget,
     5193        pTask = new Medium::CloneTask(this, pProgress, aTarget,
    51945194                                      (MediumVariant_T)aVariant,
    51955195                                      aParent, idxSrcImageSame,
     
    52075207
    52085208    if (SUCCEEDED(rc))
     5209    {
    52095210        rc = startThread(pTask);
     5211
     5212        if (SUCCEEDED(rc))
     5213            pProgress.queryInterfaceTo(aProgress);
     5214    }
    52105215    else if (pTask != NULL)
    52115216        delete pTask;
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