00001 #ifndef _Q_BASE_MODULE_H_
00002 #define _Q_BASE_MODULE_H_
00003
00019 #include <string>
00020 #include <stdarg.h>
00021
00022 #include "QMessage.hh"
00023 #include "QCuore.hh"
00024 #include "QNamed.hh"
00025 #include "QSequence.hh"
00026 #include "QGeneralFactory.hh"
00027 #include "QBaseModuleFactory.hh"
00028
00029
00030 namespace Cuore {class QEvent;}
00031
00032 class QBaseModule : public QNamed {
00033
00034 public:
00036 QBaseModule(const std::string&, QSequence *s);
00037
00039 virtual ~QBaseModule();
00040
00043 void BeginBase();
00044 virtual void Begin() = 0;
00046 Cuore::QEvent* ProcessBase(Cuore::QEvent* ev);
00047 virtual Cuore::QEvent* Process(Cuore::QEvent* ev) = 0;
00048
00050 void EndBase();
00051 virtual void End() = 0;
00052
00054 unsigned int GetOccurrence() const {return fOccurrence;}
00055
00057 inline bool isEnabled() const { return fEnabled;}
00058
00059 std::string GetFullPath() const;
00060
00061 protected:
00063 double GetDouble(const std::string&, double defVal, bool warnCfg = true) const;
00065 int GetInt(const std::string&, int defVal, bool warnCfg = true) const;
00067 const std::string& GetString(const std::string&, const std::string& defVal, bool warnCfg = true) const;
00069 bool GetBool(const std::string&, bool defVal, bool warnCfg = true) const;
00070
00072 inline void Debug(const char* descr, ...) const;
00074 inline void Info(const char* descr, ...) const;
00076 inline void Warn(const char* descr, ...) const;
00078 inline void Error(const char* descr, ...) const;
00080 inline void Panic(const char* descr, ...) const;
00081
00083 bool GetRunAgain() { return GetSequence().GetRunAgain();}
00085 void SetRunAgain(bool b) { GetSequence().SetRunAgain(b);}
00087 unsigned int GetIteration() { return GetSequence().GetIteration(); }
00088
00090 QGlobalDataManager& SeqAuxData() {return GetSequence().AuxData();}
00091
00093 MsgLevel GetVerbosity() {return verbosity;}
00094
00096 QSequence& GetSequence() {return *my_sequence;}
00097 const QSequence& GetSequence() const {return *my_sequence;}
00098
00100 void UpdateEnableFlag() { fEnabled = GetBool("enable",false); }
00101
00102 private:
00104 void SetOccurrence(unsigned int o);
00105
00106 MsgLevel verbosity;
00107 bool fTimeProfilingOn;
00108 unsigned int fOccurrence;
00109 double fProcessTime;
00110 unsigned long long int fProcessCalls;
00111 bool fEnabled;
00112 QSequence *my_sequence;
00113
00114 void SetVerbosity(MsgLevel l=WarnMsg) { verbosity=l; }
00115
00116 template<class T> friend class QModFactory;
00117
00118
00119 friend class QModuleFactory;
00120 friend class QSequence;
00121
00122 };
00123
00124 inline void QBaseModule::Debug(const char* descr, ...) const {
00125 if (verbosity <= DebugMsg ){
00126 char buf[4096];
00127 va_list args;
00128 va_start(args,descr);
00129 vsprintf(buf,descr,args);
00130 std::string msg(buf);
00131 QMessageHandler::Get()->Send(DebugMsg, GetName(), msg);
00132 }
00133 }
00134
00135 inline void QBaseModule::Info(const char* descr, ...)const {
00136 if (verbosity <= InfoMsg ){
00137 char buf[4096];
00138 va_list args;
00139 va_start(args,descr);
00140 vsprintf(buf,descr,args);
00141 std::string msg(buf);
00142 QMessageHandler::Get()->Send(InfoMsg, GetName(), msg);
00143 }
00144 }
00145
00146 inline void QBaseModule::Warn(const char* descr, ...)const {
00147 if (verbosity <= WarnMsg ){
00148 char buf[4096];
00149 va_list args;
00150 va_start(args,descr);
00151 vsprintf(buf,descr,args);
00152 std::string msg(buf);
00153 QMessageHandler::Get()->Send(WarnMsg, GetName(), msg);
00154 }
00155 }
00156
00157 inline void QBaseModule::Error(const char* descr, ...)const {
00158 if (verbosity <= ErrorMsg ){
00159 char buf[4096];
00160 va_list args;
00161 va_start(args,descr);
00162 vsprintf(buf,descr,args);
00163 std::string msg(buf);
00164 QMessageHandler::Get()->Send(ErrorMsg, GetName(), msg);
00165 }
00166 }
00167
00168 inline void QBaseModule::Panic(const char* descr, ...)const {
00169 if (verbosity <= PanicMsg ){
00170 char buf[4096];
00171 va_list args;
00172 va_start(args,descr);
00173 vsprintf(buf,descr,args);
00174 std::string msg(buf);
00175 QMessageHandler::Get()->Send(PanicMsg, GetName(), msg);
00176 }
00177 }
00178
00179 #endif