Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
FIX::SocketInitiator Class Reference

Socket implementation of Initiator. More...

#include <SocketInitiator.h>

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

Public Member Functions

 SocketInitiator (Application &, MessageStoreFactory &, const SessionSettings &) throw ( ConfigError )
 
 SocketInitiator (Application &, MessageStoreFactory &, const SessionSettings &, LogFactory &) throw ( ConfigError )
 
virtual ~SocketInitiator ()
 
- Public Member Functions inherited from FIX::Initiator
 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 ()
 

Private Types

typedef std::map< int, SocketConnection * > SocketConnections
 
typedef std::map< SessionID, int > SessionToHostNum
 

Private Member Functions

void onConfigure (const SessionSettings &) throw ( ConfigError )
 Implemented to configure acceptor.
 
void onInitialize (const SessionSettings &) throw ( RuntimeError )
 Implemented to initialize initiator.
 
void onStart ()
 Implemented to start connecting to targets.
 
bool onPoll (double timeout)
 Implemented to connect and poll for events.
 
void onStop ()
 Implemented to stop a running initiator.
 
void doConnect (const SessionID &, const Dictionary &d)
 Implemented to connect a session to its target.
 
void onConnect (SocketConnector &, int)
 
void onWrite (SocketConnector &, int)
 
bool onData (SocketConnector &, int)
 
void onDisconnect (SocketConnector &, int)
 
void onError (SocketConnector &)
 
void onTimeout (SocketConnector &)
 
void getHost (const SessionID &, const Dictionary &, std::string &, short &, std::string &, short &)
 
- Private Member Functions inherited from FIX::SocketConnector::Strategy
virtual ~Strategy ()
 

Private Attributes

SessionSettings m_settings
 
SessionToHostNum m_sessionToHostNum
 
SocketConnector m_connector
 
SocketConnections m_pendingConnections
 
SocketConnections m_connections
 
time_t m_lastConnect
 
int m_reconnectInterval
 
bool m_noDelay
 
int m_sendBufSize
 
int m_rcvBufSize
 

Additional Inherited Members

- Protected Member Functions inherited from FIX::Initiator
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 ()
 
- Protected Attributes inherited from FIX::Initiator
SessionSettings m_settings
 

Detailed Description

Socket implementation of Initiator.

Definition at line 36 of file SocketInitiator.h.

Member Typedef Documentation

◆ SessionToHostNum

typedef std::map< SessionID, int > FIX::SocketInitiator::SessionToHostNum
private

Definition at line 48 of file SocketInitiator.h.

◆ SocketConnections

typedef std::map< int, SocketConnection* > FIX::SocketInitiator::SocketConnections
private

Definition at line 47 of file SocketInitiator.h.

Constructor & Destructor Documentation

◆ SocketInitiator() [1/2]

FIX::SocketInitiator::SocketInitiator ( Application application,
MessageStoreFactory factory,
const SessionSettings settings 
)
throw (ConfigError
)

Definition at line 32 of file SocketInitiator.cpp.

36: Initiator( application, factory, settings ),
37 m_connector( 1 ), m_lastConnect( 0 ),
38 m_reconnectInterval( 30 ), m_noDelay( false ), m_sendBufSize( 0 ),
39 m_rcvBufSize( 0 )
40{
41}
Initiator(Application &, MessageStoreFactory &, const SessionSettings &)
Definition Initiator.cpp:36
SocketConnector m_connector

◆ SocketInitiator() [2/2]

FIX::SocketInitiator::SocketInitiator ( Application application,
MessageStoreFactory factory,
const SessionSettings settings,
LogFactory logFactory 
)
throw (ConfigError
)

Definition at line 43 of file SocketInitiator.cpp.

48: Initiator( application, factory, settings, logFactory ),
49 m_connector( 1 ), m_lastConnect( 0 ),
50 m_reconnectInterval( 30 ), m_noDelay( false ), m_sendBufSize( 0 ),
51 m_rcvBufSize( 0 )
52{
53}

◆ ~SocketInitiator()

FIX::SocketInitiator::~SocketInitiator ( )
virtual

Definition at line 55 of file SocketInitiator.cpp.

56{
57 SocketConnections::iterator i;
58 for (i = m_connections.begin();
59 i != m_connections.end(); ++i)
60 delete i->second;
61
62 for (i = m_pendingConnections.begin();
63 i != m_pendingConnections.end(); ++i)
64 delete i->second;
65}
SocketConnections m_pendingConnections
SocketConnections m_connections

References m_connections, and m_pendingConnections.

Member Function Documentation

◆ doConnect()

void FIX::SocketInitiator::doConnect ( const SessionID ,
const Dictionary  
)
privatevirtual

Implemented to connect a session to its target.

Implements FIX::Initiator.

Definition at line 131 of file SocketInitiator.cpp.

132{
133 try
134 {
135 std::string address;
136 short port = 0;
137 std::string sourceAddress;
138 short sourcePort = 0;
139
140 Session* session = Session::lookupSession( s );
141 if( !session->isSessionTime(UtcTimeStamp()) ) return;
142
143 Log* log = session->getLog();
144
145 getHost( s, d, address, port, sourceAddress, sourcePort );
146
147 log->onEvent( "Connecting to " + address + " on port " + IntConvertor::convert((unsigned short)port) + " (Source " + sourceAddress + ":" + IntConvertor::convert((unsigned short)sourcePort) + ")");
148 int result = m_connector.connect( address, port, m_noDelay, m_sendBufSize, m_rcvBufSize, sourceAddress, sourcePort );
149 setPending( s );
150
151 m_pendingConnections[ result ]
152 = new SocketConnection( *this, s, result, &m_connector.getMonitor() );
153 }
154 catch ( std::exception& ) {}
155}
void setPending(const SessionID &)
static Session * lookupSession(const SessionID &)
Definition Session.cpp:1496
int connect(const std::string &address, int port, bool noDelay, int sendBufSize, int rcvBufSize, const std::string &sourceAddress="", int sourcePort=0)
SocketMonitor & getMonitor()
void getHost(const SessionID &, const Dictionary &, std::string &, short &, std::string &, short &)
static std::string convert(signed_int value)

References FIX::SocketConnector::connect(), FIX::IntConvertor::convert(), getHost(), FIX::Session::getLog(), FIX::SocketConnector::getMonitor(), FIX::Session::isSessionTime(), FIX::Session::lookupSession(), m_connector, m_noDelay, m_pendingConnections, m_rcvBufSize, m_sendBufSize, FIX::Log::onEvent(), and FIX::Initiator::setPending().

◆ getHost()

void FIX::SocketInitiator::getHost ( const SessionID s,
const Dictionary d,
std::string &  address,
short &  port,
std::string &  sourceAddress,
short &  sourcePort 
)
private

Definition at line 234 of file SocketInitiator.cpp.

237{
238 int num = 0;
239 SessionToHostNum::iterator i = m_sessionToHostNum.find( s );
240 if ( i != m_sessionToHostNum.end() ) num = i->second;
241
242 std::stringstream hostStream;
243 hostStream << SOCKET_CONNECT_HOST << num;
244 std::string hostString = hostStream.str();
245
246 std::stringstream portStream;
247 portStream << SOCKET_CONNECT_PORT << num;
248 std::string portString = portStream.str();
249
250 sourcePort = 0;
251 sourceAddress.empty();
252
253 if( d.has(hostString) && d.has(portString) )
254 {
255 address = d.getString( hostString );
256 port = ( short ) d.getInt( portString );
257
258 std::stringstream sourceHostStream;
259 sourceHostStream << SOCKET_CONNECT_SOURCE_HOST << num;
260 hostString = sourceHostStream.str();
261 if( d.has(hostString) )
262 sourceAddress = d.getString( hostString );
263
264 std::stringstream sourcePortStream;
265 sourcePortStream << SOCKET_CONNECT_SOURCE_PORT << num;
266 portString = sourcePortStream.str();
267 if( d.has(portString) )
268 sourcePort = ( short ) d.getInt( portString );
269 }
270 else
271 {
272 num = 0;
273 address = d.getString( SOCKET_CONNECT_HOST );
274 port = ( short ) d.getInt( SOCKET_CONNECT_PORT );
275
276 if( d.has(SOCKET_CONNECT_SOURCE_HOST) )
277 sourceAddress = d.getString( SOCKET_CONNECT_SOURCE_HOST );
278 if( d.has(SOCKET_CONNECT_SOURCE_PORT) )
279 sourcePort = ( short ) d.getInt( SOCKET_CONNECT_SOURCE_PORT );
280 }
281
282 m_sessionToHostNum[ s ] = ++num;
283}
SessionToHostNum m_sessionToHostNum
const char SOCKET_CONNECT_PORT[]
const char SOCKET_CONNECT_HOST[]
const char SOCKET_CONNECT_SOURCE_PORT[]
const char SOCKET_CONNECT_SOURCE_HOST[]

References FIX::Dictionary::getInt(), FIX::Dictionary::getString(), FIX::Dictionary::has(), m_sessionToHostNum, FIX::SOCKET_CONNECT_HOST, FIX::SOCKET_CONNECT_PORT, FIX::SOCKET_CONNECT_SOURCE_HOST, and FIX::SOCKET_CONNECT_SOURCE_PORT.

Referenced by doConnect().

◆ onConfigure()

void FIX::SocketInitiator::onConfigure ( const SessionSettings )
throw (ConfigError
)
privatevirtual

Implemented to configure acceptor.

Reimplemented from FIX::Initiator.

Definition at line 67 of file SocketInitiator.cpp.

69{
70 const Dictionary& dict = s.get();
71
72 if( dict.has( RECONNECT_INTERVAL ) )
74 if( dict.has( SOCKET_NODELAY ) )
75 m_noDelay = dict.getBool( SOCKET_NODELAY );
76 if( dict.has( SOCKET_SEND_BUFFER_SIZE ) )
78 if( dict.has( SOCKET_RECEIVE_BUFFER_SIZE ) )
80}
const char SOCKET_SEND_BUFFER_SIZE[]
const char SOCKET_NODELAY[]
const char SOCKET_RECEIVE_BUFFER_SIZE[]
const char RECONNECT_INTERVAL[]

References FIX::Dictionary::getBool(), FIX::Dictionary::getInt(), FIX::Dictionary::has(), FIX::RECONNECT_INTERVAL, FIX::SOCKET_NODELAY, FIX::SOCKET_RECEIVE_BUFFER_SIZE, and FIX::SOCKET_SEND_BUFFER_SIZE.

◆ onConnect()

void FIX::SocketInitiator::onConnect ( SocketConnector ,
int  s 
)
privatevirtual

Implements FIX::SocketConnector::Strategy.

Definition at line 157 of file SocketInitiator.cpp.

158{
159 SocketConnections::iterator i = m_pendingConnections.find( s );
160 if( i == m_pendingConnections.end() ) return;
161 SocketConnection* pSocketConnection = i->second;
162
163 m_connections[s] = pSocketConnection;
164 m_pendingConnections.erase( i );
165 setConnected( pSocketConnection->getSession()->getSessionID() );
166 pSocketConnection->onTimeout();
167}
void setConnected(const SessionID &)

References FIX::SocketConnection::getSession(), FIX::Session::getSessionID(), m_connections, m_pendingConnections, FIX::SocketConnection::onTimeout(), and FIX::Initiator::setConnected().

◆ onData()

bool FIX::SocketInitiator::onData ( SocketConnector connector,
int  s 
)
privatevirtual

Implements FIX::SocketConnector::Strategy.

Definition at line 178 of file SocketInitiator.cpp.

179{
180 SocketConnections::iterator i = m_connections.find( s );
181 if ( i == m_connections.end() ) return false;
182 SocketConnection* pSocketConnection = i->second;
183 return pSocketConnection->read( connector );
184}

References m_connections, and FIX::SocketConnection::read().

◆ onDisconnect()

void FIX::SocketInitiator::onDisconnect ( SocketConnector ,
int  s 
)
privatevirtual

Implements FIX::SocketConnector::Strategy.

Definition at line 186 of file SocketInitiator.cpp.

187{
188 SocketConnections::iterator i = m_connections.find( s );
189 SocketConnections::iterator j = m_pendingConnections.find( s );
190
191 SocketConnection* pSocketConnection = 0;
192 if( i != m_connections.end() )
193 pSocketConnection = i->second;
194 if( j != m_pendingConnections.end() )
195 pSocketConnection = j->second;
196 if( !pSocketConnection )
197 return;
198
199 setDisconnected( pSocketConnection->getSession()->getSessionID() );
200
201 Session* pSession = pSocketConnection->getSession();
202 if ( pSession )
203 {
204 pSession->disconnect();
205 setDisconnected( pSession->getSessionID() );
206 }
207
208 delete pSocketConnection;
209 m_connections.erase( s );
210 m_pendingConnections.erase( s );
211}
void setDisconnected(const SessionID &)

References FIX::Session::disconnect(), FIX::SocketConnection::getSession(), FIX::Session::getSessionID(), m_connections, m_pendingConnections, and FIX::Initiator::setDisconnected().

◆ onError()

void FIX::SocketInitiator::onError ( SocketConnector connector)
privatevirtual

Implements FIX::SocketConnector::Strategy.

Definition at line 213 of file SocketInitiator.cpp.

214{
215 onTimeout( connector );
216}
void onTimeout(SocketConnector &)

References onTimeout().

◆ onInitialize()

void FIX::SocketInitiator::onInitialize ( const SessionSettings )
throw (RuntimeError
)
privatevirtual

Implemented to initialize initiator.

Reimplemented from FIX::Initiator.

Definition at line 82 of file SocketInitiator.cpp.

84{
85}

◆ onPoll()

bool FIX::SocketInitiator::onPoll ( double  timeout)
privatevirtual

Implemented to connect and poll for events.

Implements FIX::Initiator.

Definition at line 108 of file SocketInitiator.cpp.

109{
110 time_t start = 0;
111 time_t now = 0;
112
113 if( isStopped() )
114 {
115 if( start == 0 )
116 ::time( &start );
117 if( !isLoggedOn() )
118 return false;
119 if( ::time(&now) - 5 >= start )
120 return false;
121 }
122
123 m_connector.block( *this, true, timeout );
124 return true;
125}
bool isLoggedOn()
Check to see if any sessions are currently logged on.
void start()
Start initiator.
bool isStopped()
Definition Initiator.h:83
void block(Strategy &strategy, bool poll=0, double timeout=0.0)

References FIX::SocketConnector::block(), FIX::Initiator::isLoggedOn(), FIX::Initiator::isStopped(), m_connector, and FIX::Initiator::start().

◆ onStart()

void FIX::SocketInitiator::onStart ( )
privatevirtual

Implemented to start connecting to targets.

Implements FIX::Initiator.

Definition at line 87 of file SocketInitiator.cpp.

88{
89 connect();
90
91 while ( !isStopped() ) {
92 m_connector.block( *this, false, 1.0 );
94 }
95
96 time_t start = 0;
97 time_t now = 0;
98
99 ::time( &start );
100 while ( isLoggedOn() )
101 {
102 m_connector.block( *this );
103 if( ::time(&now) -5 >= start )
104 break;
105 }
106}

References FIX::SocketConnector::block(), FIX::Initiator::connect(), FIX::Initiator::isLoggedOn(), FIX::Initiator::isStopped(), m_connector, onTimeout(), and FIX::Initiator::start().

◆ onStop()

void FIX::SocketInitiator::onStop ( )
privatevirtual

Implemented to stop a running initiator.

Implements FIX::Initiator.

Definition at line 127 of file SocketInitiator.cpp.

128{
129}

◆ onTimeout()

void FIX::SocketInitiator::onTimeout ( SocketConnector )
privatevirtual

Reimplemented from FIX::SocketConnector::Strategy.

Definition at line 218 of file SocketInitiator.cpp.

219{
220 time_t now;
221 ::time( &now );
222
223 if ( (now - m_lastConnect) >= m_reconnectInterval )
224 {
225 connect();
226 m_lastConnect = now;
227 }
228
229 SocketConnections::iterator i;
230 for ( i = m_connections.begin(); i != m_connections.end(); ++i )
231 i->second->onTimeout();
232}

References FIX::Initiator::connect(), m_connections, m_lastConnect, and m_reconnectInterval.

Referenced by onError(), and onStart().

◆ onWrite()

void FIX::SocketInitiator::onWrite ( SocketConnector connector,
int  s 
)
privatevirtual

Implements FIX::SocketConnector::Strategy.

Definition at line 169 of file SocketInitiator.cpp.

170{
171 SocketConnections::iterator i = m_connections.find( s );
172 if ( i == m_connections.end() ) return ;
173 SocketConnection* pSocketConnection = i->second;
174 if( pSocketConnection->processQueue() )
175 pSocketConnection->unsignal();
176}

References m_connections, FIX::SocketConnection::processQueue(), and FIX::SocketConnection::unsignal().

Member Data Documentation

◆ m_connections

SocketConnections FIX::SocketInitiator::m_connections
private

Definition at line 71 of file SocketInitiator.h.

Referenced by onConnect(), onData(), onDisconnect(), onTimeout(), onWrite(), and ~SocketInitiator().

◆ m_connector

SocketConnector FIX::SocketInitiator::m_connector
private

Definition at line 69 of file SocketInitiator.h.

Referenced by doConnect(), onPoll(), and onStart().

◆ m_lastConnect

time_t FIX::SocketInitiator::m_lastConnect
private

Definition at line 72 of file SocketInitiator.h.

Referenced by onTimeout().

◆ m_noDelay

bool FIX::SocketInitiator::m_noDelay
private

Definition at line 74 of file SocketInitiator.h.

Referenced by doConnect().

◆ m_pendingConnections

SocketConnections FIX::SocketInitiator::m_pendingConnections
private

Definition at line 70 of file SocketInitiator.h.

Referenced by doConnect(), onConnect(), onDisconnect(), and ~SocketInitiator().

◆ m_rcvBufSize

int FIX::SocketInitiator::m_rcvBufSize
private

Definition at line 76 of file SocketInitiator.h.

Referenced by doConnect().

◆ m_reconnectInterval

int FIX::SocketInitiator::m_reconnectInterval
private

Definition at line 73 of file SocketInitiator.h.

Referenced by onTimeout().

◆ m_sendBufSize

int FIX::SocketInitiator::m_sendBufSize
private

Definition at line 75 of file SocketInitiator.h.

Referenced by doConnect().

◆ m_sessionToHostNum

SessionToHostNum FIX::SocketInitiator::m_sessionToHostNum
private

Definition at line 68 of file SocketInitiator.h.

Referenced by getHost().

◆ m_settings

SessionSettings FIX::SocketInitiator::m_settings
private

Definition at line 67 of file SocketInitiator.h.


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

Generated on Fri Sep 27 2024 13:45:21 for QuickFIX by doxygen 1.9.8 written by Dimitri van Heesch, © 1997-2001