Index  Source Files  Annotated Class List  Alphabetical Class List  Class Hierarchy  Graphical Class Hierarchy   
 

/home/orenmnero/autobuild/quickfix/src/C++/SessionSettings.cpp

Go to the documentation of this file.
00001 /****************************************************************************
00002 ** Copyright (c) quickfixengine.org  All rights reserved.
00003 **
00004 ** This file is part of the QuickFIX FIX Engine
00005 **
00006 ** This file may be distributed under the terms of the quickfixengine.org
00007 ** license as defined by quickfixengine.org and appearing in the file
00008 ** LICENSE included in the packaging of this file.
00009 **
00010 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00011 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00012 **
00013 ** See http://www.quickfixengine.org/LICENSE for licensing information.
00014 **
00015 ** Contact ask@quickfixengine.org if any conditions of this licensing are
00016 ** not clear to you.
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 }

Generated on Mon Jul 24 19:36:30 2006 for QuickFIX by doxygen 1.3.6-20040222 written by Dimitri van Heesch, © 1997-2001