VirtualBox

儲存庫 vbox 的更動 18283


忽略:
時間撮記:
2009-3-25 下午09:26:21 (16 年 以前)
作者:
vboxsync
訊息:

OVF: make import and export cancellable

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Main/ApplianceImpl.cpp

    r18278 r18283  
    17151715                                                 pAppliance->m->ulWeightPerOperation);
    17161716
    1717             /* How many sub notifications are necessary? */
    1718             const float opCountMax = 100.0/5;
    1719             uint32_t opCount = 0;
    1720 
    17211717            /* Guest OS type */
    17221718            std::list<VirtualSystemDescriptionEntry*> vsdeOS;
     
    17541750
    17551751            if (!task->progress.isNull())
    1756                 rc = task->progress->setCurrentOperationProgress((uint32_t)(opCountMax * opCount++));
     1752                rc = task->progress->setCurrentOperationProgress(20);       // let's say 1/5 of the XML is done here
    17571753
    17581754            /* CPU count (ignored for now) */
     
    17781774
    17791775            if (!task->progress.isNull())
    1780                 task->progress->setCurrentOperationProgress((uint32_t)(opCountMax * opCount++));
     1776                rc = task->progress->setCurrentOperationProgress(40);       // let's say 2/5 of the XML is done here
    17811777
    17821778            /* Audio Adapter */
     
    18141810
    18151811            if (!task->progress.isNull())
    1816                 task->progress->setCurrentOperationProgress((uint32_t)(opCountMax * opCount++));
     1812                rc = task->progress->setCurrentOperationProgress(60);       // let's say 3/5 of the XML is done here
    18171813
    18181814            /* Change the network adapters */
     
    19271923
    19281924            if (!task->progress.isNull())
    1929                 task->progress->setCurrentOperationProgress((uint32_t)(opCountMax * opCount++));
     1925                rc = task->progress->setCurrentOperationProgress(80);       // let's say 4/5 of the XML is done here
    19301926
    19311927            /* CDROM drive */
     
    20132009
    20142010            if (!task->progress.isNull())
    2015                 task->progress->setCurrentOperationProgress((uint32_t)(opCountMax * opCount++));
     2011                rc = task->progress->setCurrentOperationProgress(90);
    20162012
    20172013            // store new machine for roll-back in case of errors
     
    20782074                            throw rc;
    20792075
    2080                         ComPtr<IProgress> progress;
     2076                        // subprogress object for hard disk
     2077                        ComPtr<IProgress> pProgress2;
    20812078
    20822079                        ComPtr<IHardDisk> dstHdVBox;
     
    20942091
    20952092                            /* Create a dynamic growing disk image with the given capacity */
    2096                             rc = dstHdVBox->CreateBaseStorage(di.iCapacity / _1M, HardDiskVariant_Standard, progress.asOutParam());
     2093                            rc = dstHdVBox->CreateBaseStorage(di.iCapacity / _1M, HardDiskVariant_Standard, pProgress2.asOutParam());
    20972094                            if (FAILED(rc)) throw rc;
    20982095
     
    21322129                            if (FAILED(rc)) throw rc;
    21332130                            /* Clone the source disk image */
    2134                             rc = srcHdVBox->CloneTo(dstHdVBox, HardDiskVariant_Standard, progress.asOutParam());
     2131                            rc = srcHdVBox->CloneTo(dstHdVBox, HardDiskVariant_Standard, pProgress2.asOutParam());
    21352132                            if (FAILED(rc)) throw rc;
    21362133
     
    21412138                        }
    21422139
    2143                         // now loop until the asynchronous operation completes and then
    2144                         // report its result
     2140                        // now loop until the asynchronous operation completes and then report its result
    21452141                        BOOL fCompleted;
     2142                        BOOL fCanceled;
    21462143                        ULONG currentPercent;
    2147                         while (SUCCEEDED(progress->COMGETTER(Completed(&fCompleted))))
     2144                        while (SUCCEEDED(pProgress2->COMGETTER(Completed(&fCompleted))))
    21482145                        {
    2149                             rc = progress->COMGETTER(Percent(&currentPercent));
     2146                            rc = task->progress->COMGETTER(Canceled)(&fCanceled);
    21502147                            if (FAILED(rc)) throw rc;
    2151                             if (!task->progress.isNull())
    2152                                 task->progress->setCurrentOperationProgress(currentPercent);
    2153                             if (fCompleted)
    2154                                 break;
     2148                            if (fCanceled)
     2149                                pProgress2->Cancel();
     2150                            else
     2151                            {
     2152                                rc = pProgress2->COMGETTER(Percent(&currentPercent));
     2153                                if (FAILED(rc)) throw rc;
     2154                                if (!task->progress.isNull())
     2155                                    task->progress->setCurrentOperationProgress(currentPercent);
     2156                                if (fCompleted)
     2157                                    break;
     2158                            }
    21552159                            /* Make sure the loop is not too tight */
    2156                             rc = progress->WaitForCompletion(100);
     2160                            rc = pProgress2->WaitForCompletion(100);
    21572161                            if (FAILED(rc)) throw rc;
    21582162                        }
    21592163                        // report result of asynchronous operation
    21602164                        HRESULT vrc;
    2161                         rc = progress->COMGETTER(ResultCode)(&vrc);
     2165                        rc = pProgress2->COMGETTER(ResultCode)(&vrc);
    21622166                        if (FAILED(rc)) throw rc;
    21632167
     
    21662170                        if (FAILED(vrc))
    21672171                        {
    2168                             ProgressErrorInfo info(progress);
     2172                            ProgressErrorInfo info(pProgress2);
    21692173                            Utf8Str str(info.getText());
    21702174                            const char *pcsz = str.c_str();
     
    30253029                                                     pDiskEntry->ulSizeMB);     // operation's weight, as set up with the IProgress originally);
    30263030
    3027                 // now loop until the asynchronous operation completes and then
    3028                 // report its result
     3031                // now loop until the asynchronous operation completes and then report its result
    30293032                BOOL fCompleted;
     3033                BOOL fCanceled;
    30303034                ULONG currentPercent;
    30313035                while (SUCCEEDED(pProgress2->COMGETTER(Completed(&fCompleted))))
    30323036                {
    3033                     rc = pProgress2->COMGETTER(Percent(&currentPercent));
     3037                    rc = task->progress->COMGETTER(Canceled)(&fCanceled);
    30343038                    if (FAILED(rc)) throw rc;
    3035                     if (!task->progress.isNull())
    3036                         task->progress->setCurrentOperationProgress(currentPercent);
    3037                     if (fCompleted)
    3038                         break;
    3039                     // make sure the loop is not too tight
     3039                    if (fCanceled)
     3040                        pProgress2->Cancel();
     3041                    else
     3042                    {
     3043                        rc = pProgress2->COMGETTER(Percent(&currentPercent));
     3044                        if (FAILED(rc)) throw rc;
     3045                        if (!task->progress.isNull())
     3046                            task->progress->setCurrentOperationProgress(currentPercent);
     3047                        if (fCompleted)
     3048                            break;
     3049                    }
     3050                    /* Make sure the loop is not too tight */
    30403051                    rc = pProgress2->WaitForCompletion(100);
    30413052                    if (FAILED(rc)) throw rc;
    30423053                }
    3043 
    30443054                // report result of asynchronous operation
    30453055                HRESULT vrc;
     
    32013211
    32023212/**
    3203  * Calculates the no. of operations for the IProgress objects in importMachines() and write().
     3213 * Sets up the given progress object so that it represents disk images accurately
     3214 * during importMachines() and write().
     3215 * @param pProgress
     3216 * @param bstrDescription
    32043217 * @return
    32053218 */
     
    32453258    else
    32463259    {
     3260        // no disks to export:
    32473261        ulTotalOperationsWeight = cFixed;
    32483262        m->ulWeightPerOperation = 1;
     
    32543268    rc = pProgress->init(mVirtualBox, static_cast<IAppliance*>(this),
    32553269                         bstrDescription,
    3256                          FALSE /* aCancelable */,
     3270                         TRUE /* aCancelable */,
    32573271                         cFixed + (ULONG)cDisks, // ULONG cOperations,
    32583272                         ulTotalOperationsWeight, // ULONG ulTotalOperationsWeight,
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette