File indexing completed on 2025-02-21 10:00:28
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef GAUDIKERNEL_CONVERSIONSVC_H
0012 #define GAUDIKERNEL_CONVERSIONSVC_H 1
0013
0014
0015 #include "GaudiKernel/IAddressCreator.h"
0016 #include "GaudiKernel/IConversionSvc.h"
0017 #include "GaudiKernel/IDataProviderSvc.h"
0018 #include "GaudiKernel/Kernel.h"
0019 #include "GaudiKernel/Service.h"
0020 #include <algorithm>
0021 #include <utility>
0022 #include <vector>
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 class GAUDI_API ConversionSvc : public extends<Service, IConversionSvc, IAddressCreator> {
0056 class WorkerEntry final {
0057 CLID m_class;
0058 IConverter* m_converter;
0059
0060 public:
0061 WorkerEntry( const CLID& cl, IConverter* cnv ) : m_class( cl ), m_converter( cnv ) {
0062 if ( m_converter ) m_converter->addRef();
0063 }
0064
0065 ~WorkerEntry() {
0066 if ( m_converter ) m_converter->release();
0067 }
0068
0069 WorkerEntry( WorkerEntry&& orig ) noexcept
0070 : m_class{ orig.m_class }, m_converter{ std::exchange( orig.m_converter, nullptr ) } {}
0071
0072 WorkerEntry& operator=( WorkerEntry&& orig ) noexcept {
0073 m_class = orig.m_class;
0074 std::swap( m_converter, orig.m_converter );
0075 return *this;
0076 }
0077
0078 WorkerEntry( const WorkerEntry& copy ) = delete;
0079 WorkerEntry& operator=( const WorkerEntry& copy ) = delete;
0080
0081 IConverter* converter() { return m_converter; }
0082
0083 const CLID& clID() const { return m_class; }
0084 };
0085
0086 public:
0087
0088 ConversionSvc( const std::string& name, ISvcLocator* svc, long type );
0089
0090
0091 ConversionSvc( const ConversionSvc& ) = delete;
0092 ConversionSvc& operator=( const ConversionSvc& ) = delete;
0093
0094
0095 StatusCode initialize() override;
0096
0097
0098 StatusCode finalize() override;
0099
0100
0101 long repSvcType() const override;
0102
0103
0104 const CLID& objType() const override;
0105
0106
0107
0108
0109
0110 StatusCode setDataProvider( IDataProviderSvc* pService ) override;
0111
0112
0113
0114
0115 SmartIF<IDataProviderSvc>& dataProvider() const override;
0116
0117
0118 StatusCode setConversionSvc( IConversionSvc* svc ) override;
0119
0120
0121 SmartIF<IConversionSvc>& conversionSvc() const override;
0122
0123
0124 StatusCode setAddressCreator( IAddressCreator* creator ) override;
0125
0126
0127 SmartIF<IAddressCreator>& addressCreator() const override;
0128
0129
0130 StatusCode createObj( IOpaqueAddress* pAddress, DataObject*& refpObject ) override;
0131
0132
0133 StatusCode fillObjRefs( IOpaqueAddress* pAddress, DataObject* pObject ) override;
0134
0135
0136 StatusCode updateObj( IOpaqueAddress* pAddress, DataObject* refpObject ) override;
0137
0138
0139 StatusCode updateObjRefs( IOpaqueAddress* pAddress, DataObject* pObject ) override;
0140
0141
0142 StatusCode createRep( DataObject* pObject, IOpaqueAddress*& refpAddress ) override;
0143
0144
0145 StatusCode fillRepRefs( IOpaqueAddress* pAddress, DataObject* pObject ) override;
0146
0147
0148 StatusCode updateRep( IOpaqueAddress* pAddress, DataObject* pObject ) override;
0149
0150
0151 StatusCode updateRepRefs( IOpaqueAddress* pAddress, DataObject* pObject ) override;
0152
0153
0154 StatusCode addConverter( const CLID& clid ) override;
0155
0156
0157 StatusCode addConverter( IConverter* pConverter ) override;
0158
0159
0160 StatusCode removeConverter( const CLID& clid ) override;
0161
0162
0163 IConverter* converter( const CLID& wanted ) override;
0164
0165
0166 StatusCode connectOutput( const std::string& outputFile, const std::string& openMode ) override;
0167
0168
0169 StatusCode connectOutput( const std::string& output ) override;
0170
0171
0172 StatusCode commitOutput( const std::string& output, bool do_commit ) override;
0173
0174
0175 StatusCode createAddress( long svc_type, const CLID& clid, const std::string* par, const unsigned long* ip,
0176 IOpaqueAddress*& refpAddress ) override;
0177
0178
0179 StatusCode convertAddress( const IOpaqueAddress* pAddress, std::string& refAddress ) override;
0180
0181
0182 StatusCode createAddress( long svc_type, const CLID& clid, const std::string& refAddress,
0183 IOpaqueAddress*& refpAddress ) override;
0184
0185
0186 virtual StatusCode updateServiceState( IOpaqueAddress* pAddress );
0187
0188 protected:
0189
0190 virtual IConverter* createConverter( long typ, const CLID& clid, const ICnvFactory* fac );
0191
0192
0193 virtual StatusCode configureConverter( long typ, const CLID& clid, IConverter* cnv );
0194
0195
0196 virtual StatusCode initializeConverter( long typ, const CLID& clid, IConverter* cnv );
0197
0198
0199 virtual StatusCode activateConverter( long typ, const CLID& clid, IConverter* cnv );
0200
0201
0202 virtual void loadConverter( DataObject* pObject );
0203
0204
0205 virtual SmartIF<IAddressCreator>& addressCreator() { return m_addressCreator; }
0206
0207 protected:
0208 StatusCode makeCall( int typ, bool ignore_add, bool ignore_obj, bool update, IOpaqueAddress*& pAddress,
0209 DataObject*& pObject );
0210
0211
0212 mutable SmartIF<IDataProviderSvc> m_dataSvc;
0213
0214 mutable SmartIF<IAddressCreator> m_addressCreator;
0215
0216 mutable SmartIF<IConversionSvc> m_cnvSvc;
0217
0218 long m_type;
0219
0220 std::vector<WorkerEntry> m_workers;
0221 };
0222 #endif