Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes
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 36 of file Initiator.cpp.

: m_threadid( 0 ),
  m_application( application ),
  m_messageStoreFactory( messageStoreFactory ),
  m_settings( settings ),
  m_pLogFactory( 0 ),
  m_pLog( 0 ),
  m_firstPoll( true ),
  m_stop( true )
{ initialize(); }
FIX::Initiator::Initiator ( Application application,
MessageStoreFactory messageStoreFactory,
const SessionSettings settings,
LogFactory logFactory 
) throw ( ConfigError )

Definition at line 49 of file Initiator.cpp.

: m_threadid( 0 ),
  m_application( application ),
  m_messageStoreFactory( messageStoreFactory ),
  m_settings( settings ),
  m_pLogFactory( &logFactory ),
  m_pLog( logFactory.create() ),
  m_firstPoll( true ),
  m_stop( true )
{ initialize(); }

Definition at line 88 of file Initiator.cpp.

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

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

  if( m_pLogFactory && m_pLog )
    m_pLogFactory->destroy( m_pLog );
}

Member Function Documentation

Block on the initiator.

Definition at line 203 of file Initiator.cpp.

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

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

Definition at line 131 of file Initiator.cpp.

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

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

{
  Locker l(m_mutex);

  SessionIDs disconnected = m_disconnected;
  SessionIDs::iterator i = disconnected.begin();
  for ( ; i != disconnected.end(); ++i )
  {
    Session* pSession = Session::lookupSession( *i );
    if ( pSession->isEnabled() && pSession->isSessionTime(UtcTimeStamp()) )
      doConnect( *i, m_settings.get( *i ));
  }
}
virtual void FIX::Initiator::doConnect ( const SessionID ,
const Dictionary  
) [private, pure virtual]

Implemented to connect a session to its target.

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

Referenced by connect().

Definition at line 86 of file Initiator.h.

References m_application.

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

  { 
    if( m_pLog ) return m_pLog; 
    return &m_nullLog;
  }

Definition at line 87 of file Initiator.h.

References m_messageStoreFactory.

  { return m_messageStoreFactory; }
Session * FIX::Initiator::getSession ( const SessionID sessionID,
Responder responder 
)

Definition at line 98 of file Initiator.cpp.

References m_sessions.

{
  Sessions::iterator i = m_sessions.find( sessionID );
  if ( i != m_sessions.end() )
  {
    i->second->setResponder( &responder );
    return i->second;
  }
  return 0;
}
Session * FIX::Initiator::getSession ( const SessionID sessionID) const

Definition at line 110 of file Initiator.cpp.

References m_sessions.

{
  Sessions::const_iterator i = m_sessions.find( sessionID );
  if( i != m_sessions.end() )
    return i->second;
  else
    return 0;
}
const std::set<SessionID>& FIX::Initiator::getSessions ( ) const [inline]

Definition at line 76 of file Initiator.h.

References m_sessionIDs.

{ return m_sessionIDs; }
const Dictionary *const FIX::Initiator::getSessionSettings ( const SessionID sessionID) const

Definition at line 119 of file Initiator.cpp.

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

{
  try
  {
    return &m_settings.get( sessionID );
  }
  catch( ConfigError& )
  {
    return 0;
  }
}
bool FIX::Initiator::has ( const SessionID id) [inline]

Definition at line 80 of file Initiator.h.

References m_sessions.

  { return m_sessions.find( id ) != m_sessions.end(); }
void FIX::Initiator::initialize ( ) throw ( ConfigError ) [private]

Definition at line 63 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, and setDisconnected().

{
  std::set < SessionID > sessions = m_settings.getSessions();
  std::set < SessionID > ::iterator i;

  if ( !sessions.size() )
    throw ConfigError( "No sessions defined" );

  SessionFactory factory( m_application, m_messageStoreFactory,
                          m_pLogFactory );

  for ( i = sessions.begin(); i != sessions.end(); ++i )
  {
    if ( m_settings.get( *i ).getString( "ConnectionType" ) == "initiator" )
    {
      m_sessionIDs.insert( *i );
      m_sessions[ *i ] = factory.create( *i, m_settings.get( *i ) );
      setDisconnected( *i );
    }
  }

  if ( !m_sessions.size() )
    throw ConfigError( "No sessions defined for initiator" );
}
bool FIX::Initiator::isConnected ( const SessionID sessionID) [protected]

Definition at line 178 of file Initiator.cpp.

References m_connected, and m_mutex.

{
  Locker l(m_mutex);
  return m_connected.find( sessionID ) != m_connected.end();
}
bool FIX::Initiator::isDisconnected ( const SessionID sessionID) [protected]

Definition at line 184 of file Initiator.cpp.

References m_disconnected, and m_mutex.

{
  Locker l(m_mutex);
  return m_disconnected.find( sessionID ) != m_disconnected.end();
}

Check to see if any sessions are currently logged on.

Definition at line 269 of file Initiator.cpp.

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

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

{
  Locker l(m_mutex);

  SessionIDs connected = m_connected;
  SessionIDs::iterator i = connected.begin();
  for ( ; i != connected.end(); ++i )
  {
    if( Session::lookupSession(*i)->isLoggedOn() )
      return true;
  }
  return false;
}
bool FIX::Initiator::isPending ( const SessionID sessionID) [protected]

Definition at line 172 of file Initiator.cpp.

References m_mutex, and m_pending.

{
  Locker l(m_mutex);
  return m_pending.find( sessionID ) != m_pending.end();
}
bool FIX::Initiator::isStopped ( ) [inline]
virtual void FIX::Initiator::onConfigure ( const SessionSettings ) throw ( ConfigError ) [inline, private, virtual]

Implemented to configure acceptor.

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

Definition at line 110 of file Initiator.h.

Referenced by block(), and start().

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

Implemented to initialize initiator.

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

Definition at line 112 of file Initiator.h.

Referenced by block(), and start().

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

Implemented to connect and poll for events.

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

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

Implemented to start connecting to targets.

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

Referenced by startThread().

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

Implemented to stop a running initiator.

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

Referenced by stop().

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

Poll the initiator.

Definition at line 212 of file Initiator.cpp.

{
  if( m_firstPoll )
  {
    m_stop = false;
    onConfigure( m_settings );
    onInitialize( m_settings );
    connect();
    m_firstPoll = false;
  }

  return onPoll( timeout );
}
void FIX::Initiator::setConnected ( const SessionID sessionID) [protected]

Definition at line 154 of file Initiator.cpp.

References m_connected, m_disconnected, m_mutex, and m_pending.

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

{
  Locker l(m_mutex);

  m_pending.erase( sessionID );
  m_connected.insert( sessionID );
  m_disconnected.erase( sessionID );
}
void FIX::Initiator::setDisconnected ( const SessionID sessionID) [protected]

Definition at line 163 of file Initiator.cpp.

References m_connected, m_disconnected, m_mutex, and m_pending.

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

{
  Locker l(m_mutex);

  m_pending.erase( sessionID );
  m_connected.erase( sessionID );
  m_disconnected.insert( sessionID );
}
void FIX::Initiator::setPending ( const SessionID sessionID) [protected]

Definition at line 145 of file Initiator.cpp.

References m_connected, m_disconnected, m_mutex, and m_pending.

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

{
  Locker l(m_mutex);

  m_pending.insert( sessionID );
  m_connected.erase( sessionID );
  m_disconnected.erase( sessionID );
}
THREAD_PROC FIX::Initiator::startThread ( void *  p) [static, private]

Definition at line 283 of file Initiator.cpp.

References onStart().

Referenced by block(), and start().

{
  Initiator * pInitiator = static_cast < Initiator* > ( p );
  pInitiator->onStart();
  return 0;
}
void FIX::Initiator::stop ( bool  force = false)

Stop initiator.

Definition at line 226 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(), setDisconnected(), FIX::HttpServer::stopGlobal(), and FIX::thread_join().

{
  if( isStopped() ) return;

  HttpServer::stopGlobal();

  std::vector<Session*> enabledSessions;

  SessionIDs connected = m_connected;
  SessionIDs::iterator i = connected.begin();
  for ( ; i != connected.end(); ++i )
  {
    Session* pSession = Session::lookupSession(*i);
    if( pSession && pSession->isEnabled() )
    {
      enabledSessions.push_back( pSession );
      pSession->logout();
    }
  }

  if( !force )
  {
    for ( int second = 1; second <= 10 && isLoggedOn(); ++second )
      process_sleep( 1 );
  }

  {
    Locker l(m_mutex);
    for ( i = connected.begin(); i != connected.end(); ++i )
      setDisconnected( Session::lookupSession(*i)->getSessionID() );
  }

  m_stop = true;
  onStop();
  if( m_threadid )
    thread_join( m_threadid );
  m_threadid = 0;

  std::vector<Session*>::iterator session = enabledSessions.begin();
  for( ; session != enabledSessions.end(); ++session )
    (*session)->logon();
}

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::ThreadedSocketInitiator, and FIX::SocketInitiator.

Definition at line 138 of file Initiator.h.

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

bool FIX::Initiator::m_stop [private]

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 Jun 23 2014 23:49:39 for QuickFIX by doxygen 1.7.6.1 written by Dimitri van Heesch, © 1997-2001