00001
00080 #ifndef INC_MI32_MISTATUS_H
00081 #define INC_MI32_MISTATUS_H
00082
00083 #ifndef INC_MI32_MISYSTEM_H
00084 #include <mi32/misystem.h>
00085 #endif
00086
00087 #ifndef INC_MI32_CRITSEC_H
00088 #include <mi32/critsec.h>
00089 #endif
00090
00091 #ifndef INC_MI32_MILIST_H
00092 #include <mi32/milist.h>
00093 #endif
00094
00095 #ifndef INC_MI32_MTIMER_H
00096 #include <mi32/mtimer.h>
00097 #endif
00098
00099
00100 #ifdef MISYSTEMDLL
00101 #define CLASSLIBEXPORT MI_DLLCLASSEXPORT
00102 #else
00103 #define CLASSLIBEXPORT MI_DLLCLASSIMPORT
00104 #endif
00105
00106 class MISTATUSCONTEXT;
00107
00108
00109
00112 class CLASSLIBEXPORT MISTATUSMANAGER {
00113 public:
00114
00115 class SAVERESTORE {
00116 public:
00117 SAVERESTORE (
00118 ) : m_pManager(MISTATUSMANAGER::GetActiveManager()) { }
00119 ~SAVERESTORE (
00120 ) { MISTATUSMANAGER::SetActiveManager(m_pManager); }
00121 private:
00122 #ifndef GENERATING_DOXYGEN_OUTPUT
00123 MISTATUSMANAGER *m_pManager;
00124 SAVERESTORE (const SAVERESTORE&);
00125 SAVERESTORE& operator= (const SAVERESTORE&);
00126 #endif
00127 };
00128
00132 static MISTATUSMANAGER* GetActiveManager ();
00133
00138 static MISTATUSMANAGER* SetActiveManager (
00139 MISTATUSMANAGER *manager
00140 );
00141
00145 static void SetCreator (
00146 FastDelegate<MISTATUSMANAGER*()> DelegateCreateManager
00147 );
00148
00151 MISTATUSMANAGER ();
00152
00156 virtual ~MISTATUSMANAGER ();
00157
00159 MTIMER& GetTimer (
00160 ) { return (m_Timer); }
00161
00164 bool IsCancelled (
00165 );
00166
00169 bool ReportTimeElapsed (
00170 );
00171
00173 void ReportTimerValue (
00174 const MTIMER& timer
00175 ) { v_ReportTimerValue(timer); }
00176
00179 void ResetCancelled (
00180 );
00181
00183 void RestartTimer (
00184 ) { m_Timer.Clear(); m_Timer.Start(); }
00185
00187 void SetAsActive (
00188 ) { SetActiveManager(this); }
00189
00196
00197 void SetCancelEnabled (
00198 bool enabled
00199 );
00200
00201 protected:
00202 typedef MILIST<MISTATUSCONTEXT*> CONTEXTLIST;
00203
00205 class CLASSLIBEXPORT CONTEXT_PRIV {
00206 public:
00207 virtual ~CONTEXT_PRIV () = 0;
00208 };
00209
00211 void ClearContextList (
00212 );
00213
00215 const CONTEXTLIST& GetContextList (
00216 MITHREAD::CRITICALSECTION::LOCK& Lock
00217 ) const;
00218
00220 MISYSTEM::THREAD_ID GetCreatorThreadID (
00221 ) const { return (m_CreatorThreadID); }
00222
00224 bool IsCancelSet (
00225 ) const { return (m_IsCancelled); }
00226
00229 void ReportMessage (
00230 MISTATUSCONTEXT& context,
00231 const MISTRING& msgstr
00232 ) { v_ReportMessage(context,msgstr); }
00233
00236 void SetCancelled (
00237 );
00238
00239 private:
00240 #ifndef GENERATING_DOXYGEN_OUTPUT
00241 friend class MISTATUSCONTEXT;
00242 CONTEXTLIST m_ContextList;
00243 mutable MITHREAD::CRITICALSECTION m_ContextListSync;
00244 MISYSTEM::THREAD_ID m_CreatorThreadID;
00245 UINT32 m_CancelDisableCount;
00246 bool m_IsCancelled;
00247 MTIMER m_Timer;
00248 double m_LastElapsed;
00249
00254 static MISTATUSMANAGER* CreateManager ();
00255
00258 void ContextAttach (
00259 MISTATUSCONTEXT *pContext
00260 );
00261
00264 void ContextDetach (
00265 MISTATUSCONTEXT *pContext
00266 );
00267
00270 CONTEXT_PRIV* ContextPrivCreate (
00271 MISTATUSCONTEXT& Context
00272 ) { return (v_ContextPrivCreate(Context)); }
00273
00276 void ReportBegin (
00277 MISTATUSCONTEXT& context,
00278 const MISTRING& msgstr
00279 ) { v_ReportBegin(context,msgstr); }
00280
00283 void ReportEnd (
00284 MISTATUSCONTEXT& context,
00285 const MISTRING& msgstr,
00286 const MISTRING& timerstr
00287 ) { v_ReportEnd(context,msgstr,timerstr); }
00288
00291 void ReportProgress (
00292 MISTATUSCONTEXT& context,
00293 double pctdone
00294 ) { v_ReportProgress(context,pctdone); }
00295
00298 void UpdateUI (
00299 ) { v_UpdateUI(); }
00300
00301
00302 MISTATUSMANAGER (const MISTATUSMANAGER&);
00303 MISTATUSMANAGER& operator= (const MISTATUSMANAGER&);
00304 #endif // GENERATING_DOXYGEN_OUTPUT
00305
00308
00311 virtual CONTEXT_PRIV* v_ContextPrivCreate (
00312 MISTATUSCONTEXT& Context
00313 );
00314
00317 virtual bool v_IsCancelled (
00318 );
00319
00322 virtual void v_ReportBegin (
00323 MISTATUSCONTEXT& context,
00324 const MISTRING& msgstr
00325 );
00326
00329 virtual void v_ReportEnd (
00330 MISTATUSCONTEXT& context,
00331 const MISTRING& msgstr,
00332 const MISTRING& timerstr
00333 );
00334
00337 virtual void v_ReportMessage (
00338 MISTATUSCONTEXT& context,
00339 const MISTRING& msgstr
00340 );
00341
00344 virtual void v_ReportProgress (
00345 MISTATUSCONTEXT& context,
00346 double pctdone
00347 );
00348
00351 virtual void v_ReportTimerValue (
00352 const MTIMER& timer
00353 );
00354
00357 virtual void v_ResetCancelled (
00358 );
00359
00363 virtual void v_SetCancelEnabled (
00364 bool enabled
00365 );
00366
00369 virtual void v_UpdateUI (
00370 );
00371
00373 };
00374
00375
00376
00378 class CLASSLIBEXPORT MISTATUSLOGGER : public MISTATUSMANAGER {
00379 public:
00380
00382 MISTATUSLOGGER ();
00383
00385 virtual ~MISTATUSLOGGER ();
00386
00389 void SetLogDisabled (
00390 ) { ++m_LogDisableCount; }
00391
00393 void SetLogEnabled (
00394 ) { if (m_LogDisableCount) --m_LogDisableCount; }
00395
00396 protected:
00397
00401 virtual void v_ReportBegin (
00402 MISTATUSCONTEXT& context,
00403 const MISTRING& msgstr
00404 );
00405
00409 virtual void v_ReportEnd (
00410 MISTATUSCONTEXT& context,
00411 const MISTRING& msgstr,
00412 const MISTRING& timerstr
00413 );
00414
00417 virtual void v_ReportMessage (
00418 MISTATUSCONTEXT& context,
00419 const MISTRING& msgstr
00420 );
00421
00422 private:
00423 #ifndef GENERATING_DOXYGEN_OUTPUT
00424 UINT32 m_LogDisableCount;
00425
00426 MISTATUSLOGGER (const MISTATUSLOGGER&);
00427 MISTATUSLOGGER& operator= (const MISTATUSLOGGER&);
00428 #endif // GENERATING_DOXYGEN_OUTPUT
00429 };
00430
00431
00432
00469 class CLASSLIBEXPORT MISTATUSCONTEXT {
00470 public:
00471
00474 MISTATUSCONTEXT ();
00475
00477 MISTATUSCONTEXT (
00478 MISTATUSMANAGER *pStatusMgr,
00479 const MISTRING& taskstr,
00480 bool AllowCancel = true
00481 );
00482
00484 MISTATUSCONTEXT (
00485 const MISTRING& taskstr,
00486 bool AllowCancel = true,
00487 bool CreateMgrIfNoActive = false
00488 );
00489
00491 ~MISTATUSCONTEXT (
00492 );
00493
00496 ERRVALUE Create (
00497 MISTATUSMANAGER *pStatusMgr,
00498 const MISTRING& taskstr,
00499 bool AllowCancel = true
00500 ) { return (CreateLow(pStatusMgr,taskstr,AllowCancel,false)); }
00501
00504 ERRVALUE Create (
00505 const MISTRING& taskstr,
00506 bool AllowCancel = true,
00507 bool CreateMgrIfNoActive = false
00508 ) { return (CreateLow(MISTATUSMANAGER::GetActiveManager(),taskstr,AllowCancel,CreateMgrIfNoActive)); }
00509
00510 #ifndef GENERATING_DOXYGEN_OUTPUT
00513 void DetachMgr (
00514 ) { m_pStatusMgr = 0; m_IsCancelled = true; }
00515 #endif
00516
00519 MISTATUSMANAGER* GetManager (
00520 ) const { return (m_pStatusMgr); }
00521
00524 MISTATUSMANAGER::CONTEXT_PRIV* GetPriv (
00525 ) const { return (m_pPriv); }
00526
00528 bool HasManager (
00529 ) const { return (m_pStatusMgr != 0); }
00530
00532 bool IsCancelled (
00533 ) { return (m_IsCancelled || (m_IsCancelled = (m_pStatusMgr != 0 && m_pStatusMgr->IsCancelled()))); }
00534
00537 ERRVALUE ReportMessage (
00538 const MISTRING& msgstr
00539 ) { if (m_pStatusMgr != 0) m_pStatusMgr->ReportMessage(*this,msgstr); return (TestCancelled()); }
00540
00542 ERRVALUE ReportProgress (
00543 double pctdone = -1
00544 ) { ReportProgressNoCancel(pctdone); return (TestCancelled()); }
00545
00547 void ReportProgressNoCancel (
00548 double pctdone = -1
00549 ) { if (m_pStatusMgr != 0) m_pStatusMgr->ReportProgress(*this,pctdone); }
00550
00552 ERRVALUE ReportProgressBegin (
00553 UINT32 NumSteps
00554 );
00555
00557 ERRVALUE ReportProgressIncrement (
00558 INT32 IncSteps = 1
00559 ) { ReportProgressIncrementNoCancel(IncSteps); return (TestCancelled()); }
00560
00562 void ReportProgressIncrementNoCancel (
00563 INT32 IncSteps = 1
00564 ) { m_CurStep += IncSteps; if (m_pStatusMgr != 0) m_pStatusMgr->ReportProgress(*this,100.0*m_CurStep/m_NumSteps); }
00565
00568 void SetCancelled (
00569 ) { m_IsCancelled = true; }
00570
00571 private:
00572 #ifndef GENERATING_DOXYGEN_OUTPUT
00573 MISTATUSMANAGER *m_pStatusMgr;
00574 MISTATUSMANAGER::CONTEXT_PRIV *m_pPriv;
00575 MISTRING m_taskstr;
00576 MTIMER m_Timer;
00577 UINT32 m_NumSteps;
00578 INT32 m_CurStep;
00579 bool m_AllowCancel;
00580 bool m_OwnStatusMgr;
00581 bool m_IsCancelled;
00582
00583 ERRVALUE CreateLow (MISTATUSMANAGER *pStatusMgr, const MISTRING& taskstr, bool AllowCancel, bool CreateMgrIfNoneSet);
00584 void Initialize (bool CreateMgrIfNoneSet);
00585 ERRVALUE TestCancelled (
00586 ) { return ((m_AllowCancel && IsCancelled()) ? EUserCancel : 0); }
00587
00588
00589 MISTATUSCONTEXT (const MISTATUSCONTEXT&);
00590 MISTATUSCONTEXT& operator= (const MISTATUSCONTEXT&);
00591 #endif // GENERATING_DOXYGEN_OUTPUT
00592 };
00593
00594
00595
00596 #undef CLASSLIBEXPORT
00597
00598 #endif // INC_MI32_MISTATUS_H