| # Gaudi Framework, version v21r7 |

Home |  | Generated: 22 Jan 2010

# ServiceManager.h

Go to the documentation of this file.

    00001 // $Id: ServiceManager.h,v 1.9 2008/11/10 15:29:09 marcocle Exp $
    00002 #ifndef GAUDISVC_ServiceManager_H
    00003 #define GAUDISVC_ServiceManager_H
    00004
    00005 // Include files
    00006 #include "GaudiKernel/Kernel.h"
    00007 #include "GaudiKernel/ISvcManager.h"
    00008 #include "GaudiKernel/ISvcLocator.h"
    00009 #include "GaudiKernel/IStateful.h"
    00010 #include "GaudiKernel/SmartIF.h"
    00011 #include "GaudiKernel/ComponentManager.h"
    00012 #include "GaudiKernel/Map.h"
    00013 #include <string>
    00014 #include <list>
    00015 #include <map>
    00016 #include <algorithm>
    00017
    00018 // Forward declarations
    00019 class IService;
    00020 class ISvcFactory;
    00021 class IMessageSvc;
    00022 class Property;
    00023
    00036 class ServiceManager : public extends2<ComponentManager, ISvcManager, ISvcLocator>{
    00037 public:
    00038
    00039   struct ServiceItem {
    00040     ServiceItem(IService *s, long p = 0, bool act = false):
    00041       service(s), priority(p), active(act) {}
    00042     SmartIF<IService> service;
    00043     long priority;
    00044     bool active;
    00045     inline bool operator==(const std::string &name) const {
    00046       return service->name() == name;
    00047     }
    00048     inline bool operator==(const IService *ptr) const {
    00049       return service.get() == ptr;
    00050     }
    00051     inline bool operator<(const ServiceItem& rhs) const {
    00052       return priority < rhs.priority;
    00053     }
    00054   };
    00055
    00056   // typedefs and classes
    00057   typedef std::list<ServiceItem> ListSvc;
    00058   typedef GaudiUtils::Map<std::string, std::string> MapType;
    00059
    00061   ServiceManager(IInterface* application);
    00062
    00064   inline SmartIF<ISvcLocator>& serviceLocator() const {
    00065     return m_svcLocator;
    00066   }
    00067
    00069   virtual ~ServiceManager();
    00070
    00072   virtual const std::list<IService*>& getServices() const;
    00073
    00075   virtual bool existsService(const std::string& name) const;
    00076
    00078   virtual StatusCode addService(IService* svc, int prio = 10);
    00080   virtual StatusCode addService(const Gaudi::Utils::TypeNameString& typeName, int prio = 10);
    00082   virtual StatusCode removeService(IService* svc);
    00084   virtual StatusCode removeService(const std::string& name);
    00085
    00087   virtual StatusCode declareSvcType(const std::string& svcname, const std::string& svctype);
    00088
    00090   virtual SmartIF<IService>& createService(const Gaudi::Utils::TypeNameString& nametype);
    00091
    00093   virtual StatusCode initialize();
    00095   virtual StatusCode start();
    00097   virtual StatusCode stop();
    00099   virtual StatusCode finalize();
    00100
    00102   virtual StatusCode reinitialize();
    00104   virtual StatusCode restart();
    00105
    00107   virtual int getPriority(const std::string& name) const;
    00108   virtual StatusCode setPriority(const std::string& name, int pri);
    00109
    00111   virtual bool loopCheckEnabled() const;
    00113   virtual void setLoopCheckEnabled(bool en);
    00114
    00116   const std::string &name() const {
    00117     static std::string _name = "ServiceManager";
    00118     return _name;
    00119   }
    00120
    00122   virtual SmartIF<IService> &service(const Gaudi::Utils::TypeNameString &typeName, const bool createIf = true);
    00123
    00124 #if !defined(GAUDI_V22_API) || defined(G22_NEW_SVCLOCATOR)
    00125   using ISvcManager::createService;
    00126   using ISvcManager::addService;
    00127 #endif
    00128
    00129 private:
    00130
    00131   inline ListSvc::iterator find(const std::string &name) {
    00132     return std::find(m_listsvc.begin(), m_listsvc.end(), name);
    00133   }
    00134   inline ListSvc::const_iterator find(const std::string &name) const {
    00135     return std::find(m_listsvc.begin(), m_listsvc.end(), name);
    00136   }
    00137   inline ListSvc::iterator find(const IService *ptr) {
    00138     return std::find(m_listsvc.begin(), m_listsvc.end(), ptr);
    00139   }
    00140   inline ListSvc::const_iterator find(const IService *ptr) const {
    00141     return std::find(m_listsvc.begin(), m_listsvc.end(), ptr);
    00142   }
    00143
    00144 private:
    00145   ListSvc       m_listsvc;
    00146   MapType       m_maptype;
    00147   bool          m_loopCheck;
    00148
    00150   SmartIF<IService> m_appSvc;
    00151
    00153   mutable std::list<IService*> m_listOfPtrs;
    00154
    00155   GaudiUtils::Map<InterfaceID, SmartIF<IInterface> > m_defaultImplementations;
    00156 };
    00157 #endif  // GAUDISVC_ServiceManager_H
    00158