00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifdef _MSC_VER
00021 #include "stdafx.h"
00022 #else
00023 #include "config.h"
00024 #endif
00025 #include "CallStack.h"
00026
00027 #include "SessionSettings.h"
00028 #include "Settings.h"
00029 #include "Values.h"
00030 #include <fstream>
00031
00032 namespace FIX
00033 {
00034 SessionSettings::SessionSettings( std::istream& stream )
00035 throw( ConfigError )
00036 {
00037 stream >> *this;
00038 }
00039
00040 SessionSettings::SessionSettings( const std::string& file )
00041 throw( ConfigError )
00042 {
00043 std::ifstream fstream( file.c_str() );
00044 if ( !fstream.is_open() )
00045 throw ConfigError( ( "File " + file + " not found" ).c_str() );
00046 fstream >> *this;
00047 }
00048
00049 std::istream& operator>>( std::istream& stream, SessionSettings& s )
00050 throw( ConfigError )
00051 {
00052 Settings settings;
00053 stream >> settings;
00054
00055 Settings::Sections section;
00056
00057 section = settings.get( "DEFAULT" );
00058 Dictionary def;
00059 if ( section.size() )
00060 def = section[ 0 ];
00061 s.set( def );
00062
00063 section = settings.get( "SESSION" );
00064 Settings::Sections::size_type session;
00065 Dictionary dict;
00066
00067 for ( session = 0; session < section.size(); ++session )
00068 {
00069 dict = section[ session ];
00070 dict.merge( def );
00071
00072 BeginString beginString
00073 ( dict.getString( BEGINSTRING ) );
00074 SenderCompID senderCompID
00075 ( dict.getString( SENDERCOMPID ) );
00076 TargetCompID targetCompID
00077 ( dict.getString( TARGETCOMPID ) );
00078
00079 std::string sessionQualifier;
00080 if( dict.has( SESSION_QUALIFIER ) )
00081 sessionQualifier = dict.getString( SESSION_QUALIFIER );
00082 SessionID sessionID( beginString, senderCompID, targetCompID, sessionQualifier );
00083 s.set( sessionID, dict );
00084 }
00085 return stream;
00086 }
00087
00088 const bool SessionSettings::has( const SessionID& sessionID ) const
00089 { QF_STACK_PUSH(SessionSettings::has)
00090 return m_settings.find( sessionID ) != m_settings.end();
00091 QF_STACK_POP
00092 }
00093
00094 const Dictionary& SessionSettings::get( const SessionID& sessionID ) const
00095 throw( ConfigError )
00096 { QF_STACK_PUSH(SessionSettings::get)
00097
00098 Dictionaries::const_iterator i;
00099 i = m_settings.find( sessionID );
00100 if ( i == m_settings.end() ) throw ConfigError( "Session not found" );
00101 return i->second;
00102
00103 QF_STACK_POP
00104 }
00105
00106 void SessionSettings::set( const SessionID& sessionID,
00107 Dictionary settings )
00108 throw( ConfigError )
00109 { QF_STACK_PUSH(SessionSettings::set)
00110
00111 settings.setString( BEGINSTRING, sessionID.getBeginString() );
00112 settings.setString( SENDERCOMPID, sessionID.getSenderCompID() );
00113 settings.setString( TARGETCOMPID, sessionID.getTargetCompID() );
00114
00115 settings.merge( m_defaults );
00116 validate( settings );
00117 m_settings[ sessionID ] = settings;
00118
00119 QF_STACK_POP
00120 }
00121
00122 void SessionSettings::set( const Dictionary& defaults ) throw( ConfigError )
00123 {
00124 m_defaults = defaults;
00125 Dictionaries::iterator i = m_settings.begin();
00126 for( i = m_settings.begin(); i != m_settings.end(); ++i )
00127 i->second.merge( defaults );
00128 }
00129
00130 std::set < SessionID > SessionSettings::getSessions() const
00131 { QF_STACK_PUSH(SessionSettings::getSessions)
00132
00133 std::set < SessionID > result;
00134 Dictionaries::const_iterator i;
00135 for ( i = m_settings.begin(); i != m_settings.end(); ++i )
00136 result.insert( i->first );
00137 return result;
00138
00139 QF_STACK_POP
00140 }
00141
00142 void SessionSettings::validate( const Dictionary& dictionary ) const
00143 throw( ConfigError )
00144 {
00145 std::string beginString = dictionary.getString( BEGINSTRING );
00146 if( beginString != BeginString_FIX40 &&
00147 beginString != BeginString_FIX41 &&
00148 beginString != BeginString_FIX42 &&
00149 beginString != BeginString_FIX43 &&
00150 beginString != BeginString_FIX44 )
00151 {
00152 throw ConfigError( std::string(BEGINSTRING) + " must be FIX.4.0 to FIX.4.4" );
00153 }
00154
00155 std::string connectionType = dictionary.getString( CONNECTION_TYPE );
00156 if( connectionType != "initiator" &&
00157 connectionType != "acceptor" )
00158 {
00159 throw ConfigError( std::string(CONNECTION_TYPE) + " must be 'initiator' or 'acceptor'" );
00160 }
00161 }
00162
00163 }