Changeset 29932 in vbox
- Timestamp:
- Jun 1, 2010 1:40:07 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 62200
- Location:
- trunk/src/VBox/Main
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/MachineImpl.cpp
r29864 r29932 9841 9841 9842 9842 if (!mData->mSession.mProgress.isNull()) 9843 mData->mSession.mProgress->setOtherProgressObject(aProgress , 7);9843 mData->mSession.mProgress->setOtherProgressObject(aProgress); 9844 9844 9845 9845 return S_OK; … … 9863 9863 if (mData->mSession.mProgress) 9864 9864 { 9865 mData->mSession.mProgress->clearOtherProgressObject(tr("Finalizing"), 1);9866 9865 mData->mSession.mProgress->notifyComplete((HRESULT)iResult); 9867 9866 mData->mSession.mProgress.setNull(); -
trunk/src/VBox/Main/ProgressProxyImpl.cpp
r29859 r29932 46 46 HRESULT ProgressProxy::FinalConstruct() 47 47 { 48 mcOtherProgressObjects = 1; 49 miCurOtherProgressObject = 0; 48 mfMultiOperation = false; 49 muOtherProgressStartWeight = 0; 50 muOtherProgressWeight = 0; 51 muOtherProgressStartOperation = 0; 50 52 51 53 HRESULT rc = Progress::FinalConstruct(); … … 66 68 BOOL fCancelable) 67 69 { 68 miCurOtherProgressObject = 0; 69 mcOtherProgressObjects = 0; 70 mfMultiOperation = false; 71 muOtherProgressStartWeight = 1; 72 muOtherProgressWeight = 1; 73 muOtherProgressStartOperation = 1; 70 74 71 75 return Progress::init( … … 84 88 85 89 /** 86 * Initialize for proxying one or more other objects, assuming we start out and 87 * end without proxying anyone. 88 * 89 * The user must call clearOtherProgressObject when there are no more progress 90 * objects to be proxied or we'll leave threads waiting forever. 90 * Initialize for proxying one other progress object. 91 * 92 * This is tailored explicitly for the openRemoteSession code, so we start out 93 * with one operation where we don't have any remote object (powerUp). Then a 94 * remote object is added and stays with us till the end. 95 * 96 * The user must do normal completion notification or risk leave the threads 97 * waiting forever! 91 98 */ 92 99 HRESULT ProgressProxy::init( … … 97 104 CBSTR bstrDescription, 98 105 BOOL fCancelable, 99 ULONG cOtherProgressObjects,100 106 ULONG uTotalOperationsWeight, 101 107 CBSTR bstrFirstOperationDescription, 102 108 ULONG uFirstOperationWeight, 103 OUT_GUID pId) 104 { 105 miCurOtherProgressObject = 0; 106 mcOtherProgressObjects = cOtherProgressObjects; 109 ULONG cOtherProgressObjectOperations) 110 { 111 mfMultiOperation = false; 112 muOtherProgressStartWeight = uFirstOperationWeight; 113 muOtherProgressWeight = uTotalOperationsWeight - uFirstOperationWeight; 114 muOtherProgressStartOperation = 1; 107 115 108 116 return Progress::init( … … 113 121 bstrDescription, 114 122 fCancelable, 115 1 + cOtherProgressObject s + 1/* cOperations */,123 1 + cOtherProgressObjectOperations /* cOperations */, 116 124 uTotalOperationsWeight, 117 125 bstrFirstOperationDescription, 118 126 uFirstOperationWeight, 119 pId);127 NULL); 120 128 } 121 129 … … 123 131 { 124 132 uninit(); 125 miCurOtherProgressObject = 0; 133 mfMultiOperation = false; 134 muOtherProgressStartWeight = 0; 135 muOtherProgressWeight = 0; 136 muOtherProgressStartOperation = 0; 126 137 } 127 138 … … 175 186 /** Just a wrapper so we can automatically do the handover before setting 176 187 * the result locally. */ 177 bool 188 bool ProgressProxy::notifyPointOfNoReturn(void) 178 189 { 179 190 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); … … 188 199 * @returns false if failed/canceled, true if not. 189 200 * @param pOtherProgress The other progress object. Must not be NULL. 190 * @param uOperationWeight The weight of this operation. (The description191 * is taken from the other progress object.)192 201 */ 193 bool ProgressProxy::setOtherProgressObject(IProgress *pOtherProgress , ULONG uOperationWeight)194 { 195 LogFlowThisFunc(("setOtherProgressObject: %p %u\n", pOtherProgress, uOperationWeight));202 bool ProgressProxy::setOtherProgressObject(IProgress *pOtherProgress) 203 { 204 LogFlowThisFunc(("setOtherProgressObject: %p\n", pOtherProgress)); 196 205 ComPtr<IProgress> ptrOtherProgress = pOtherProgress; 197 206 198 /* Get the description first. */ 199 Bstr bstrOperationDescription; 200 HRESULT hrc = pOtherProgress->COMGETTER(Description)(bstrOperationDescription.asOutParam()); 207 /* 208 * Query information from the other progress object before we grab the 209 * lock. 210 */ 211 ULONG cOperations; 212 HRESULT hrc = pOtherProgress->COMGETTER(OperationCount)(&cOperations); 213 if (FAILED(hrc)) 214 cOperations = 1; 215 216 Bstr bstrOperationDescription; 217 hrc = pOtherProgress->COMGETTER(Description)(bstrOperationDescription.asOutParam()); 201 218 if (FAILED(hrc)) 202 219 bstrOperationDescription = "oops"; 203 220 221 222 /* 223 * Take the lock and check for cancelation, cancel the other object if 224 * we've been canceled already. 225 */ 204 226 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 205 227 206 /* Do the hand over from any previous progress object. */207 clearOtherProgressObjectInternal(false /*fEarly*/);208 228 BOOL fCompletedOrCanceled = mCompleted || mCanceled; 209 229 if (!fCompletedOrCanceled) 210 230 { 211 /* Advance to the next object and operation, checking for cancelation 212 and completion right away to be on the safe side. */ 213 Assert(miCurOtherProgressObject < mcOtherProgressObjects); 231 /* 232 * Advance to the next object and operation. If the other object has 233 * more operations than anticipated, adjust our internal count. 234 */ 214 235 mptrOtherProgress = ptrOtherProgress; 215 216 Progress::SetNextOperation(bstrOperationDescription, uOperationWeight); 217 236 mfMultiOperation = cOperations > 1; 237 238 muOtherProgressStartWeight = m_ulOperationsCompletedWeight + m_ulCurrentOperationWeight; 239 muOtherProgressWeight = m_ulTotalOperationsWeight - muOtherProgressStartWeight; 240 Progress::SetNextOperation(bstrOperationDescription, muOtherProgressWeight); 241 242 muOtherProgressStartOperation = m_ulCurrentOperation; 243 m_cOperations = cOperations + m_ulCurrentOperation; 244 245 /* 246 * Check for cancelation and completion. 247 */ 218 248 BOOL f; 219 249 hrc = ptrOtherProgress->COMGETTER(Completed)(&f); … … 233 263 else 234 264 { 235 /* Mirror the cancelable property. */ 265 /* 266 * Finally, mirror the cancelable property. 267 * Note! Note necessary if we do passthru! 268 */ 236 269 if (mCancelable) 237 270 { … … 257 290 } 258 291 259 /**260 * Clears the last other progress objects.261 *262 * @returns false if failed/canceled, true if not.263 * @param pszLastOperationDescription The description of the final bit.264 * @param uLastOperationWeight The weight of the final bit.265 */266 bool ProgressProxy::clearOtherProgressObject(const char *pszLastOperationDescription, ULONG uLastOperationWeight)267 {268 LogFlowThisFunc(("%p %u\n", pszLastOperationDescription, uLastOperationWeight));269 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);270 271 clearOtherProgressObjectInternal(false /* fEarly */);272 273 /* Advance to the next operation if applicable. */274 bool fCompletedOrCanceled = mCompleted || mCanceled;275 if (!fCompletedOrCanceled)276 Progress::SetNextOperation(Bstr(pszLastOperationDescription), uLastOperationWeight);277 278 LogFlowThisFunc(("Returns %RTbool\n", !fCompletedOrCanceled));279 return !fCompletedOrCanceled;280 }281 282 292 // Internal methods. 283 293 //////////////////////////////////////////////////////////////////////////////// … … 285 295 286 296 /** 287 * Internal version of clearOtherProgressObject that doesn't advance to the next 288 * operation. 289 * 290 * This is used both by clearOtherProgressObject as well as a number of places 291 * where we automatically do the hand over because of failure/completion. 297 * Clear the other progress object reference, first copying over its state. 298 * 299 * This is used internally when completion is signalled one way or another. 292 300 * 293 301 * @param fEarly Early clearing or not. … … 295 303 void ProgressProxy::clearOtherProgressObjectInternal(bool fEarly) 296 304 { 297 if ( !mptrOtherProgress.isNull())305 if (mptrOtherProgress.isNotNull()) 298 306 { 299 307 ComPtr<IProgress> ptrOtherProgress = mptrOtherProgress; 300 308 mptrOtherProgress.setNull(); 301 309 copyProgressInfo(ptrOtherProgress, fEarly); 302 303 miCurOtherProgressObject++;304 Assert(miCurOtherProgressObject <= mcOtherProgressObjects);305 310 } 306 311 } … … 413 418 //////////////////////////////////////////////////////////////////////////////// 414 419 420 STDMETHODIMP ProgressProxy::COMGETTER(Cancelable)(BOOL *aCancelable) 421 { 422 CheckComArgOutPointerValid(aCancelable); 423 424 AutoCaller autoCaller(this); 425 HRESULT hrc = autoCaller.rc(); 426 if (SUCCEEDED(hrc)) 427 { 428 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 429 430 /* ASSUME: The cancelable property can only change to FALSE. */ 431 if (!mCancelable || mptrOtherProgress.isNull()) 432 *aCancelable = mCancelable; 433 else 434 { 435 hrc = mptrOtherProgress->COMGETTER(Cancelable)(aCancelable); 436 if (SUCCEEDED(hrc) && !*aCancelable) 437 { 438 LogFlowThisFunc(("point-of-no-return reached\n")); 439 mCancelable = FALSE; 440 } 441 } 442 } 443 return hrc; 444 } 445 415 446 STDMETHODIMP ProgressProxy::COMGETTER(Percent)(ULONG *aPercent) 416 447 { 417 #if 0418 448 CheckComArgOutPointerValid(aPercent); 419 449 420 450 AutoCaller autoCaller(this); 421 451 HRESULT hrc = autoCaller.rc(); 422 if (SUCCEEDED( rc))423 { 424 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 425 426 if (mptrOtherProgress.isN ull())452 if (SUCCEEDED(hrc)) 453 { 454 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 455 456 if (mptrOtherProgress.isNotNull()) 427 457 hrc = Progress::COMGETTER(Percent)(aPercent); 428 458 else 429 459 { 460 /* 461 * Get the overall percent of the other object and adjust it with 462 * the weighting given to the period before proxying started. 463 */ 430 464 ULONG uPct; 431 465 hrc = mptrOtherProgress->COMGETTER(Percent)(&uPct); 432 .... 433 } 434 } 435 return hrc; 436 #else 437 return Progress::COMGETTER(Percent)(aPercent); 438 #endif 466 if (SUCCEEDED(hrc)) 467 { 468 double rdPercent = ((double)uPct / 100 * muOtherProgressWeight + muOtherProgressStartWeight) 469 / m_ulTotalOperationsWeight * 100; 470 *aPercent = RT_MIN((ULONG)rdPercent, 99); /* mptrOtherProgress is cleared when its completed, so we can never return 100%. */ 471 } 472 } 473 } 474 return hrc; 475 } 476 477 STDMETHODIMP ProgressProxy::COMGETTER(TimeRemaining)(LONG *aTimeRemaining) 478 { 479 CheckComArgOutPointerValid(aTimeRemaining); 480 481 AutoCaller autoCaller(this); 482 HRESULT hrc = autoCaller.rc(); 483 if (SUCCEEDED(hrc)) 484 { 485 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 486 487 if (mptrOtherProgress.isNotNull()) 488 hrc = Progress::COMGETTER(TimeRemaining)(aTimeRemaining); 489 else 490 hrc = mptrOtherProgress->COMGETTER(TimeRemaining)(aTimeRemaining); 491 } 492 return hrc; 439 493 } 440 494 441 495 STDMETHODIMP ProgressProxy::COMGETTER(Completed)(BOOL *aCompleted) 442 496 { 443 /* Not proxied since we EXPECT a hand backcall. */497 /* Not proxied since we EXPECT a normal completion notification call. */ 444 498 return Progress::COMGETTER(Completed)(aCompleted); 445 499 } … … 458 512 if ( SUCCEEDED(hrc) 459 513 && !*aCanceled 460 && !mptrOtherProgress.isNull()) 514 && mptrOtherProgress.isNotNull() 515 && mCancelable) 461 516 { 462 517 hrc = mptrOtherProgress->COMGETTER(Canceled)(aCanceled); 463 518 if (SUCCEEDED(hrc) && *aCanceled) 464 clearOtherProgressObjectInternal(true /*fEarly*/); 519 /* This will not complete the object, only mark it as canceled. */ 520 clearOtherProgressObjectInternal(false /*fEarly*/); 465 521 } 466 522 } … … 470 526 STDMETHODIMP ProgressProxy::COMGETTER(ResultCode)(LONG *aResultCode) 471 527 { 472 /* Not proxied yet since we EXPECT a hand backcall. */528 /* Not proxied since we EXPECT a normal completion notification call. */ 473 529 return Progress::COMGETTER(ResultCode)(aResultCode); 474 530 } … … 476 532 STDMETHODIMP ProgressProxy::COMGETTER(ErrorInfo)(IVirtualBoxErrorInfo **aErrorInfo) 477 533 { 478 /* Not proxied yet since we EXPECT a hand backcall. */534 /* Not proxied since we EXPECT a normal completion notification call. */ 479 535 return Progress::COMGETTER(ErrorInfo)(aErrorInfo); 480 536 } 481 537 538 STDMETHODIMP ProgressProxy::COMGETTER(Operation)(ULONG *aOperation) 539 { 540 CheckComArgOutPointerValid(aOperation); 541 542 AutoCaller autoCaller(this); 543 HRESULT hrc = autoCaller.rc(); 544 if (SUCCEEDED(hrc)) 545 { 546 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 547 if (mptrOtherProgress.isNull()) 548 hrc = Progress::COMGETTER(Operation)(aOperation); 549 else 550 { 551 ULONG uCurOtherOperation; 552 hrc = mptrOtherProgress->COMGETTER(Operation)(&uCurOtherOperation); 553 if (SUCCEEDED(hrc)) 554 *aOperation = uCurOtherOperation + muOtherProgressStartOperation; 555 } 556 } 557 return hrc; 558 } 559 560 STDMETHODIMP ProgressProxy::COMGETTER(OperationDescription)(BSTR *aOperationDescription) 561 { 562 CheckComArgOutPointerValid(aOperationDescription); 563 564 AutoCaller autoCaller(this); 565 HRESULT hrc = autoCaller.rc(); 566 if (SUCCEEDED(hrc)) 567 { 568 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 569 if (mptrOtherProgress.isNull() || !mfMultiOperation) 570 hrc = Progress::COMGETTER(OperationDescription)(aOperationDescription); 571 else 572 hrc = mptrOtherProgress->COMGETTER(OperationDescription)(aOperationDescription); 573 } 574 return hrc; 575 } 576 482 577 STDMETHODIMP ProgressProxy::COMGETTER(OperationPercent)(ULONG *aOperationPercent) 483 578 { 484 /* Not proxied, should be proxied later on. */ 485 return Progress::COMGETTER(OperationPercent)(aOperationPercent); 579 CheckComArgOutPointerValid(aOperationPercent); 580 581 AutoCaller autoCaller(this); 582 HRESULT hrc = autoCaller.rc(); 583 if (SUCCEEDED(hrc)) 584 { 585 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 586 if (mptrOtherProgress.isNull() || !mfMultiOperation) 587 hrc = Progress::COMGETTER(OperationPercent)(aOperationPercent); 588 else 589 hrc = mptrOtherProgress->COMGETTER(OperationPercent)(aOperationPercent); 590 } 591 return hrc; 486 592 } 487 593 … … 512 618 LogFlowThisFunc(("aTimeout=%d\n", aTimeout)); 513 619 514 /* For now we'll always block locally. */ 620 /* No need to wait on the proxied object for these since we'll get the 621 normal completion notifications. */ 515 622 hrc = Progress::WaitForCompletion(aTimeout); 516 623 … … 521 628 STDMETHODIMP ProgressProxy::WaitForOperationCompletion(ULONG aOperation, LONG aTimeout) 522 629 { 523 HRESULT hrc;524 630 LogFlowThisFuncEnter(); 525 631 LogFlowThisFunc(("aOperation=%d aTimeout=%d\n", aOperation, aTimeout)); 526 632 527 /* For now we'll always block locally. Later though, we could consider 528 blocking remotely when we can. */ 529 hrc = Progress::WaitForOperationCompletion(aOperation, aTimeout); 633 AutoCaller autoCaller(this); 634 HRESULT hrc = autoCaller.rc(); 635 if (SUCCEEDED(hrc)) 636 { 637 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 638 639 CheckComArgExpr(aOperation, aOperation < m_cOperations); 640 641 /* 642 * Check if we can wait locally. 643 */ 644 if ( aOperation + 1 == m_cOperations /* final operation */ 645 || mptrOtherProgress.isNull()) 646 { 647 /* ASSUMES that Progress::WaitForOperationCompletion is using 648 AutoWriteLock::leave() as it saves us from duplicating the code! */ 649 hrc = Progress::WaitForOperationCompletion(aOperation, aTimeout); 650 } 651 else 652 { 653 LogFlowThisFunc(("calling the other object...\n")); 654 ComPtr<IProgress> ptrOtherProgress = mptrOtherProgress; 655 alock.release(); 656 657 hrc = ptrOtherProgress->WaitForOperationCompletion(aOperation, aTimeout); 658 } 659 } 530 660 531 661 LogFlowThisFuncLeave(); … … 541 671 { 542 672 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 543 if (mCancelable) 544 { 545 if (!mptrOtherProgress.isNull()) 546 { 547 hrc = mptrOtherProgress->Cancel(); 548 if (SUCCEEDED(hrc)) 549 { 550 if (m_pfnCancelCallback) 551 m_pfnCancelCallback(m_pvCancelUserArg); 552 clearOtherProgressObjectInternal(true /*fEarly*/); 553 } 554 } 555 else 556 hrc = Progress::Cancel(); 557 } 558 else 559 hrc = setError(E_FAIL, tr("Operation cannot be canceled")); 673 if (mptrOtherProgress.isNull() || !mCancelable) 674 hrc = Progress::Cancel(); 675 else 676 { 677 hrc = mptrOtherProgress->Cancel(); 678 if (SUCCEEDED(hrc)) 679 clearOtherProgressObjectInternal(false /*fEarly*/); 680 } 560 681 } 561 682 -
trunk/src/VBox/Main/VirtualBoxImpl.cpp
r29874 r29932 1995 1995 E_INVALIDARG); 1996 1996 1997 /* get the teleporter enable state for the progress object init. */ 1998 BOOL fTeleporterEnabled; 1999 rc = machine->COMGETTER(TeleporterEnabled)(&fTeleporterEnabled); 2000 if (FAILED(rc)) 2001 return rc; 2002 1997 2003 /* create a progress object */ 1998 2004 ComObjPtr<ProgressProxy> progress; 1999 2005 progress.createObject(); 2000 2006 rc = progress->init(this, 2001 static_cast 2007 static_cast<IMachine *>(machine), 2002 2008 Bstr(tr("Spawning session")), 2003 2009 TRUE /* aCancelable */, 2004 1 /* cOtherProgressObjects */, 2005 10 /* uTotalOperationsWeight */, 2010 fTeleporterEnabled ? 20 : 10 /* uTotalOperationsWeight */, 2006 2011 Bstr(tr("Spawning session")), 2007 3/* uFirstOperationWeight */,2008 NULL /* pId*/);2012 2 /* uFirstOperationWeight */, 2013 fTeleporterEnabled ? 3 : 1 /* cOtherProgressObjectOperations */); 2009 2014 if (SUCCEEDED(rc)) 2010 2015 { … … 4521 4526 ComPtr<IVirtualBoxCallback> cbI; 4522 4527 ComPtr<IDispatch> cbD; 4523 4528 4524 4529 cbI = sp; 4525 4530 cbD = sp; 4526 4531 4527 4532 /** 4528 * Would be like this in ideal world, unfortunately our consumers want to be invoked via IDispatch, 4533 * Would be like this in ideal world, unfortunately our consumers want to be invoked via IDispatch, 4529 4534 * thus going the hard way. 4530 4535 */ 4531 #if 0 4536 #if 0 4532 4537 if (cbI != NULL) 4533 { 4538 { 4534 4539 HRESULT hrc = handleCallback(cbI); 4535 4540 if (hrc == VBOX_E_DONT_CALL_AGAIN) … … 4544 4549 4545 4550 ::VariantClear(&varResult); 4546 ::VariantClear(&arg1); 4551 ::VariantClear(&arg1); 4547 4552 ::VariantClear(&arg2); 4548 4553 4549 4554 VARIANTARG args[] = {arg1, arg2}; 4550 4555 DISPPARAMS disp = { args, NULL, sizeof(args)/sizeof(args[0]), 0}; 4551 4556 4552 4557 cbD->Invoke(dispid, IID_NULL, 4553 LOCALE_USER_DEFAULT, 4554 DISPATCH_METHOD, 4555 &disp, &varResult, 4558 LOCALE_USER_DEFAULT, 4559 DISPATCH_METHOD, 4560 &disp, &varResult, 4556 4561 NULL, NULL); 4557 4562 } -
trunk/src/VBox/Main/include/ProgressProxyImpl.h
r29862 r29932 59 59 CBSTR bstrDescription, 60 60 BOOL fCancelable, 61 ULONG cOtherProgressObjects,62 61 ULONG uTotalOperationsWeight, 63 62 CBSTR bstrFirstOperationDescription, 64 63 ULONG uFirstOperationWeight, 65 OUT_GUID pId = NULL);64 ULONG cOtherProgressObjectOperations); 66 65 void uninit(); 67 66 68 67 // IProgress properties 68 STDMETHOD(COMGETTER(Cancelable))(BOOL *aCancelable); 69 69 STDMETHOD(COMGETTER(Percent))(ULONG *aPercent); 70 STDMETHOD(COMGETTER(TimeRemaining))(LONG *aTimeRemaining); 70 71 STDMETHOD(COMGETTER(Completed))(BOOL *aCompleted); 71 72 STDMETHOD(COMGETTER(Canceled))(BOOL *aCanceled); 72 73 STDMETHOD(COMGETTER(ResultCode))(LONG *aResultCode); 73 74 STDMETHOD(COMGETTER(ErrorInfo))(IVirtualBoxErrorInfo **aErrorInfo); 75 //STDMETHOD(COMGETTER(OperationCount))(ULONG *aOperationCount); - not necessary 76 STDMETHOD(COMGETTER(Operation))(ULONG *aOperation); 77 STDMETHOD(COMGETTER(OperationDescription))(BSTR *aOperationDescription); 74 78 STDMETHOD(COMGETTER(OperationPercent))(ULONG *aOperationPercent); 75 79 STDMETHOD(COMSETTER(Timeout))(ULONG aTimeout); … … 92 96 const char *aText, ...); 93 97 bool notifyPointOfNoReturn(void); 94 bool setOtherProgressObject(IProgress *pOtherProgress, ULONG uOperationWeight); 95 bool clearOtherProgressObject(const char *pszLastOperationDescription, ULONG uLastOperationWeight); 98 bool setOtherProgressObject(IProgress *pOtherProgress); 96 99 97 100 /** For com::SupportErrorInfoImpl. */ … … 105 108 /** The other progress object. This can be NULL. */ 106 109 ComPtr<IProgress> mptrOtherProgress; 107 /** The number of other progress objects expected. */ 108 ULONG mcOtherProgressObjects; 109 /** The current other progress object. */ 110 ULONG miCurOtherProgressObject; 110 /** Set if the other progress object has multiple operations. */ 111 bool mfMultiOperation; 112 /** The weight the other progress object started at. */ 113 ULONG muOtherProgressStartWeight; 114 /** The weight of other progress object. */ 115 ULONG muOtherProgressWeight; 116 /** The operation number the other progress object started at. */ 117 ULONG muOtherProgressStartOperation; 111 118 112 119 };
Note:
See TracChangeset
for help on using the changeset viewer.