00001
00002
00003 #ifndef GAUDIKERNEL_ALGTOOL_H
00004 #define GAUDIKERNEL_ALGTOOL_H
00005
00006
00007 #include "GaudiKernel/IAlgTool.h"
00008 #include "GaudiKernel/IProperty.h"
00009 #include "GaudiKernel/IService.h"
00010 #include "GaudiKernel/ISvcLocator.h"
00011 #include "GaudiKernel/IMessageSvc.h"
00012 #include "GaudiKernel/IToolSvc.h"
00013 #include "GaudiKernel/PropertyMgr.h"
00014 #include "GaudiKernel/IAuditorSvc.h"
00015 #include "GaudiKernel/IMonitorSvc.h"
00016 #include "GaudiKernel/IStateful.h"
00017
00018 #include <vector>
00019 #include <list>
00020
00021
00022
00035 class AlgTool : public virtual IAlgTool,
00036 public virtual IProperty,
00037 public virtual IStateful {
00038 friend class ToolSvc;
00039 public:
00040
00042 virtual StatusCode queryInterface(const InterfaceID& riid, void** ppvUnknown);
00043
00045 virtual unsigned long addRef();
00046
00048 virtual unsigned long release();
00049
00051 virtual const std::string& name() const;
00052
00054 virtual const std::string& type() const;
00055
00057 virtual const IInterface* parent() const;
00058
00059
00060 virtual StatusCode configure() { return StatusCode::SUCCESS; }
00061 virtual StatusCode initialize();
00062 virtual StatusCode start();
00063 virtual StatusCode stop();
00064 virtual StatusCode finalize();
00065 virtual StatusCode terminate() { return StatusCode::SUCCESS; }
00066 virtual StatusCode reinitialize();
00067 virtual StatusCode restart();
00068 virtual Gaudi::StateMachine::State FSMState() const { return m_state; }
00069 virtual Gaudi::StateMachine::State targetFSMState() const { return m_targetState; }
00070
00072 virtual StatusCode sysInitialize();
00073
00075 virtual StatusCode sysStart();
00076
00078 virtual StatusCode sysStop();
00079
00081 virtual StatusCode sysFinalize();
00082
00084 virtual StatusCode sysReinitialize();
00085
00087 virtual StatusCode sysRestart();
00088
00090 virtual StatusCode setProperty( const Property& p );
00091 virtual StatusCode setProperty( const std::string& s );
00092 virtual StatusCode setProperty( const std::string& n, const std::string& v);
00093 virtual StatusCode getProperty(Property* p) const;
00094 virtual const Property& getProperty( const std::string& name) const;
00095 virtual StatusCode getProperty( const std::string& n, std::string& v ) const;
00096 virtual const std::vector<Property*>& getProperties( ) const;
00097
00098 inline PropertyMgr * getPropertyMgr() { return m_propertyMgr; }
00099
00100 public:
00101
00142 template <class TYPE>
00143 StatusCode setProperty
00144 ( const std::string& name ,
00145 const TYPE& value )
00146 { return Gaudi::Utils::setProperty ( m_propertyMgr , name , value ) ; }
00147
00148
00154 AlgTool( const std::string& type,
00155 const std::string& name,
00156 const IInterface* parent);
00157
00159 ISvcLocator* serviceLocator() const;
00160
00162 ISvcLocator* svcLoc() const { return serviceLocator() ; }
00163
00165 IMessageSvc* msgSvc() const;
00166
00168 IToolSvc* toolSvc() const;
00169
00175 StatusCode setProperties();
00176
00180 template <class T>
00181 StatusCode service
00182 ( const std::string& name, T*& svc, bool createIf = true ) const {
00183 return service_i(name, createIf, T::interfaceID(), (void**)&svc);
00184 }
00185
00188 template <class T>
00189 StatusCode service( const std::string& type, const std::string& name, T*& svc) const {
00190 return service_i(type, name, T::interfaceID(), (void**)&svc);
00191 }
00192
00194 void declInterface( const InterfaceID&, void*);
00195
00196 template <class I> class declareInterface {
00197 public:
00198 template <class T> declareInterface(T* tool) {
00199 tool->declInterface( I::interfaceID(), (I*)tool);
00200 }
00201 };
00202
00232 template <class T>
00233 Property* declareProperty
00234 ( const std::string& name ,
00235 T& property ,
00236 const std::string& doc = "none" ) const
00237 {
00238 return m_propertyMgr -> declareProperty ( name , property , doc ) ;
00239 }
00241 Property* declareRemoteProperty
00242 ( const std::string& name ,
00243 IProperty* rsvc ,
00244 const std::string& rname = "" ) const
00245 {
00246 return m_propertyMgr-> declareRemoteProperty ( name , rsvc , rname ) ;
00247 }
00248
00250 IAuditorSvc* auditorSvc() const;
00251
00261 inline IMonitorSvc* monitorSvc() const
00262 {
00263
00264 if ( !m_pMonitorSvc ){
00265 service_i( m_monitorSvcName, false,
00266 IMonitorSvc::interfaceID(), pp_cast<void>(&m_pMonitorSvc) );
00267 }
00268 return m_pMonitorSvc;
00269 }
00270
00276 template <class T>
00277 void declareInfo( const std::string& name,
00278 const T& var,
00279 const std::string& desc ) const
00280 {
00281 IMonitorSvc* mS = monitorSvc();
00282 if ( mS ) mS->declareInfo(name, var, desc, this);
00283 }
00284
00292 void declareInfo( const std::string& name,
00293 const std::string& format,
00294 const void* var,
00295 int size,
00296 const std::string& desc ) const
00297 {
00298 IMonitorSvc* mS = monitorSvc();
00299 if ( mS ) mS->declareInfo(name, format, var, size, desc, this);
00300 }
00301
00302 protected:
00303
00305 int outputLevel () const { return (int)m_outputLevel ; }
00306
00311 virtual unsigned long refCount() const { return m_refCount; }
00312
00314 IntegerProperty & outputLevelProperty() { return m_outputLevel; }
00315
00317 void initOutputLevel(Property& prop);
00318
00319
00320
00321 protected:
00322
00323
00324 virtual ~AlgTool();
00325
00326 private:
00327 typedef std::list<std::pair<InterfaceID,void*> > InterfaceList;
00328 IntegerProperty m_outputLevel;
00329 std::string m_type;
00330 const std::string m_name;
00331 const IInterface* m_parent;
00332 unsigned long m_refCount;
00333 mutable ISvcLocator* m_svcLocator;
00334 mutable IMessageSvc* m_messageSvc;
00335 mutable IToolSvc* m_ptoolSvc;
00336 mutable IMonitorSvc* m_pMonitorSvc;
00337 std::string m_monitorSvcName;
00338 PropertyMgr* m_propertyMgr;
00339 InterfaceList m_interfaceList;
00340 std::string m_threadID;
00341
00343 StatusCode service_i(const std::string& algName,
00344 bool createIf,
00345 const InterfaceID& iid,
00346 void** ppSvc) const;
00347 StatusCode service_i(const std::string& svcType,
00348 const std::string& svcName,
00349 const InterfaceID& iid,
00350 void** ppS) const;
00351
00352 mutable IAuditorSvc* m_pAuditorSvc;
00353
00354 BooleanProperty m_auditInit;
00355 bool m_auditorInitialize;
00356 bool m_auditorStart;
00357 bool m_auditorStop;
00358 bool m_auditorFinalize;
00359 bool m_auditorReinitialize;
00360 bool m_auditorRestart;
00361
00362 Gaudi::StateMachine::State m_state;
00363 Gaudi::StateMachine::State m_targetState;
00364 };
00365
00366 #endif // GAUDIKERNEL_ALGTOOL_H