Initiator.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef FIX_INITIATOR_H
00023 #define FIX_INITIATOR_H
00024
00025 #ifdef _MSC_VER
00026 #pragma warning( disable : 4503 4355 4786 4290 )
00027 #endif
00028
00029 #include "Application.h"
00030 #include "MessageStore.h"
00031 #include "Log.h"
00032 #include "Responder.h"
00033 #include "SessionSettings.h"
00034 #include "Exceptions.h"
00035 #include "Mutex.h"
00036 #include "Session.h"
00037 #include <set>
00038 #include <map>
00039 #include <string>
00040
00041 namespace FIX
00042 {
00043 class Client;
00044
00051 class Initiator
00052 {
00053 public:
00054 Initiator( Application&, MessageStoreFactory&,
00055 const SessionSettings& ) throw( ConfigError );
00056 Initiator( Application&, MessageStoreFactory&,
00057 const SessionSettings&, LogFactory& ) throw( ConfigError );
00058
00059 virtual ~Initiator();
00060
00062 void start() throw ( ConfigError, RuntimeError );
00064 void block() throw ( ConfigError, RuntimeError );
00066 bool poll( double timeout = 0.0 ) throw ( ConfigError, RuntimeError );
00067
00069 void stop( bool force = false );
00070
00072 bool isLoggedOn();
00073
00074 Session* getSession( const SessionID& sessionID, Responder& );
00075
00076 const std::set<SessionID>& getSessions() const { return m_sessionIDs; }
00077 Session* getSession( const SessionID& sessionID ) const;
00078 const Dictionary* const getSessionSettings( const SessionID& sessionID ) const;
00079
00080 bool has( const SessionID& id )
00081 { return m_sessions.find( id ) != m_sessions.end(); }
00082
00083 bool isStopped() { return m_stop; }
00084
00085 public:
00086 Application& getApplication() { return m_application; }
00087 MessageStoreFactory& getMessageStoreFactory()
00088 { return m_messageStoreFactory; }
00089
00090 Log* getLog()
00091 {
00092 if( m_pLog ) return m_pLog;
00093 return &m_nullLog;
00094 }
00095
00096 protected:
00097 void setPending( const SessionID& );
00098 void setConnected( const SessionID& );
00099 void setDisconnected( const SessionID& );
00100
00101 bool isPending( const SessionID& );
00102 bool isConnected( const SessionID& );
00103 bool isDisconnected( const SessionID& );
00104 void connect();
00105
00106 private:
00107 void initialize() throw ( ConfigError );
00108
00110 virtual void onConfigure( const SessionSettings& ) throw ( ConfigError ) {};
00112 virtual void onInitialize( const SessionSettings& ) throw ( RuntimeError ) {};
00114 virtual void onStart() = 0;
00116 virtual bool onPoll( double timeout ) = 0;
00118 virtual void onStop() = 0;
00120 virtual void doConnect( const SessionID&, const Dictionary& ) = 0;
00121
00122 static THREAD_PROC startThread( void* p );
00123
00124 typedef std::set < SessionID > SessionIDs;
00125 typedef std::map < SessionID, int > SessionState;
00126 typedef std::map < SessionID, Session* > Sessions;
00127
00128 Sessions m_sessions;
00129 SessionIDs m_sessionIDs;
00130 SessionIDs m_pending;
00131 SessionIDs m_connected;
00132 SessionIDs m_disconnected;
00133 SessionState m_sessionState;
00134
00135 thread_id m_threadid;
00136 Application& m_application;
00137 MessageStoreFactory& m_messageStoreFactory;
00138 SessionSettings m_settings;
00139 LogFactory* m_pLogFactory;
00140 Log* m_pLog;
00141 NullLog m_nullLog;
00142 bool m_firstPoll;
00143 bool m_stop;
00144 Mutex m_mutex;
00145 };
00147 }
00148
00149 #endif // FIX_INITIATOR_H