00001
00002 #ifndef GAUDIKERNEL_CONVERSIONSVC_H
00003 #define GAUDIKERNEL_CONVERSIONSVC_H 1
00004
00005
00006 #include <vector>
00007 #include <algorithm>
00008 #include <functional>
00009 #include "GaudiKernel/Kernel.h"
00010 #include "GaudiKernel/Service.h"
00011 #include "GaudiKernel/IConversionSvc.h"
00012 #include "GaudiKernel/IAddressCreator.h"
00013
00014
00015 class ICnvManager;
00016 class IAddrFactory;
00017 template <class TYPE,class ARG> class SvcFactory2;
00018
00027 class ConversionSvc : public Service,
00028 virtual public IConversionSvc,
00029 virtual public IAddressCreator
00030 {
00031 friend class SvcFactory2<ConversionSvc,unsigned char>;
00032 protected:
00033 class ContextEntry {
00034 IConverter* m_converter;
00035 IOpaqueAddress* m_address;
00036 DataObject* m_object;
00037 public:
00038 ContextEntry(IConverter* cnv, IOpaqueAddress* addr, DataObject* obj) {
00039 m_converter = cnv;
00040 m_address = addr;
00041 m_object = obj;
00042 }
00043 ContextEntry(const ContextEntry& copy) {
00044 m_converter = copy.m_converter;
00045 m_address = copy.m_address;
00046 m_object = copy.m_object;
00047 }
00048 virtual ~ContextEntry() {
00049 }
00050 IConverter* converter() {
00051 return m_converter;
00052 }
00053 IOpaqueAddress*& address() {
00054 return m_address;
00055 }
00056 DataObject*& object() {
00057 return m_object;
00058 }
00059 };
00060 typedef std::vector<ContextEntry> Context;
00061 public:
00062 class WorkerEntry {
00063 private:
00064 CLID m_class;
00065 IConverter* m_converter;
00066 public:
00067 WorkerEntry(const CLID& cl, IConverter* cnv)
00068 : m_class(cl), m_converter(cnv) {
00069 }
00070 WorkerEntry(const WorkerEntry& copy)
00071 : m_class(copy.m_class), m_converter(copy.m_converter) {
00072 }
00073 WorkerEntry& operator = (const WorkerEntry& copy) {
00074 m_class = copy.m_class;
00075 m_converter = copy.m_converter;
00076 return *this;
00077 }
00078 virtual ~WorkerEntry() {
00079 }
00080 IConverter* converter() {
00081 return m_converter;
00082 }
00083 const CLID& clID() const {
00084 return m_class;
00085 }
00086 };
00087 typedef std::vector<WorkerEntry> Workers;
00088
00089 class CnvTest : public std::unary_function<WorkerEntry, bool> {
00090 protected:
00091 const CLID m_test;
00092 public:
00093 CnvTest(const CLID& test) : m_test(test) {
00094 }
00095 virtual ~CnvTest() {
00096 }
00097 bool operator()( const WorkerEntry& testee ) {
00098 return (m_test == testee.clID()) ? true : false;
00099 }
00100 };
00101
00102 public:
00103
00105 virtual StatusCode initialize();
00106
00108 virtual StatusCode finalize();
00109
00111 virtual unsigned char repSvcType() const;
00112
00114 virtual StatusCode updateServiceState(IOpaqueAddress* pAddress);
00115
00117 virtual StatusCode createObj(IOpaqueAddress* pAddress, DataObject*& refpObject);
00118
00120 virtual StatusCode updateObj(IOpaqueAddress* pAddress, DataObject* pObject);
00121
00123 virtual StatusCode updateReps(IDataSelector* pSelector);
00124
00126 virtual StatusCode createReps(IDataSelector* pSelector);
00127
00129 virtual StatusCode setStore(IDataProviderSvc* pStore);
00130
00132 virtual StatusCode addConverter(IConverter* pConverter);
00133
00136 virtual StatusCode addConverter(const ICnvFactory& refFactory);
00137
00139 virtual StatusCode removeConverter(const CLID& clid);
00140
00142 virtual StatusCode connectOutput(const std::string& outputFile);
00143
00145 virtual StatusCode createAddress(const GenericLinkBase & link,
00146 const std::string& dbName,
00147 const std::string& contName,
00148 const std::string& objName,
00149 IOpaqueAddress*& refpAddress);
00151 virtual StatusCode createAddress(unsigned char type,
00152 const CLID& classId,
00153 const std::string& dbName,
00154 const std::string& contName,
00155 int seqId,
00156 IOpaqueAddress*& refpAddress);
00158 virtual StatusCode setAddressCreator(IAddressCreator* creator);
00159
00161 ConversionSvc(const std::string& name, ISvcLocator* svc, unsigned char type);
00162
00164 virtual StatusCode queryInterface(const IID& riid, void** ppvInterface);
00165
00166 protected:
00168 virtual ~ConversionSvc();
00169
00171 virtual IConverter* converter(const CLID& wanted_class);
00172
00174 virtual const ICnvFactory* findCnvFactory(const CLID& wanted);
00175
00177 virtual StatusCode initializeConverter(IConverter* cnv);
00178
00180 virtual IConverter* createConverter(const ICnvFactory& fac);
00181
00183 virtual IAddressCreator* addressCreator() {
00184 return m_addressCreator;
00185 }
00186
00188 virtual void setAddressFactory(const IAddrFactory* pAddrFactory) {
00189 m_addressFactory = pAddrFactory;
00190 }
00192 ICnvManager* cnvManager() {
00193 return m_cnvManager;
00194 }
00195
00196 protected:
00198 IDataProviderSvc* m_dataSvc;
00200 ICnvManager* m_cnvManager;
00202 IAddressCreator* m_addressCreator;
00204 unsigned char m_type;
00206 const IAddrFactory* m_addressFactory;
00208 Workers* m_workers;
00209 };
00210 #endif // GAUDIKERNEL_CONVERSIONSVC_H