Public Member Functions | Private Types | Private Member Functions | Private Attributes
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]

List of all members.

Public Member Functions

 SocketInitiator (Application &, MessageStoreFactory &, const SessionSettings &) throw ( ConfigError )
 SocketInitiator (Application &, MessageStoreFactory &, const SessionSettings &, LogFactory &) throw ( ConfigError )
virtual ~SocketInitiator ()

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 &)

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

Detailed Description

Socket implementation of Initiator.

Definition at line 36 of file SocketInitiator.h.


Member Typedef Documentation

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

Definition at line 48 of file SocketInitiator.h.

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

Definition at line 47 of file SocketInitiator.h.


Constructor & Destructor Documentation

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

Definition at line 32 of file SocketInitiator.cpp.

: Initiator( application, factory, settings ),
  m_connector( 1 ), m_lastConnect( 0 ),
  m_reconnectInterval( 30 ), m_noDelay( false ), m_sendBufSize( 0 ),
  m_rcvBufSize( 0 ) 
{
}
FIX::SocketInitiator::SocketInitiator ( Application application,
MessageStoreFactory factory,
const SessionSettings settings,
LogFactory logFactory 
) throw ( ConfigError )

Definition at line 43 of file SocketInitiator.cpp.

: Initiator( application, factory, settings, logFactory ),
  m_connector( 1 ), m_lastConnect( 0 ),
  m_reconnectInterval( 30 ), m_noDelay( false ), m_sendBufSize( 0 ),
  m_rcvBufSize( 0 )
{
}

Definition at line 55 of file SocketInitiator.cpp.

References m_connections, and m_pendingConnections.

{
  SocketConnections::iterator i;
  for (i = m_connections.begin();
       i != m_connections.end(); ++i)
    delete i->second;

  for (i = m_pendingConnections.begin();
       i != m_pendingConnections.end(); ++i)
    delete i->second;
}

Member Function Documentation

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

Implemented to connect a session to its target.

Implements FIX::Initiator.

Definition at line 131 of file SocketInitiator.cpp.

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().

{
  try
  {
    std::string address;
    short port = 0;
    Session* session = Session::lookupSession( s );
    if( !session->isSessionTime(UtcTimeStamp()) ) return;

    Log* log = session->getLog();

    getHost( s, d, address, port );

    log->onEvent( "Connecting to " + address + " on port " + IntConvertor::convert((unsigned short)port) );
    int result = m_connector.connect( address, port, m_noDelay, m_sendBufSize, m_rcvBufSize );
    setPending( s );

    m_pendingConnections[ result ] 
      = new SocketConnection( *this, s, result, &m_connector.getMonitor() );
  }
  catch ( std::exception& ) {}
}
void FIX::SocketInitiator::getHost ( const SessionID s,
const Dictionary d,
std::string &  address,
short &  port 
) [private]

Definition at line 231 of file SocketInitiator.cpp.

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

Referenced by doConnect().

{
  int num = 0;
  SessionToHostNum::iterator i = m_sessionToHostNum.find( s );
  if ( i != m_sessionToHostNum.end() ) num = i->second;

  std::stringstream hostStream;
  hostStream << SOCKET_CONNECT_HOST << num;
  std::string hostString = hostStream.str();

  std::stringstream portStream;
  portStream << SOCKET_CONNECT_PORT << num;
  std::string portString = portStream.str();

  if( d.has(hostString) && d.has(portString) )
  {
    address = d.getString( hostString );
    port = ( short ) d.getInt( portString );
  }
  else
  {
    num = 0;
    address = d.getString( SOCKET_CONNECT_HOST );
    port = ( short ) d.getInt( SOCKET_CONNECT_PORT );
  }

  m_sessionToHostNum[ s ] = ++num;
}
void FIX::SocketInitiator::onConfigure ( const SessionSettings ) throw ( ConfigError ) [private, virtual]

Implemented to configure acceptor.

Reimplemented from FIX::Initiator.

Definition at line 67 of file SocketInitiator.cpp.

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.

{
  const Dictionary& dict = s.get();

  if( dict.has( RECONNECT_INTERVAL ) )
    m_reconnectInterval = dict.getInt( RECONNECT_INTERVAL );
  if( dict.has( SOCKET_NODELAY ) )
    m_noDelay = dict.getBool( SOCKET_NODELAY );
  if( dict.has( SOCKET_SEND_BUFFER_SIZE ) )
    m_sendBufSize = dict.getInt( SOCKET_SEND_BUFFER_SIZE );
  if( dict.has( SOCKET_RECEIVE_BUFFER_SIZE ) )
    m_rcvBufSize = dict.getInt( SOCKET_RECEIVE_BUFFER_SIZE );
}
void FIX::SocketInitiator::onConnect ( SocketConnector ,
int  s 
) [private, virtual]

Implements FIX::SocketConnector::Strategy.

Definition at line 154 of file SocketInitiator.cpp.

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

{
  SocketConnections::iterator i = m_pendingConnections.find( s );
  if( i == m_pendingConnections.end() ) return;
  SocketConnection* pSocketConnection = i->second;
  
  m_connections[s] = pSocketConnection;
  m_pendingConnections.erase( i );
  setConnected( pSocketConnection->getSession()->getSessionID() );
  pSocketConnection->onTimeout();
}
bool FIX::SocketInitiator::onData ( SocketConnector connector,
int  s 
) [private, virtual]

Implements FIX::SocketConnector::Strategy.

Definition at line 175 of file SocketInitiator.cpp.

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

{
  SocketConnections::iterator i = m_connections.find( s );
  if ( i == m_connections.end() ) return false;
  SocketConnection* pSocketConnection = i->second;
  return pSocketConnection->read( connector );
}
void FIX::SocketInitiator::onDisconnect ( SocketConnector ,
int  s 
) [private, virtual]

Implements FIX::SocketConnector::Strategy.

Definition at line 183 of file SocketInitiator.cpp.

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

{
  SocketConnections::iterator i = m_connections.find( s );
  SocketConnections::iterator j = m_pendingConnections.find( s );

  SocketConnection* pSocketConnection = 0;
  if( i != m_connections.end() ) 
    pSocketConnection = i->second;
  if( j != m_pendingConnections.end() )
    pSocketConnection = j->second;
  if( !pSocketConnection )
    return;

  setDisconnected( pSocketConnection->getSession()->getSessionID() );

  Session* pSession = pSocketConnection->getSession();
  if ( pSession )
  {
    pSession->disconnect();
    setDisconnected( pSession->getSessionID() );
  }

  delete pSocketConnection;
  m_connections.erase( s );
  m_pendingConnections.erase( s );
}
void FIX::SocketInitiator::onError ( SocketConnector connector) [private, virtual]

Implements FIX::SocketConnector::Strategy.

Definition at line 210 of file SocketInitiator.cpp.

References onTimeout().

{
  onTimeout( connector );
}
void FIX::SocketInitiator::onInitialize ( const SessionSettings ) throw ( RuntimeError ) [private, virtual]

Implemented to initialize initiator.

Reimplemented from FIX::Initiator.

Definition at line 82 of file SocketInitiator.cpp.

{
}
bool FIX::SocketInitiator::onPoll ( double  timeout) [private, virtual]

Implemented to connect and poll for events.

Implements FIX::Initiator.

Definition at line 108 of file SocketInitiator.cpp.

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

{
  time_t start = 0;
  time_t now = 0;

  if( isStopped() )
  {
    if( start == 0 )
      ::time( &start );
    if( !isLoggedOn() )
      return false;
    if( ::time(&now) - 5 >= start )
      return false;
  }

  m_connector.block( *this, true, timeout );
  return true;
}
void FIX::SocketInitiator::onStart ( ) [private, virtual]

Implemented to start connecting to targets.

Implements FIX::Initiator.

Definition at line 87 of file SocketInitiator.cpp.

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

{
  connect();

  while ( !isStopped() ) {
    m_connector.block( *this, false, 1.0 );
    onTimeout( m_connector );
  }

  time_t start = 0;
  time_t now = 0;

  ::time( &start );
  while ( isLoggedOn() )
  {
    m_connector.block( *this );
    if( ::time(&now) -5 >= start )
      break;
  }
}
void FIX::SocketInitiator::onStop ( ) [private, virtual]

Implemented to stop a running initiator.

Implements FIX::Initiator.

Definition at line 127 of file SocketInitiator.cpp.

{
}
void FIX::SocketInitiator::onTimeout ( SocketConnector ) [private, virtual]

Reimplemented from FIX::SocketConnector::Strategy.

Definition at line 215 of file SocketInitiator.cpp.

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

Referenced by onError(), and onStart().

{
  time_t now;
  ::time( &now );

  if ( (now - m_lastConnect) >= m_reconnectInterval )
  {
    connect();
    m_lastConnect = now;
  }

  SocketConnections::iterator i;
  for ( i = m_connections.begin(); i != m_connections.end(); ++i )
    i->second->onTimeout();
}
void FIX::SocketInitiator::onWrite ( SocketConnector connector,
int  s 
) [private, virtual]

Implements FIX::SocketConnector::Strategy.

Definition at line 166 of file SocketInitiator.cpp.

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

{
  SocketConnections::iterator i = m_connections.find( s );
  if ( i == m_connections.end() ) return ;
  SocketConnection* pSocketConnection = i->second;
  if( pSocketConnection->processQueue() )
    pSocketConnection->unsignal();
}

Member Data Documentation

Definition at line 71 of file SocketInitiator.h.

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

Definition at line 69 of file SocketInitiator.h.

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

Definition at line 72 of file SocketInitiator.h.

Referenced by onTimeout().

Definition at line 74 of file SocketInitiator.h.

Referenced by doConnect().

Definition at line 70 of file SocketInitiator.h.

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

Definition at line 76 of file SocketInitiator.h.

Referenced by doConnect().

Definition at line 73 of file SocketInitiator.h.

Referenced by onTimeout().

Definition at line 75 of file SocketInitiator.h.

Referenced by doConnect().

Definition at line 68 of file SocketInitiator.h.

Referenced by getHost().

Reimplemented from FIX::Initiator.

Definition at line 67 of file SocketInitiator.h.


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

Generated on Mon Jun 23 2014 23:49:39 for QuickFIX by doxygen 1.7.6.1 written by Dimitri van Heesch, © 1997-2001