Gaudi Framework, version v20r2

Generated: 18 Jul 2008

DLLClassManager Class Reference

#include <DLLClassManager.h>

Inheritance diagram for DLLClassManager:

Inheritance graph
[legend]
Collaboration diagram for DLLClassManager:

Collaboration graph
[legend]
List of all members.

Detailed Description

Definition at line 28 of file DLLClassManager.h.

Public Member Functions

 DLLClassManager (IInterface *iface)
virtual ~DLLClassManager ()
virtual StatusCode loadModule (const std::string &module, bool fireIncident=true)
 Declare a shareable library to be used for creating instances of a given algorithm type.
virtual unsigned long addRef ()
 Increment the reference count of Interface instance.
virtual unsigned long release ()
 Release Interface instance.
virtual StatusCode queryInterface (const InterfaceID &iid, void **pinterface)
 Query interfaces of Interface.

Private Attributes

unsigned long m_refcount
ISvcLocatorm_svclocator
IAlgManagerm_algmanager
ISvcManagerm_svcmanager
ICnvManager * m_cnvmanager
IObjManager * m_objmanager
IMessageSvcm_msgsvc
IInterfacem_pOuter


Constructor & Destructor Documentation

DLLClassManager::DLLClassManager ( IInterface iface  ) 

Definition at line 18 of file DLLClassManager.cpp.

References StatusCode::ignore(), IID_ISvcLocator, m_msgsvc, m_pOuter, m_refcount, m_svclocator, and IInterface::queryInterface().

00018                                                     {
00019   m_pOuter = iface;
00020   m_pOuter->queryInterface(IID_ISvcLocator, pp_cast<void>(&m_svclocator)).ignore();
00021   assert( 0 != m_svclocator );
00022   m_msgsvc     = 0;
00023 //  m_algmanager = 0;
00024 //  m_svcmanager = 0;
00025 //  m_cnvmanager = 0;
00026 //  m_objmanager = 0;
00027   m_refcount   = 1;
00028 }

DLLClassManager::~DLLClassManager (  )  [virtual]

Definition at line 31 of file DLLClassManager.cpp.

References m_msgsvc, m_svclocator, and IInterface::release().

00031                                   {
00032   if( m_msgsvc ) m_msgsvc->release();
00033   //if( m_algmanager ) m_algmanager->release();
00034   //if( m_svcmanager ) m_svcmanager->release();
00035   //if( m_cnvmanager ) m_cnvmanager->release();
00036   //if( m_objmanager ) m_objmanager->release();
00037   if( m_svclocator ) m_svclocator->release();
00038 }


Member Function Documentation

StatusCode DLLClassManager::loadModule ( const std::string module,
bool  fireIncident = true 
) [virtual]

Declare a shareable library to be used for creating instances of a given algorithm type.

Implements IClassManager.

Definition at line 41 of file DLLClassManager.cpp.

References endmsg(), endreq(), MSG::ERROR, StatusCode::FAILURE, MSG::FATAL, IIncidentSvc::fireIncident(), System::getLastErrorString(), ISvcLocator::getService(), StatusCode::ignore(), IID_IMessageSvc, StatusCode::isFailure(), System::loadDynamicLib(), m_msgsvc, m_svclocator, System::moduleNameFull(), IInterface::release(), ISvcLocator::service(), StatusCode::SUCCESS, and std::exception::what().

Referenced by ApplicationMgr::decodeDllNameList(), and ApplicationMgr::i_startup().

00042                                                             {
00043   // Access the message service if not yet done already
00044   if( m_msgsvc == 0 ) {
00045     m_svclocator->getService( "MessageSvc", IID_IMessageSvc, *pp_cast<IInterface>(&m_msgsvc) ).ignore();
00046   }
00047   MsgStream log(m_msgsvc, "DllClassManager");
00048 
00049   std::string mod = module=="" ? System::moduleNameFull() : module;
00050   if( module == "NONE" ) return StatusCode::SUCCESS;
00051 
00052   void* libHandle = 0;
00053   StatusCode status = StatusCode::FAILURE;
00054   try
00055   {
00056     status = System::loadDynamicLib( module, &libHandle);
00057   }
00058   catch ( const std::exception & excpt )
00059   {
00060     if ( m_msgsvc )
00061     {
00062       log << MSG::ERROR << "Exception whilst loading " << module << " : " << excpt.what() << endmsg;
00063     }
00064     status = StatusCode::FAILURE;
00065   }
00066 
00067   if( status.isFailure() ) {
00068     // DLL library not loaded
00069     log << MSG::ERROR << "Could not load module " << module << endmsg;
00070     log << MSG::ERROR << "System Error: " << System::getLastErrorString() << endmsg;
00071     return StatusCode::FAILURE; 
00072   }
00073   //FIXME this is a hack to avoid a very early call to moduleLoad from
00074   //FIXME AppMgr::i_startup
00075   if (fireIncident && module != "") {
00076     //now fire ModuleLoadedIncident
00077     IIncidentSvc* pIncidentSvc(0);
00078     const bool CREATEIF(true);
00079     StatusCode sc(m_svclocator->service("IncidentSvc", pIncidentSvc, CREATEIF));
00080     if( !sc.isSuccess() )  {
00081       log << MSG::FATAL << "Can not locate IncidentSvc" << endreq;
00082       throw GaudiException("Error retrieving IncidentSvc", 
00083                            "DLLClassManager::DLLClassManager", sc);
00084     }
00085     pIncidentSvc->fireIncident(ModuleLoadedIncident("DLLClassManager",
00086                                                      module) );
00087     pIncidentSvc->release();
00088   }
00089 
00090   return StatusCode::SUCCESS;
00091 }

unsigned long DLLClassManager::addRef (  )  [virtual]

Increment the reference count of Interface instance.

Implements IInterface.

Definition at line 94 of file DLLClassManager.cpp.

References m_refcount.

Referenced by queryInterface().

00094                                       {
00095   m_refcount++;
00096         return m_refcount;
00097 }

unsigned long DLLClassManager::release (  )  [virtual]

Release Interface instance.

Implements IInterface.

Definition at line 100 of file DLLClassManager.cpp.

References count(), and m_refcount.

Referenced by ApplicationMgr::~ApplicationMgr().

00100                                        {
00101   unsigned long count = --m_refcount;
00102   if( count <= 0) {
00103     delete this;
00104   }
00105   return count;
00106 }

StatusCode DLLClassManager::queryInterface ( const InterfaceID iid,
void **  pinterface 
) [virtual]

Query interfaces of Interface.

Parameters:
riid ID of Interface to be retrieved
ppvInterface Pointer to Location for interface pointer

Implements IInterface.

Definition at line 109 of file DLLClassManager.cpp.

References addRef(), IID_IClassManager, IID_IInterface, m_pOuter, IInterface::queryInterface(), and StatusCode::SUCCESS.

00109                                                                                     {
00110   if( iid == IID_IInterface ) {  
00111     *pinterface = (IInterface*)this;
00112     addRef();
00113     return StatusCode::SUCCESS;
00114   } 
00115   else if ( iid == IID_IClassManager ) {
00116     *pinterface = (IClassManager*)this;
00117     addRef();
00118     return StatusCode::SUCCESS;
00119   } 
00120   else {
00121     return m_pOuter->queryInterface(iid, pinterface);
00122   } 
00123   return StatusCode::SUCCESS;
00124 }


Member Data Documentation

unsigned long DLLClassManager::m_refcount [private]

Definition at line 46 of file DLLClassManager.h.

Referenced by addRef(), DLLClassManager(), and release().

ISvcLocator* DLLClassManager::m_svclocator [private]

Definition at line 47 of file DLLClassManager.h.

Referenced by DLLClassManager(), loadModule(), and ~DLLClassManager().

IAlgManager* DLLClassManager::m_algmanager [private]

Definition at line 48 of file DLLClassManager.h.

ISvcManager* DLLClassManager::m_svcmanager [private]

Definition at line 49 of file DLLClassManager.h.

ICnvManager* DLLClassManager::m_cnvmanager [private]

Definition at line 50 of file DLLClassManager.h.

IObjManager* DLLClassManager::m_objmanager [private]

Definition at line 51 of file DLLClassManager.h.

IMessageSvc* DLLClassManager::m_msgsvc [private]

Definition at line 52 of file DLLClassManager.h.

Referenced by DLLClassManager(), loadModule(), and ~DLLClassManager().

IInterface* DLLClassManager::m_pOuter [private]

Definition at line 53 of file DLLClassManager.h.

Referenced by DLLClassManager(), and queryInterface().


The documentation for this class was generated from the following files:
Generated at Fri Jul 18 12:07:07 2008 for Gaudi Framework, version v20r2 by Doxygen version 1.5.1 written by Dimitri van Heesch, © 1997-2004