Index  Source Files  Annotated Class List  Alphabetical Class List  Class Hierarchy  Graphical Class Hierarchy 

FIX::Initiator Class Reference

Base for classes which act as an initiator for establishing connections. More...

#include <Initiator.h>

Inheritance diagram for FIX::Initiator:
Inheritance graph
[legend]
Collaboration diagram for FIX::Initiator:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 Initiator (Application &, MessageStoreFactory &, const SessionSettings &) throw ( ConfigError )
 Initiator (Application &, MessageStoreFactory &, const SessionSettings &, LogFactory &) throw ( ConfigError )
virtual ~Initiator ()
void start () throw ( ConfigError, RuntimeError )
 Start initiator.
void block () throw ( ConfigError, RuntimeError )
 Block on the initiator.
bool poll (double timeout=0.0) throw ( ConfigError, RuntimeError )
 Poll the initiator.
void stop (bool force=false)
 Stop initiator.
bool isLoggedOn ()
 Check to see if any sessions are currently logged on.
SessiongetSession (const SessionID &sessionID, Responder &)
const std::set< SessionID > & getSessions () const
SessiongetSession (const SessionID &sessionID) const
const Dictionary *const getSessionSettings (const SessionID &sessionID) const
bool has (const SessionID &id)
bool isStopped ()
ApplicationgetApplication ()
MessageStoreFactorygetMessageStoreFactory ()
LoggetLog ()

Protected Member Functions

void setPending (const SessionID &)
void setConnected (const SessionID &)
void setDisconnected (const SessionID &)
bool isPending (const SessionID &)
bool isConnected (const SessionID &)
bool isDisconnected (const SessionID &)
void connect ()

Private Types

typedef std::set< SessionIDSessionIDs
typedef std::map< SessionID, int > SessionState
typedef std::map< SessionID,
Session * > 
Sessions

Private Member Functions

void initialize () throw ( ConfigError )
virtual void onConfigure (const SessionSettings &) throw ( ConfigError )
 Implemented to configure acceptor.
virtual void onInitialize (const SessionSettings &) throw ( RuntimeError )
 Implemented to initialize initiator.
virtual void onStart ()=0
 Implemented to start connecting to targets.
virtual bool onPoll (double timeout)=0
 Implemented to connect and poll for events.
virtual void onStop ()=0
 Implemented to stop a running initiator.
virtual void doConnect (const SessionID &, const Dictionary &)=0
 Implemented to connect a session to its target.

Static Private Member Functions

static THREAD_PROC startThread (void *p)

Private Attributes

Sessions m_sessions
SessionIDs m_sessionIDs
SessionIDs m_pending
SessionIDs m_connected
SessionIDs m_disconnected
SessionState m_sessionState
thread_id m_threadid
Applicationm_application
MessageStoreFactorym_messageStoreFactory
SessionSettings m_settings
LogFactorym_pLogFactory
Logm_pLog
NullLog m_nullLog
bool m_firstPoll
bool m_stop
Mutex m_mutex

Detailed Description

Base for classes which act as an initiator for establishing connections.

Most users will not need to implement one of these. The default SocketInitiator implementation will be used in most cases.

Definition at line 51 of file Initiator.h.


Member Typedef Documentation

typedef std::set< SessionID > FIX::Initiator::SessionIDs [private]

Definition at line 124 of file Initiator.h.

typedef std::map< SessionID, Session* > FIX::Initiator::Sessions [private]

Definition at line 126 of file Initiator.h.

typedef std::map< SessionID, int > FIX::Initiator::SessionState [private]

Definition at line 125 of file Initiator.h.


Constructor & Destructor Documentation

FIX::Initiator::Initiator ( Application application,
MessageStoreFactory messageStoreFactory,
const SessionSettings settings 
) throw ( ConfigError )

Definition at line 37 of file Initiator.cpp.

00040 : m_threadid( 0 ),
00041   m_application( application ),
00042   m_messageStoreFactory( messageStoreFactory ),
00043   m_settings( settings ),
00044   m_pLogFactory( 0 ),
00045   m_pLog( 0 ),
00046   m_stop( true )
00047 { initialize(); }

FIX::Initiator::Initiator ( Application application,
MessageStoreFactory messageStoreFactory,
const SessionSettings settings,
LogFactory logFactory 
) throw ( ConfigError )

Definition at line 49 of file Initiator.cpp.

00053 : m_threadid( 0 ),
00054   m_application( application ),
00055   m_messageStoreFactory( messageStoreFactory ),
00056   m_settings( settings ),
00057   m_pLogFactory( &logFactory ),
00058   m_pLog( logFactory.create() ),
00059   m_stop( true )
00060 { initialize(); }

FIX::Initiator::~Initiator (  )  [virtual]

Definition at line 90 of file Initiator.cpp.

References FIX::LogFactory::destroy(), m_pLog, m_pLogFactory, m_sessions, QF_STACK_IGNORE_BEGIN, and QF_STACK_IGNORE_END.

00091 { QF_STACK_IGNORE_BEGIN
00092 
00093   Sessions::iterator i;
00094   for ( i = m_sessions.begin(); i != m_sessions.end(); ++i )
00095     delete i->second;
00096 
00097   if( m_pLogFactory && m_pLog )
00098     m_pLogFactory->destroy( m_pLog );
00099 
00100   QF_STACK_IGNORE_END
00101 }


Member Function Documentation

void FIX::Initiator::block (  )  throw ( ConfigError, RuntimeError )

Block on the initiator.

Definition at line 241 of file Initiator.cpp.

References m_settings, m_stop, onConfigure(), onInitialize(), QF_STACK_POP, QF_STACK_PUSH, and startThread().

00242 { QF_STACK_PUSH(Initiator::block)
00243 
00244   m_stop = false;
00245   onConfigure( m_settings );
00246   onInitialize( m_settings );
00247 
00248   startThread(this);
00249 
00250   QF_STACK_POP
00251 }

void FIX::Initiator::connect (  )  [protected]

Definition at line 145 of file Initiator.cpp.

References doConnect(), FIX::SessionSettings::get(), FIX::Session::isEnabled(), FIX::Session::isSessionTime(), FIX::Session::lookupSession(), m_disconnected, m_mutex, m_settings, QF_STACK_POP, QF_STACK_PUSH, and FIX::TYPE::UtcTimeStamp.

Referenced by FIX::ThreadedSocketInitiator::onStart(), FIX::SocketInitiator::onStart(), and FIX::SocketInitiator::onTimeout().

00146 { QF_STACK_PUSH(Initiator::connect)
00147 
00148   Locker l(m_mutex);
00149 
00150   SessionIDs disconnected = m_disconnected;
00151   SessionIDs::iterator i = disconnected.begin();
00152   for ( ; i != disconnected.end(); ++i )
00153   {
00154     Session* pSession = Session::lookupSession( *i );
00155     if ( pSession->isEnabled() && pSession->isSessionTime(UtcTimeStamp()) )
00156       doConnect( *i, m_settings.get( *i ));
00157   }
00158 
00159   QF_STACK_POP
00160 }

virtual void FIX::Initiator::doConnect ( const SessionID ,
const Dictionary  
) [private, pure virtual]

Implemented to connect a session to its target.

Implemented in FIX::SocketInitiator, and FIX::ThreadedSocketInitiator.

Referenced by connect().

Application& FIX::Initiator::getApplication (  )  [inline]

Definition at line 86 of file Initiator.h.

References m_application.

Referenced by FIX::ThreadedSocketInitiator::doConnect().

00086 { return m_application; }

Log* FIX::Initiator::getLog (  )  [inline]

Definition at line 90 of file Initiator.h.

References m_nullLog, and m_pLog.

Referenced by FIX::ThreadedSocketInitiator::doConnect().

00091   { 
00092     if( m_pLog ) return m_pLog; 
00093     return &m_nullLog;
00094   }

MessageStoreFactory& FIX::Initiator::getMessageStoreFactory (  )  [inline]

Definition at line 87 of file Initiator.h.

References m_messageStoreFactory.

00088   { return m_messageStoreFactory; }

Session * FIX::Initiator::getSession ( const SessionID sessionID  )  const

Definition at line 118 of file Initiator.cpp.

References getSession(), m_sessions, QF_STACK_POP, and QF_STACK_PUSH.

00119 { QF_STACK_PUSH(Initiator::getSession)
00120 
00121   Sessions::const_iterator i = m_sessions.find( sessionID );
00122   if( i != m_sessions.end() )
00123     return i->second;
00124   else
00125     return 0;
00126 
00127   QF_STACK_POP
00128 }

Session * FIX::Initiator::getSession ( const SessionID sessionID,
Responder responder 
)

Definition at line 103 of file Initiator.cpp.

References m_sessions, QF_STACK_POP, and QF_STACK_PUSH.

Referenced by getSession(), and FIX::Acceptor::getSession().

00105 { QF_STACK_PUSH(Initiator::getSession)
00106 
00107   Sessions::iterator i = m_sessions.find( sessionID );
00108   if ( i != m_sessions.end() )
00109   {
00110     i->second->setResponder( &responder );
00111     return i->second;
00112   }
00113   return 0;
00114 
00115   QF_STACK_POP
00116 }

const std::set<SessionID>& FIX::Initiator::getSessions (  )  const [inline]

Definition at line 76 of file Initiator.h.

References m_sessionIDs.

00076 { return m_sessionIDs; }

const Dictionary *const FIX::Initiator::getSessionSettings ( const SessionID sessionID  )  const

Definition at line 130 of file Initiator.cpp.

References FIX::SessionSettings::get(), m_settings, QF_STACK_POP, and QF_STACK_PUSH.

Referenced by FIX::Acceptor::getSessionSettings().

00131 { QF_STACK_PUSH(Initiator::getSessionSettings)
00132 
00133   try
00134   {
00135     return &m_settings.get( sessionID );
00136   }
00137   catch( ConfigError& )
00138   {
00139     return 0;
00140   }
00141 
00142   QF_STACK_POP
00143 }

bool FIX::Initiator::has ( const SessionID id  )  [inline]

Definition at line 80 of file Initiator.h.

References m_sessions.

00081   { return m_sessions.find( id ) != m_sessions.end(); }

void FIX::Initiator::initialize (  )  throw ( ConfigError ) [private]

Definition at line 62 of file Initiator.cpp.

References FIX::SessionFactory::create(), FIX::SessionSettings::get(), FIX::SessionSettings::getSessions(), FIX::Dictionary::getString(), m_application, m_messageStoreFactory, m_pLogFactory, m_sessionIDs, m_sessions, m_settings, QF_STACK_POP, QF_STACK_PUSH, and setDisconnected().

00063 { QF_STACK_PUSH(Initiator::initialize)
00064 
00065   std::set < SessionID > sessions = m_settings.getSessions();
00066   std::set < SessionID > ::iterator i;
00067 
00068   if ( !sessions.size() )
00069     throw ConfigError( "No sessions defined" );
00070 
00071   SessionFactory factory( m_application, m_messageStoreFactory,
00072                           m_pLogFactory );
00073 
00074   for ( i = sessions.begin(); i != sessions.end(); ++i )
00075   {
00076     if ( m_settings.get( *i ).getString( "ConnectionType" ) == "initiator" )
00077     {
00078       m_sessionIDs.insert( *i );
00079       m_sessions[ *i ] = factory.create( *i, m_settings.get( *i ) );
00080       setDisconnected( *i );
00081     }
00082   }
00083 
00084   if ( !m_sessions.size() )
00085     throw ConfigError( "No sessions defined for initiator" );
00086 
00087   QF_STACK_POP
00088 }

bool FIX::Initiator::isConnected ( const SessionID sessionID  )  [protected]

Definition at line 207 of file Initiator.cpp.

References m_connected, m_mutex, QF_STACK_POP, and QF_STACK_PUSH.

00208 { QF_STACK_PUSH(Initiator::isConnected)
00209 
00210   Locker l(m_mutex);
00211   return m_connected.find( sessionID ) != m_connected.end();
00212 
00213   QF_STACK_POP
00214 }

bool FIX::Initiator::isDisconnected ( const SessionID sessionID  )  [protected]

Definition at line 216 of file Initiator.cpp.

References m_disconnected, m_mutex, QF_STACK_POP, and QF_STACK_PUSH.

00217 { QF_STACK_PUSH(Initiator::isDisconnected)
00218 
00219   Locker l(m_mutex);
00220   return m_disconnected.find( sessionID ) != m_disconnected.end();
00221 
00222   QF_STACK_POP
00223 }

bool FIX::Initiator::isLoggedOn (  ) 

Check to see if any sessions are currently logged on.

Definition at line 314 of file Initiator.cpp.

References FIX::Session::isLoggedOn(), FIX::Session::lookupSession(), m_connected, m_mutex, QF_STACK_POP, and QF_STACK_PUSH.

Referenced by FIX::SocketInitiator::onPoll(), FIX::SocketInitiator::onStart(), FIX::ThreadedSocketInitiator::onStop(), and stop().

00315 { QF_STACK_PUSH(Initiator::isLoggedOn)
00316 
00317   Locker l(m_mutex);
00318 
00319   SessionIDs connected = m_connected;
00320   SessionIDs::iterator i = connected.begin();
00321   for ( ; i != connected.end(); ++i )
00322   {
00323     if( Session::lookupSession(*i)->isLoggedOn() )
00324       return true;
00325   }
00326   return false;
00327 
00328   QF_STACK_POP
00329 }

bool FIX::Initiator::isPending ( const SessionID sessionID  )  [protected]

Definition at line 198 of file Initiator.cpp.

References m_mutex, m_pending, QF_STACK_POP, and QF_STACK_PUSH.

00199 { QF_STACK_PUSH(Initiator::isPending)
00200 
00201   Locker l(m_mutex);
00202   return m_pending.find( sessionID ) != m_pending.end();
00203 
00204   QF_STACK_POP
00205 }

bool FIX::Initiator::isStopped (  )  [inline]

Definition at line 83 of file Initiator.h.

References m_stop.

Referenced by FIX::SocketInitiator::onPoll(), FIX::ThreadedSocketInitiator::onStart(), FIX::SocketInitiator::onStart(), and stop().

00083 { return m_stop; }

virtual void FIX::Initiator::onConfigure ( const SessionSettings  )  throw ( ConfigError ) [inline, private, virtual]

Implemented to configure acceptor.

Reimplemented in FIX::SocketInitiator, and FIX::ThreadedSocketInitiator.

Definition at line 110 of file Initiator.h.

Referenced by block(), and start().

00110 {};

virtual void FIX::Initiator::onInitialize ( const SessionSettings  )  throw ( RuntimeError ) [inline, private, virtual]

Implemented to initialize initiator.

Reimplemented in FIX::SocketInitiator, and FIX::ThreadedSocketInitiator.

Definition at line 112 of file Initiator.h.

Referenced by block(), and start().

00112 {};

virtual bool FIX::Initiator::onPoll ( double  timeout  )  [private, pure virtual]

Implemented to connect and poll for events.

Implemented in FIX::SocketInitiator, and FIX::ThreadedSocketInitiator.

virtual void FIX::Initiator::onStart (  )  [private, pure virtual]

Implemented to start connecting to targets.

Implemented in FIX::SocketInitiator, and FIX::ThreadedSocketInitiator.

virtual void FIX::Initiator::onStop (  )  [private, pure virtual]

Implemented to stop a running initiator.

Implemented in FIX::SocketInitiator, and FIX::ThreadedSocketInitiator.

Referenced by stop().

bool FIX::Initiator::poll ( double  timeout = 0.0  )  throw ( ConfigError, RuntimeError )

Poll the initiator.

Definition at line 253 of file Initiator.cpp.

References QF_STACK_POP, and QF_STACK_PUSH.

00254 { QF_STACK_PUSH(Initiator::poll)
00255 
00256   if( m_firstPoll )
00257   {
00258     onConfigure( m_settings );
00259     onInitialize( m_settings );
00260     m_firstPoll = false;
00261   }
00262 
00263   return onPoll( timeout );
00264 
00265   QF_STACK_POP
00266 }

void FIX::Initiator::setConnected ( const SessionID sessionID  )  [protected]

Definition at line 174 of file Initiator.cpp.

References m_connected, m_disconnected, m_mutex, m_pending, QF_STACK_POP, and QF_STACK_PUSH.

Referenced by FIX::SocketInitiator::onConnect().

00175 { QF_STACK_PUSH(Initiator::setConnected)
00176 
00177   Locker l(m_mutex);
00178 
00179   m_pending.erase( sessionID );
00180   m_connected.insert( sessionID );
00181   m_disconnected.erase( sessionID );
00182 
00183   QF_STACK_POP
00184 }

void FIX::Initiator::setDisconnected ( const SessionID sessionID  )  [protected]

Definition at line 186 of file Initiator.cpp.

References m_connected, m_disconnected, m_mutex, m_pending, QF_STACK_POP, and QF_STACK_PUSH.

Referenced by FIX::ThreadedSocketInitiator::doConnect(), initialize(), FIX::SocketInitiator::onDisconnect(), and stop().

00187 { QF_STACK_PUSH(Initiator::setDisconnected)
00188 
00189   Locker l(m_mutex);
00190 
00191   m_pending.erase( sessionID );
00192   m_connected.erase( sessionID );
00193   m_disconnected.insert( sessionID );
00194 
00195   QF_STACK_POP
00196 }

void FIX::Initiator::setPending ( const SessionID sessionID  )  [protected]

Definition at line 162 of file Initiator.cpp.

References m_connected, m_disconnected, m_mutex, m_pending, QF_STACK_POP, and QF_STACK_PUSH.

Referenced by FIX::ThreadedSocketInitiator::doConnect(), and FIX::SocketInitiator::doConnect().

00163 { QF_STACK_PUSH(Initiator::setPending)
00164 
00165   Locker l(m_mutex);
00166 
00167   m_pending.insert( sessionID );
00168   m_connected.erase( sessionID );
00169   m_disconnected.erase( sessionID );
00170 
00171   QF_STACK_POP
00172 }

void FIX::Initiator::start (  )  throw ( ConfigError, RuntimeError )

Start initiator.

Definition at line 225 of file Initiator.cpp.

References m_settings, m_stop, m_threadid, onConfigure(), onInitialize(), QF_STACK_POP, QF_STACK_PUSH, FIX::HttpServer::startGlobal(), startThread(), and FIX::thread_spawn().

Referenced by FIX::SocketInitiator::onPoll(), FIX::SocketInitiator::onStart(), and FIX::ThreadedSocketInitiator::onStop().

00226 { QF_STACK_PUSH(Initiator::start)
00227 
00228   m_stop = false;
00229   onConfigure( m_settings );
00230   onInitialize( m_settings );
00231 
00232   HttpServer::startGlobal( m_settings );
00233 
00234   if( !thread_spawn( &startThread, this, m_threadid ) )
00235     throw RuntimeError("Unable to spawn thread");
00236 
00237   QF_STACK_POP
00238 }

THREAD_PROC FIX::Initiator::startThread ( void *  p  )  [static, private]

Definition at line 331 of file Initiator.cpp.

References QF_STACK_CATCH, QF_STACK_POP, QF_STACK_PUSH, and QF_STACK_TRY.

Referenced by block(), and start().

00332 { QF_STACK_TRY
00333   QF_STACK_PUSH(Initiator::startThread)
00334 
00335   Initiator * pInitiator = static_cast < Initiator* > ( p );
00336   pInitiator->onStart();
00337   return 0;
00338 
00339   QF_STACK_POP
00340   QF_STACK_CATCH
00341 }

void FIX::Initiator::stop ( bool  force = false  ) 

Stop initiator.

Definition at line 268 of file Initiator.cpp.

References FIX::Session::getSessionID(), FIX::Session::isEnabled(), isLoggedOn(), isStopped(), FIX::Session::logout(), FIX::Session::lookupSession(), m_connected, m_mutex, m_stop, m_threadid, onStop(), FIX::process_sleep(), QF_STACK_POP, QF_STACK_PUSH, setDisconnected(), FIX::HttpServer::stopGlobal(), and FIX::thread_join().

00269 { QF_STACK_PUSH(Initiator::stop)
00270 
00271   if( isStopped() ) return;
00272 
00273   HttpServer::stopGlobal();
00274 
00275   std::vector<Session*> enabledSessions;
00276 
00277   SessionIDs connected = m_connected;
00278   SessionIDs::iterator i = connected.begin();
00279   for ( ; i != connected.end(); ++i )
00280   {
00281     Session* pSession = Session::lookupSession(*i);
00282     if( pSession->isEnabled() )
00283     {
00284       enabledSessions.push_back( pSession );
00285       pSession->logout();
00286     }
00287   }
00288 
00289   if( !force )
00290   {
00291     for ( int second = 1; second <= 10 && isLoggedOn(); ++second )
00292       process_sleep( 1 );
00293   }
00294 
00295   {
00296     Locker l(m_mutex);
00297     for ( i = connected.begin(); i != connected.end(); ++i )
00298       setDisconnected( Session::lookupSession(*i)->getSessionID() );
00299   }
00300 
00301   m_stop = true;
00302   onStop();
00303   if( m_threadid )
00304     thread_join( m_threadid );
00305   m_threadid = 0;
00306 
00307   std::vector<Session*>::iterator session = enabledSessions.begin();
00308   for( ; session != enabledSessions.end(); ++session )
00309     (*session)->logon();
00310 
00311   QF_STACK_POP
00312 }


Member Data Documentation

Definition at line 136 of file Initiator.h.

Referenced by getApplication(), and initialize().

Definition at line 131 of file Initiator.h.

Referenced by isConnected(), isLoggedOn(), setConnected(), setDisconnected(), setPending(), and stop().

Definition at line 132 of file Initiator.h.

Referenced by connect(), isDisconnected(), setConnected(), setDisconnected(), and setPending().

Definition at line 142 of file Initiator.h.

Definition at line 137 of file Initiator.h.

Referenced by getMessageStoreFactory(), and initialize().

Definition at line 141 of file Initiator.h.

Referenced by getLog().

Definition at line 130 of file Initiator.h.

Referenced by isPending(), setConnected(), setDisconnected(), and setPending().

Definition at line 140 of file Initiator.h.

Referenced by getLog(), and ~Initiator().

Definition at line 139 of file Initiator.h.

Referenced by initialize(), and ~Initiator().

Definition at line 129 of file Initiator.h.

Referenced by getSessions(), and initialize().

Definition at line 128 of file Initiator.h.

Referenced by getSession(), has(), initialize(), and ~Initiator().

Definition at line 133 of file Initiator.h.

Reimplemented in FIX::SocketInitiator, and FIX::ThreadedSocketInitiator.

Definition at line 138 of file Initiator.h.

Referenced by block(), connect(), getSessionSettings(), initialize(), and start().

bool FIX::Initiator::m_stop [private]

Reimplemented in FIX::SocketInitiator, and FIX::ThreadedSocketInitiator.

Definition at line 143 of file Initiator.h.

Referenced by block(), isStopped(), start(), and stop().

Definition at line 135 of file Initiator.h.

Referenced by start(), and stop().


The documentation for this class was generated from the following files:

Generated on Mon Apr 5 21:00:07 2010 for QuickFIX by doxygen 1.6.1 written by Dimitri van Heesch, © 1997-2001