Initiator.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 ** Copyright (c) 2001-2014
3 **
4 ** This file is part of the QuickFIX FIX Engine
5 **
6 ** This file may be distributed under the terms of the quickfixengine.org
7 ** license as defined by quickfixengine.org and appearing in the file
8 ** LICENSE included in the packaging of this file.
9 **
10 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
11 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
12 **
13 ** See http://www.quickfixengine.org/LICENSE for licensing information.
14 **
15 ** Contact ask@quickfixengine.org if any conditions of this licensing are
16 ** not clear to you.
17 **
18 ****************************************************************************/
19 
20 #ifdef _MSC_VER
21 #include "stdafx.h"
22 #else
23 #include "config.h"
24 #endif
25 
26 #include "Initiator.h"
27 #include "Utility.h"
28 #include "Session.h"
29 #include "SessionFactory.h"
30 #include "HttpServer.h"
31 #include <algorithm>
32 #include <fstream>
33 
34 namespace FIX
35 {
36 Initiator::Initiator( Application& application,
37  MessageStoreFactory& messageStoreFactory,
38  const SessionSettings& settings ) throw( ConfigError )
39 : m_threadid( 0 ),
40  m_application( application ),
41  m_messageStoreFactory( messageStoreFactory ),
42  m_settings( settings ),
43  m_pLogFactory( 0 ),
44  m_pLog( 0 ),
45  m_firstPoll( true ),
46  m_stop( true )
47 { initialize(); }
48 
49 Initiator::Initiator( Application& application,
50  MessageStoreFactory& messageStoreFactory,
51  const SessionSettings& settings,
52  LogFactory& logFactory ) throw( ConfigError )
53 : m_threadid( 0 ),
54  m_application( application ),
55  m_messageStoreFactory( messageStoreFactory ),
56  m_settings( settings ),
57  m_pLogFactory( &logFactory ),
58  m_pLog( logFactory.create() ),
59  m_firstPoll( true ),
60  m_stop( true )
61 { initialize(); }
62 
63 void Initiator::initialize() throw ( ConfigError )
64 {
65  std::set < SessionID > sessions = m_settings.getSessions();
66  std::set < SessionID > ::iterator i;
67 
68  if ( !sessions.size() )
69  throw ConfigError( "No sessions defined" );
70 
72  m_pLogFactory );
73 
74  for ( i = sessions.begin(); i != sessions.end(); ++i )
75  {
76  if ( m_settings.get( *i ).getString( "ConnectionType" ) == "initiator" )
77  {
78  m_sessionIDs.insert( *i );
79  m_sessions[ *i ] = factory.create( *i, m_settings.get( *i ) );
81  }
82  }
83 
84  if ( !m_sessions.size() )
85  throw ConfigError( "No sessions defined for initiator" );
86 }
87 
89 {
90  Sessions::iterator i;
91  for ( i = m_sessions.begin(); i != m_sessions.end(); ++i )
92  delete i->second;
93 
94  if( m_pLogFactory && m_pLog )
96 }
97 
98 Session* Initiator::getSession( const SessionID& sessionID,
99  Responder& responder )
100 {
101  Sessions::iterator i = m_sessions.find( sessionID );
102  if ( i != m_sessions.end() )
103  {
104  i->second->setResponder( &responder );
105  return i->second;
106  }
107  return 0;
108 }
109 
110 Session* Initiator::getSession( const SessionID& sessionID ) const
111 {
112  Sessions::const_iterator i = m_sessions.find( sessionID );
113  if( i != m_sessions.end() )
114  return i->second;
115  else
116  return 0;
117 }
118 
119 const Dictionary* const Initiator::getSessionSettings( const SessionID& sessionID ) const
120 {
121  try
122  {
123  return &m_settings.get( sessionID );
124  }
125  catch( ConfigError& )
126  {
127  return 0;
128  }
129 }
130 
131 void Initiator::connect()
132 {
133  Locker l(m_mutex);
134 
135  SessionIDs disconnected = m_disconnected;
136  SessionIDs::iterator i = disconnected.begin();
137  for ( ; i != disconnected.end(); ++i )
138  {
139  Session* pSession = Session::lookupSession( *i );
140  if ( pSession->isEnabled() && pSession->isSessionTime(UtcTimeStamp()) )
141  doConnect( *i, m_settings.get( *i ));
142  }
143 }
144 
145 void Initiator::setPending( const SessionID& sessionID )
146 {
147  Locker l(m_mutex);
148 
149  m_pending.insert( sessionID );
150  m_connected.erase( sessionID );
151  m_disconnected.erase( sessionID );
152 }
153 
154 void Initiator::setConnected( const SessionID& sessionID )
155 {
156  Locker l(m_mutex);
157 
158  m_pending.erase( sessionID );
159  m_connected.insert( sessionID );
160  m_disconnected.erase( sessionID );
161 }
162 
163 void Initiator::setDisconnected( const SessionID& sessionID )
164 {
165  Locker l(m_mutex);
166 
167  m_pending.erase( sessionID );
168  m_connected.erase( sessionID );
169  m_disconnected.insert( sessionID );
170 }
171 
172 bool Initiator::isPending( const SessionID& sessionID )
173 {
174  Locker l(m_mutex);
175  return m_pending.find( sessionID ) != m_pending.end();
176 }
177 
178 bool Initiator::isConnected( const SessionID& sessionID )
179 {
181  return m_connected.find( sessionID ) != m_connected.end();
182 }
183 
184 bool Initiator::isDisconnected( const SessionID& sessionID )
185 {
186  Locker l(m_mutex);
187  return m_disconnected.find( sessionID ) != m_disconnected.end();
188 }
189 
190 void Initiator::start() throw ( ConfigError, RuntimeError )
191 {
192  m_stop = false;
195 
197 
198  if( !thread_spawn( &startThread, this, m_threadid ) )
199  throw RuntimeError("Unable to spawn thread");
200 }
201 
202 
203 void Initiator::block() throw ( ConfigError, RuntimeError )
204 {
205  m_stop = false;
208 
209  startThread(this);
210 }
211 
212 bool Initiator::poll( double timeout ) throw ( ConfigError, RuntimeError )
213 {
214  if( m_firstPoll )
215  {
216  m_stop = false;
217  onConfigure( m_settings );
218  onInitialize( m_settings );
219  connect();
220  m_firstPoll = false;
221  }
222 
223  return onPoll( timeout );
224 }
225 
226 void Initiator::stop( bool force )
227 {
228  if( isStopped() ) return;
229 
231 
232  std::vector<Session*> enabledSessions;
233 
234  SessionIDs connected;
235 
236  {
237  Locker l(m_mutex);
238  connected = m_connected;
239  }
240 
241  SessionIDs::iterator i = connected.begin();
242  for ( ; i != connected.end(); ++i )
243  {
244  Session* pSession = Session::lookupSession(*i);
245  if( pSession && pSession->isEnabled() )
246  {
247  enabledSessions.push_back( pSession );
248  pSession->logout();
249  }
250  }
251 
252  if( !force )
253  {
254  for ( int second = 1; second <= 10 && isLoggedOn(); ++second )
255  process_sleep( 1 );
256  }
257 
258  {
259  Locker l(m_mutex);
260  for ( i = connected.begin(); i != connected.end(); ++i )
262  }
263 
264  m_stop = true;
265  onStop();
266  if( m_threadid )
268  m_threadid = 0;
269 
270  std::vector<Session*>::iterator session = enabledSessions.begin();
271  for( ; session != enabledSessions.end(); ++session )
272  (*session)->logon();
273 }
274 
276 {
277  Locker l(m_mutex);
278 
279  SessionIDs connected = m_connected;
280  SessionIDs::iterator i = connected.begin();
281  for ( ; i != connected.end(); ++i )
282  {
284  return true;
285  }
286  return false;
287 }
288 
290 {
291  Initiator * pInitiator = static_cast < Initiator* > ( p );
292  pInitiator->onStart();
293  return 0;
294 }
295 }
HttpServer.h
FIX::Initiator::start
void start()
Start initiator.
Definition: Initiator.cpp:207
FIX::Initiator::SessionIDs
std::set< SessionID > SessionIDs
Definition: Initiator.h:141
FIX::Initiator::m_stop
bool m_stop
Definition: Initiator.h:162
FIX::Initiator::stop
void stop(bool force=false)
Stop initiator.
Definition: Initiator.cpp:243
FIX::Initiator::m_disconnected
SessionIDs m_disconnected
Definition: Initiator.h:149
FIX::Session::lookupSession
static Session * lookupSession(const SessionID &)
Definition: Session.cpp:1513
Initiator.h
SessionFactory.h
FIX::UtcTimeStamp
Date and Time represented in UTC.
Definition: FieldTypes.h:599
FIX::Initiator::m_pLogFactory
LogFactory * m_pLogFactory
Definition: Initiator.h:158
FIX::Initiator::~Initiator
virtual ~Initiator()
Definition: Initiator.cpp:105
FIX::Dictionary::getString
std::string getString(const std::string &, bool capitalize=false) const
Get a value as a string.
Definition: Dictionary.cpp:49
FIX::Initiator::getSession
Session * getSession(const SessionID &sessionID, Responder &)
Definition: Initiator.cpp:115
FIX::Initiator::m_sessions
Sessions m_sessions
Definition: Initiator.h:145
FIX::Initiator::isDisconnected
bool isDisconnected(const SessionID &)
Definition: Initiator.cpp:201
FIX::Initiator::isPending
bool isPending(const SessionID &)
Definition: Initiator.cpp:189
FIX::Session::isSessionTime
bool isSessionTime(const UtcTimeStamp &time)
Definition: Session.h:142
FIX::Initiator::connect
void connect()
Definition: Initiator.cpp:148
FIX::Session::getSessionID
const SessionID & getSessionID() const
Definition: Session.h:109
FIX::Initiator::poll
bool poll(double timeout=0.0)
Poll the initiator.
Definition: Initiator.cpp:229
FIX::HttpServer::stopGlobal
static void stopGlobal()
Definition: HttpServer.cpp:70
FIX::Initiator::Initiator
Initiator(Application &, MessageStoreFactory &, const SessionSettings &)
Definition: Initiator.cpp:53
FIX::Initiator::m_pLog
Log * m_pLog
Definition: Initiator.h:159
FIX::ConfigError
Application is not configured correctly
Definition: Exceptions.h:104
FIX::RuntimeError
Application encountered serious error during runtime
Definition: Exceptions.h:111
FIX::SessionID
Unique session id consists of BeginString, SenderCompID and TargetCompID.
Definition: SessionID.h:47
FIX::Initiator::isLoggedOn
bool isLoggedOn()
Check to see if any sessions are currently logged on.
Definition: Initiator.cpp:292
FIX::Initiator::onStop
virtual void onStop()=0
Implemented to stop a running initiator.
FIX::Initiator::m_mutex
Mutex m_mutex
Definition: Initiator.h:163
FIX::Initiator::m_settings
SessionSettings m_settings
Definition: Initiator.h:156
THREAD_PROC
#define THREAD_PROC
Definition: Utility.h:184
FIX::SessionSettings::getSessions
std::set< SessionID > getSessions() const
Definition: SessionSettings.cpp:177
FIX::LogFactory::destroy
virtual void destroy(Log *)=0
FIX::Initiator::setDisconnected
void setDisconnected(const SessionID &)
Definition: Initiator.cpp:180
FIX::Initiator::m_messageStoreFactory
MessageStoreFactory & m_messageStoreFactory
Definition: Initiator.h:154
FIX::Initiator::m_sessionIDs
SessionIDs m_sessionIDs
Definition: Initiator.h:146
FIX::Session::isLoggedOn
bool isLoggedOn()
Definition: Session.h:99
FIX::Initiator::m_application
Application & m_application
Definition: Initiator.h:153
FIX::process_sleep
void process_sleep(double s)
Definition: Utility.cpp:483
FIX::Initiator::setPending
void setPending(const SessionID &)
Definition: Initiator.cpp:162
FIX::Initiator::initialize
void initialize()
Definition: Initiator.cpp:80
FIX::Initiator::m_threadid
thread_id m_threadid
Definition: Initiator.h:152
FIX::Session::isEnabled
bool isEnabled()
Definition: Session.h:93
FIX
Definition: Acceptor.cpp:34
FIX::Initiator::setConnected
void setConnected(const SessionID &)
Definition: Initiator.cpp:171
FIX::HttpServer::startGlobal
static void startGlobal(const SessionSettings &)
Definition: HttpServer.cpp:54
Session.h
FIX::Initiator::onInitialize
virtual void onInitialize(const SessionSettings &)
Implemented to initialize initiator.
Definition: Initiator.h:129
FIX::Initiator::getSessionSettings
const Dictionary *const getSessionSettings(const SessionID &sessionID) const
Definition: Initiator.cpp:136
FIX::Locker
Locks/Unlocks a mutex using RAII.
Definition: Mutex.h:112
FIX::thread_join
void thread_join(thread_id thread)
Definition: Utility.cpp:454
FIX::Initiator::doConnect
virtual void doConnect(const SessionID &, const Dictionary &)=0
Implemented to connect a session to its target.
FIX::Session::logout
void logout(const std::string &reason="")
Definition: Session.h:91
FIX::SessionFactory
Responsible for creating Session objects.
Definition: SessionFactory.h:63
FIX::Initiator::m_pending
SessionIDs m_pending
Definition: Initiator.h:147
FIX::Initiator::startThread
static THREAD_PROC startThread(void *p)
Definition: Initiator.cpp:306
FIX::Initiator::isStopped
bool isStopped()
Definition: Initiator.h:100
FIX::Initiator::m_connected
SessionIDs m_connected
Definition: Initiator.h:148
Utility.h
FIX::SessionSettings::get
const Dictionary & get(const SessionID &) const
Get a dictionary for a session.
Definition: SessionSettings.cpp:144
FIX::Dictionary
For storage and retrieval of key/value pairs.
Definition: Dictionary.h:53
FIX::Initiator::block
void block()
Block on the initiator.
Definition: Initiator.cpp:220
FIX::thread_spawn
bool thread_spawn(THREAD_START_ROUTINE func, void *var, thread_id &thread)
Definition: Utility.cpp:433
FIX::Initiator::onConfigure
virtual void onConfigure(const SessionSettings &)
Implemented to configure acceptor.
Definition: Initiator.h:127
FIX::Initiator::isConnected
bool isConnected(const SessionID &)
Definition: Initiator.cpp:195
FIX::Session
Maintains the state and implements the logic of a FIX session.
Definition: Session.h:62

Generated on Wed Apr 29 2020 19:41:30 for QuickFIX by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2001