| # Gaudi Framework, version v20r3
Generated: 24 Nov 2008

# PoolDbCnvFactory.h

Go to the documentation of this file.

    00001 // $Id: PoolDbCnvFactory.h,v 1.3 2006/11/22 18:10:43 hmd Exp $
    00002 //====================================================================
    00003 //      IPoolDbCnvFactory and PoolDbCnvFactory definition
    00004 //--------------------------------------------------------------------
    00005 //
    00006 //      Author     : M.Frank
    00007 //====================================================================
    00008 #ifndef POOLDB_POOLDBCNVFACTORY_H
    00009 #define POOLDB_POOLDBCNVFACTORY_H 1
    00010 #include "GaudiKernel/ICnvFactory.h"
    00011 #include "GaudiKernel/FactoryTable.h"
    00012 #include "GaudiKernel/System.h"
    00013 #include "StorageSvc/DbType.h"
    00014
    00015 // Interface ID ( interface id, major version, minor version)
    00016 static const InterfaceID IID_IPoolDbCnvFactory("IPoolDbCnvFactory", 2 , 0);
    00017
    00026 class IPoolDbCnvFactory : virtual public IInterface   {
    00027 public:
    00029   static const InterfaceID& interfaceID() { return IID_IPoolDbCnvFactory; }
    00038   virtual IConverter* instantiate(long typ,
    00039                                   const CLID& clid,
    00040                                   ISvcLocator *svcloc )  const = 0;
    00041 };
    00042
    00051 template <class ConcreteConverter, int i>
    00052 class PoolDbCnvFactory : virtual public ICnvFactory,
    00053                          virtual public IPoolDbCnvFactory
    00054 {
    00056   mutable std::string m_typeName;
    00057 public:
    00059   typedef ConcreteConverter converter_t;
    00060
    00062   PoolDbCnvFactory()  {
    00063     m_typeName = "";
    00064     FactoryTable::instance()->addFactory( this );
    00065   }
    00067   virtual ~PoolDbCnvFactory()  {  }
    00069   virtual const std::string& typeName()  const    {
    00070     // The name MUST be set here, not in the constructor.
    00071     // At construction time it is not yet clear if we run from
    00072     // an executable or a DLL.
    00073     if ( m_typeName == "" )  {
    00074       if ( System::moduleType() == System::SHAREDLIB )  {
    00075         m_typeName  = System::moduleName();
    00076         m_typeName += ":";
    00077       }
    00078       // Get the class name using the RTTI.
    00079       m_typeName += System::typeinfoName( typeid(ConcreteConverter) );
    00080     }
    00081     return m_typeName;
    00082   }
    00084   virtual const CLID& objType()  const;
    00086   virtual const long repSvcType()   const
    00087   {    return pool::POOL_StorageType.type();  }
    00088   virtual unsigned long addRef()  const     {     return 1;           }
    00089   virtual unsigned long release()   const   {     return 1;           }
    00090   virtual const std::string& ident() const  {     return typeName();  }
    00091   // IInterface implementation
    00092   virtual unsigned long addRef()            {     return 1;           }
    00093   virtual unsigned long release()           {     return 1;           }
    00094
    00096   virtual StatusCode queryInterface(const InterfaceID& riid, void** ppISvc)   {
    00097           if ( IID_IPoolDbCnvFactory == riid )   {
    00098       *ppISvc = (IPoolDbCnvFactory *) this;
    00099     }
    00100           else if( IID_ICnvFactory == riid )    {
    00101         *ppISvc = (ICnvFactory*) this;
    00102     }
    00103           else if ( IID_IFactory == riid )     {
    00104           *ppISvc = (IFactory *) this;
    00105     }
    00106     else if ( IID_IInterface == riid )    {
    00107         *ppISvc = (IInterface *) this;
    00108     }
    00109           else    {
    00110                   return StatusCode::FAILURE;
    00111     }
    00112     addRef();
    00113           return StatusCode::SUCCESS;
    00114   }
    00115
    00124   virtual IConverter* instantiate(long typ,
    00125                                   const CLID& /* clid */,
    00126                                   ISvcLocator *svcloc)  const
    00127   {    return new ConcreteConverter(typ, svcloc);  }
    00128
    00130   virtual IConverter* instantiate( ISvcLocator* /* svcloc */ )  const
    00131   {    return 0;  }
    00132
    00134   virtual IInterface* instantiate( IInterface* /* parent */ ) const
    00135   {    return 0;  }
    00136
    00137 };
    00138 #endif    // POOLDB_POOLDBCNVFACTORY_H