![]() |
Base for classes which act as an initiator for establishing connections. More...
#include <Initiator.h>
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. | |
Session * | getSession (const SessionID &sessionID, Responder &) |
const std::set< SessionID > & | getSessions () const |
Session * | getSession (const SessionID &sessionID) const |
const Dictionary *const | getSessionSettings (const SessionID &sessionID) const |
bool | has (const SessionID &id) |
bool | isStopped () |
Application & | getApplication () |
MessageStoreFactory & | getMessageStoreFactory () |
Log * | getLog () |
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< SessionID > | SessionIDs |
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 |
Application & | m_application |
MessageStoreFactory & | m_messageStoreFactory |
SessionSettings | m_settings |
LogFactory * | m_pLogFactory |
Log * | m_pLog |
NullLog | m_nullLog |
bool | m_firstPoll |
bool | m_stop |
Mutex | m_mutex |
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.
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.
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 }
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().
MessageStoreFactory& FIX::Initiator::getMessageStoreFactory | ( | ) | [inline] |
Definition at line 87 of file Initiator.h.
References m_messageStoreFactory.
00088 { return m_messageStoreFactory; }
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 }
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] |
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.
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.
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 }
Application& FIX::Initiator::m_application [private] |
Definition at line 136 of file Initiator.h.
Referenced by getApplication(), and initialize().
SessionIDs FIX::Initiator::m_connected [private] |
Definition at line 131 of file Initiator.h.
Referenced by isConnected(), isLoggedOn(), setConnected(), setDisconnected(), setPending(), and stop().
SessionIDs FIX::Initiator::m_disconnected [private] |
Definition at line 132 of file Initiator.h.
Referenced by connect(), isDisconnected(), setConnected(), setDisconnected(), and setPending().
bool FIX::Initiator::m_firstPoll [private] |
Definition at line 142 of file Initiator.h.
Definition at line 137 of file Initiator.h.
Referenced by getMessageStoreFactory(), and initialize().
Mutex FIX::Initiator::m_mutex [private] |
Reimplemented in FIX::ThreadedSocketInitiator.
Definition at line 144 of file Initiator.h.
Referenced by connect(), isConnected(), isDisconnected(), isLoggedOn(), isPending(), setConnected(), setDisconnected(), setPending(), and stop().
NullLog FIX::Initiator::m_nullLog [private] |
Definition at line 141 of file Initiator.h.
Referenced by getLog().
SessionIDs FIX::Initiator::m_pending [private] |
Definition at line 130 of file Initiator.h.
Referenced by isPending(), setConnected(), setDisconnected(), and setPending().
Log* FIX::Initiator::m_pLog [private] |
Definition at line 140 of file Initiator.h.
Referenced by getLog(), and ~Initiator().
LogFactory* FIX::Initiator::m_pLogFactory [private] |
Definition at line 139 of file Initiator.h.
Referenced by initialize(), and ~Initiator().
SessionIDs FIX::Initiator::m_sessionIDs [private] |
Definition at line 129 of file Initiator.h.
Referenced by getSessions(), and initialize().
Sessions FIX::Initiator::m_sessions [private] |
Definition at line 128 of file Initiator.h.
Referenced by getSession(), has(), initialize(), and ~Initiator().
SessionState FIX::Initiator::m_sessionState [private] |
Definition at line 133 of file Initiator.h.
SessionSettings FIX::Initiator::m_settings [private] |
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().
thread_id FIX::Initiator::m_threadid [private] |
Definition at line 135 of file Initiator.h.