00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef FIX_LOG_H
00023 #define FIX_LOG_H
00024
00025 #ifdef _MSC_VER
00026 #pragma warning( disable : 4503 4355 4786 4290 )
00027 #endif
00028
00029 #include "Message.h"
00030 #include "Mutex.h"
00031 #include "SessionSettings.h"
00032 #include <map>
00033 #include <vector>
00034
00035 namespace FIX
00036 {
00037 class Log;
00038
00042 class LogFactory
00043 {
00044 public:
00045 virtual ~LogFactory() {}
00046 virtual Log* create() = 0;
00047 virtual Log* create( const SessionID& ) = 0;
00048 virtual void destroy( Log* ) = 0;
00049 };
00050
00056 class ScreenLogFactory : public LogFactory
00057 {
00058 public:
00059 ScreenLogFactory( const SessionSettings& settings )
00060 : m_useSettings( true ), m_settings( settings ) {};
00061 ScreenLogFactory( bool incoming, bool outgoing, bool event )
00062 : m_incoming( incoming ), m_outgoing( outgoing ), m_event( event ), m_useSettings( false ) {}
00063
00064 Log* create();
00065 Log* create( const SessionID& );
00066 void destroy( Log* log );
00067
00068 private:
00069 void init( const Dictionary& settings, bool& incoming, bool& outgoing, bool& event );
00070
00071 bool m_incoming;
00072 bool m_outgoing;
00073 bool m_event;
00074 bool m_useSettings;
00075 SessionSettings m_settings;
00076 };
00077
00081 class Log
00082 {
00083 public:
00084 virtual ~Log() {}
00085
00086 virtual void clear() = 0;
00087 virtual void onIncoming( const std::string& ) = 0;
00088 virtual void onOutgoing( const std::string& ) = 0;
00089 virtual void onEvent( const std::string& ) = 0;
00090 };
00098 class ScreenLog : public Log
00099 {
00100 public:
00101 ScreenLog( bool incoming, bool outgoing, bool event )
00102 : m_prefix( "GLOBAL" ),
00103 m_incoming( incoming ), m_outgoing( outgoing ), m_event( event ) {}
00104
00105 ScreenLog( const SessionID& sessionID,
00106 bool incoming, bool outgoing, bool event )
00107 : m_prefix( sessionID.toString() ),
00108 m_incoming( incoming ), m_outgoing( outgoing ), m_event( event ) {}
00109
00110 void clear() {}
00111
00112 void onIncoming( const std::string& value )
00113 {
00114 if ( !m_incoming ) return ;
00115 Locker l( s_mutex );
00116 m_time.setCurrent();
00117 std::cout << "<" << UtcTimeStampConvertor::convert(m_time)
00118 << ", " << m_prefix
00119 << ", " << "incoming>" << std::endl
00120 << " (" << value << ")" << std::endl;
00121 }
00122
00123 void onOutgoing( const std::string& value )
00124 {
00125 if ( !m_outgoing ) return ;
00126 Locker l( s_mutex );
00127 m_time.setCurrent();
00128 std::cout << "<" << UtcTimeStampConvertor::convert(m_time)
00129 << ", " << m_prefix
00130 << ", " << "outgoing>" << std::endl
00131 << " (" << value << ")" << std::endl;
00132 }
00133 void onEvent( const std::string& value )
00134 {
00135 if ( !m_event ) return ;
00136 Locker l( s_mutex );
00137 m_time.setCurrent();
00138 std::cout << "<" << UtcTimeStampConvertor::convert(m_time)
00139 << ", " << m_prefix
00140 << ", " << "event>" << std::endl
00141 << " (" << value << ")" << std::endl;
00142 }
00143
00144 private:
00145 std::string m_prefix;
00146 UtcTimeStamp m_time;
00147 bool m_incoming;
00148 bool m_outgoing;
00149 bool m_event;
00150 static Mutex s_mutex;
00151 };
00152 }
00153
00154 #endif //FIX_LOG_H