Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Types | Private Member Functions | Static Private Member Functions | Friends | List of all members
FIX::Message Class Reference

Base class for all FIX messages. More...

#include <Message.h>

Inheritance diagram for FIX::Message:
Inheritance graph
[legend]
Collaboration diagram for FIX::Message:
Collaboration graph
[legend]

Public Member Functions

 Message ()
 
 throw (InvalidMessage)
 Construct a message from a string. More...
 
 Message (const std::string &string, const FIX::DataDictionary &dataDictionary, bool validate=true) throw ( InvalidMessage )
 Construct a message from a string using a data dictionary. More...
 
 Message (const std::string &string, const FIX::DataDictionary &sessionDataDictionary, const FIX::DataDictionary &applicationDataDictionary, bool validate=true) throw ( InvalidMessage )
 Construct a message from a string using a session and application data dictionary. More...
 
 Message (const Message &copy)
 
void addGroup (const FIX::Group &group)
 
void replaceGroup (unsigned num, const FIX::Group &group)
 
GroupgetGroup (unsigned num, FIX::Group &group) const throw ( FieldNotFound )
 
void removeGroup (unsigned num, const FIX::Group &group)
 
void removeGroup (const FIX::Group &group)
 
bool hasGroup (const FIX::Group &group) const
 
bool hasGroup (unsigned num, const FIX::Group &group) const
 
std::string toString (int beginStringField=FIELD::BeginString, int bodyLengthField=FIELD::BodyLength, int checkSumField=FIELD::CheckSum) const
 Get a string representation of the message. More...
 
std::string & toString (std::string &, int beginStringField=FIELD::BeginString, int bodyLengthField=FIELD::BodyLength, int checkSumField=FIELD::CheckSum) const
 Get a string representation without making a copy. More...
 
std::string toXML () const
 Get a XML representation of the message. More...
 
std::string & toXML (std::string &) const
 Get a XML representation without making a copy. More...
 
void reverseRoute (const Header &)
 Add header informations depending on a source message. More...
 
void setString (const std::string &string) throw ( InvalidMessage )
 Set a message based on a string representation This will fill in the fields on the message by parsing out the string that is passed in. More...
 
void setString (const std::string &string, bool validate) throw ( InvalidMessage )
 
void setString (const std::string &string, bool validate, const FIX::DataDictionary *pDataDictionary) throw ( InvalidMessage )
 
void setString (const std::string &string, bool validate, const FIX::DataDictionary *pSessionDataDictionary, const FIX::DataDictionary *pApplicationDataDictionary) throw ( InvalidMessage )
 
void setGroup (const std::string &msg, const FieldBase &field, const std::string &string, std::string::size_type &pos, FieldMap &map, const DataDictionary &dataDictionary)
 
bool setStringHeader (const std::string &string)
 Set a messages header from a string This is an optimization that can be used to get useful information from the header of a FIX string without parsing the whole thing. More...
 
const HeadergetHeader () const
 Getter for the message header. More...
 
HeadergetHeader ()
 Mutable getter for the message header. More...
 
const TrailergetTrailer () const
 Getter for the message trailer. More...
 
TrailergetTrailer ()
 Mutable getter for the message trailer. More...
 
bool hasValidStructure (int &field) const
 
int bodyLength (int beginStringField=FIELD::BeginString, int bodyLengthField=FIELD::BodyLength, int checkSumField=FIELD::CheckSum) const
 
int checkSum (int checkSumField=FIELD::CheckSum) const
 
bool isAdmin () const
 
bool isApp () const
 
bool isEmpty ()
 
void clear ()
 
SessionID getSessionID (const std::string &qualifier="") const throw ( FieldNotFound )
 Returns the session ID of the intended recipient. More...
 
void setSessionID (const SessionID &sessionID)
 Sets the session ID of the intended recipient. More...
 
- Public Member Functions inherited from FIX::FieldMap
 FieldMap (const message_order &order=message_order(message_order::normal))
 
 FieldMap (const int order[])
 
 FieldMap (const FieldMap &copy)
 
virtual ~FieldMap ()
 
FieldMapoperator= (const FieldMap &rhs)
 
void setField (const FieldBase &field, bool overwrite=true) throw ( RepeatedTag )
 Set a field without type checking. More...
 
void setField (int field, const std::string &value) throw ( RepeatedTag, NoTagValue )
 Set a field without a field class. More...
 
bool getFieldIfSet (FieldBase &field) const
 Get a field if set. More...
 
FieldBasegetField (FieldBase &field) const throw ( FieldNotFound )
 Get a field without type checking. More...
 
const std::string & getField (int field) const throw ( FieldNotFound )
 Get a field without a field class. More...
 
const FieldBasegetFieldRef (int field) const throw ( FieldNotFound )
 Get direct access to a field through a reference. More...
 
const FieldBase *const getFieldPtr (int field) const throw ( FieldNotFound )
 Get direct access to a field through a pointer. More...
 
bool isSetField (const FieldBase &field) const
 Check to see if a field is set. More...
 
bool isSetField (int field) const
 Check to see if a field is set by referencing its number. More...
 
void removeField (int field)
 Remove a field. If field is not present, this is a no-op. More...
 
void addGroup (int field, const FieldMap &group, bool setCount=true)
 Add a group. More...
 
void addGroupPtr (int field, FieldMap *group, bool setCount=true)
 Acquire ownership of Group object. More...
 
void replaceGroup (int num, int field, const FieldMap &group)
 Replace a specific instance of a group. More...
 
FieldMapgetGroup (int num, int field, FieldMap &group) const throw ( FieldNotFound )
 Get a specific instance of a group. More...
 
FieldMapgetGroupRef (int num, int field) const throw ( FieldNotFound )
 Get direct access to a field through a reference. More...
 
FieldMapgetGroupPtr (int num, int field) const throw ( FieldNotFound )
 Get direct access to a field through a pointer. More...
 
void removeGroup (int num, int field)
 Remove a specific instance of a group. More...
 
void removeGroup (int field)
 Remove all instances of a group. More...
 
bool hasGroup (int field) const
 Check to see any instance of a group exists. More...
 
bool hasGroup (int num, int field) const
 Check to see if a specific instance of a group exists. More...
 
int groupCount (int field) const
 Count the number of instance of a group. More...
 
void clear ()
 Clear all fields from the map. More...
 
bool isEmpty ()
 Check if map contains any fields. More...
 
int totalFields () const
 
std::string & calculateString (std::string &, bool clear=true) const
 
int calculateLength (int beginStringField=FIELD::BeginString, int bodyLengthField=FIELD::BodyLength, int checkSumField=FIELD::CheckSum) const
 
int calculateTotal (int checkSumField=FIELD::CheckSum) const
 
iterator begin () const
 
iterator end () const
 
g_iterator g_begin () const
 
g_iterator g_end () const
 

Static Public Member Functions

static bool InitializeXML (const std::string &string)
 Set global data dictionary for encoding messages into XML. More...
 
static bool isAdminMsgType (const MsgType &msgType)
 
static ApplVerID toApplVerID (const BeginString &value)
 
static BeginString toBeginString (const ApplVerID &applVerID)
 
static bool isHeaderField (int field)
 
static bool isHeaderField (const FieldBase &field, const DataDictionary *pD=0)
 
static bool isTrailerField (int field)
 
static bool isTrailerField (const FieldBase &field, const DataDictionary *pD=0)
 

Protected Member Functions

 Message (const BeginString &beginString, const MsgType &msgType)
 

Protected Attributes

Header m_header
 
Trailer m_trailer
 
bool m_validStructure
 
int m_field
 

Static Protected Attributes

static std::auto_ptr
< DataDictionary
s_dataDictionary
 

Private Types

enum  field_type { header, body, trailer }
 

Private Member Functions

FieldBase extractField (const std::string &string, std::string::size_type &pos, const DataDictionary *pSessionDD=0, const DataDictionary *pAppDD=0, const Group *pGroup=0)
 
void validate ()
 
std::string toXMLFields (const FieldMap &fields, int space) const
 

Static Private Member Functions

static bool IsDataField (int field, const DataDictionary *pSessionDD, const DataDictionary *pAppDD)
 

Friends

class DataDictionary
 
class Session
 

Additional Inherited Members

- Public Types inherited from FIX::FieldMap
typedef std::multimap< int,
FieldBase, message_order,
ALLOCATOR< std::pair< const
int, FieldBase > > > 
Fields
 
typedef std::map< int,
std::vector< FieldMap * >
, std::less< int >, ALLOCATOR
< std::pair< const int,
std::vector< FieldMap * > > > > 
Groups
 
typedef Fields::const_iterator iterator
 
typedef iterator const_iterator
 
typedef Groups::const_iterator g_iterator
 
typedef Groups::const_iterator g_const_iterator
 

Detailed Description

Base class for all FIX messages.

A message consists of three field maps. One for the header, the body, and the trailer.

Definition at line 67 of file Message.h.

Member Enumeration Documentation

Enumerator
header 
body 
trailer 

Definition at line 72 of file Message.h.

Constructor & Destructor Documentation

FIX::Message::Message ( )

Definition at line 35 of file Message.cpp.

36 : m_validStructure( true ) {}
bool m_validStructure
Definition: Message.h:340
FIX::Message::Message ( const std::string &  string,
const FIX::DataDictionary dataDictionary,
bool  validate = true 
)
throw (InvalidMessage
)

Construct a message from a string using a data dictionary.

Definition at line 45 of file Message.cpp.

49 : m_validStructure( true )
50 {
51  setString( string, validate, &dataDictionary, &dataDictionary );
52 }
void validate()
Definition: Message.cpp:480
void setString(const std::string &string)
Set a message based on a string representation This will fill in the fields on the message by parsing...
Definition: Message.h:162
bool m_validStructure
Definition: Message.h:340
FIX::Message::Message ( const std::string &  string,
const FIX::DataDictionary sessionDataDictionary,
const FIX::DataDictionary applicationDataDictionary,
bool  validate = true 
)
throw (InvalidMessage
)

Construct a message from a string using a session and application data dictionary.

Definition at line 54 of file Message.cpp.

59 : m_validStructure( true )
60 {
61  setStringHeader( string );
62  if( isAdmin() )
63  setString( string, validate, &sessionDataDictionary, &sessionDataDictionary );
64  else
65  setString( string, validate, &sessionDataDictionary, &applicationDataDictionary );
66 }
bool isAdmin() const
Definition: Message.h:219
bool setStringHeader(const std::string &string)
Set a messages header from a string This is an optimization that can be used to get useful informatio...
Definition: Message.cpp:371
void validate()
Definition: Message.cpp:480
void setString(const std::string &string)
Set a message based on a string representation This will fill in the fields on the message by parsing...
Definition: Message.h:162
bool m_validStructure
Definition: Message.h:340
FIX::Message::Message ( const Message copy)
inline

Definition at line 91 of file Message.h.

References m_field, m_header, m_trailer, and m_validStructure.

92  : FieldMap( copy )
93  {
94  m_header = copy.m_header;
95  m_trailer = copy.m_trailer;
96  m_validStructure = copy.m_validStructure;
97  m_field = copy.m_field;
98  }
int m_field
Definition: Message.h:341
FieldMap(const message_order &order=message_order(message_order::normal))
Definition: FieldMap.h:64
Header m_header
Definition: Message.h:338
bool m_validStructure
Definition: Message.h:340
Trailer m_trailer
Definition: Message.h:339
FIX::Message::Message ( const BeginString &  beginString,
const MsgType &  msgType 
)
inlineprotected

Definition at line 127 of file Message.h.

References m_header, and FIX::FieldMap::setField().

128  : m_validStructure( true )
129  {
130  m_header.setField( beginString );
131  m_header.setField( msgType );
132  }
void setField(const FieldBase &field, bool overwrite=true)
Set a field without type checking.
Definition: FieldMap.h:79
Header m_header
Definition: Message.h:338
bool m_validStructure
Definition: Message.h:340

Member Function Documentation

void FIX::Message::addGroup ( const FIX::Group group)
inline

Definition at line 103 of file Message.h.

References FIX::FieldMap::addGroup(), and FIX::Group::field().

104  { FieldMap::addGroup( group.field(), group ); }
int field() const
Definition: Group.h:56
void addGroup(int field, const FieldMap &group, bool setCount=true)
Add a group.
Definition: FieldMap.cpp:58
int FIX::Message::bodyLength ( int  beginStringField = FIELD::BeginString,
int  bodyLengthField = FIELD::BodyLength,
int  checkSumField = FIELD::CheckSum 
) const
inline

Definition at line 205 of file Message.h.

References FIX::FieldMap::calculateLength(), m_header, and m_trailer.

Referenced by toString(), and validate().

208  { return m_header.calculateLength(beginStringField, bodyLengthField, checkSumField)
209  + calculateLength(beginStringField, bodyLengthField, checkSumField)
210  + m_trailer.calculateLength(beginStringField, bodyLengthField, checkSumField);
211  }
Header m_header
Definition: Message.h:338
Trailer m_trailer
Definition: Message.h:339
int calculateLength(int beginStringField=FIELD::BeginString, int bodyLengthField=FIELD::BodyLength, int checkSumField=FIELD::CheckSum) const
Definition: FieldMap.cpp:203
int FIX::Message::checkSum ( int  checkSumField = FIELD::CheckSum) const
inline

Definition at line 213 of file Message.h.

References FIX::FieldMap::calculateTotal(), m_header, and m_trailer.

Referenced by toString(), and validate().

214  { return ( m_header.calculateTotal(checkSumField)
215  + calculateTotal(checkSumField)
216  + m_trailer.calculateTotal(checkSumField) ) % 256;
217  }
int calculateTotal(int checkSumField=FIELD::CheckSum) const
Definition: FieldMap.cpp:227
Header m_header
Definition: Message.h:338
Trailer m_trailer
Definition: Message.h:339
void FIX::Message::clear ( )
inline

Definition at line 242 of file Message.h.

References FIX::FieldMap::clear(), m_field, m_header, and m_trailer.

Referenced by setStringHeader().

243  {
244  m_field = 0;
245  m_header.clear();
246  FieldMap::clear();
247  m_trailer.clear();
248  }
int m_field
Definition: Message.h:341
Header m_header
Definition: Message.h:338
Trailer m_trailer
Definition: Message.h:339
void clear()
Clear all fields from the map.
Definition: FieldMap.cpp:143
FieldBase FIX::Message::extractField ( const std::string &  string,
std::string::size_type &  pos,
const DataDictionary pSessionDD = 0,
const DataDictionary pAppDD = 0,
const Group pGroup = 0 
)
private

Definition at line 532 of file Message.cpp.

References FIX::FieldMap::getField(), FIX::FieldMap::isSetField(), FIX::FIELD::Signature, and FIX::FIELD::SignatureLength.

Referenced by setGroup(), and setStringHeader().

535  {
536  std::string::size_type equalSign
537  = string.find_first_of( '=', pos );
538  if( equalSign == std::string::npos )
539  throw InvalidMessage("Equal sign not found in field");
540 
541  char* pEnd = 0;
542  int field = strtol( string.c_str() + pos, &pEnd, 0 );
543 
544  std::string::size_type soh =
545  string.find_first_of( '\001', equalSign + 1 );
546  if ( soh == std::string::npos )
547  throw InvalidMessage("SOH not found at end of field");
548 
549  if ( IsDataField( field, pSessionDD, pAppDD ) )
550  {
551  // Assume length field is 1 less.
552  int lenField = field - 1;
553  // Special case for Signature which violates above assumption.
554  if ( field == FIELD::Signature ) lenField = FIELD::SignatureLength;
555 
556  if ( pGroup && pGroup->isSetField( lenField ) )
557  {
558  const std::string& fieldLength = pGroup->getField( lenField );
559  soh = equalSign + 1 + atol( fieldLength.c_str() );
560  }
561  else if ( isSetField( lenField ) )
562  {
563  const std::string& fieldLength = getField( lenField );
564  soh = equalSign + 1 + atol( fieldLength.c_str() );
565  }
566  }
567 
568  pos = soh + 1;
569  return FieldBase (
570  field,
571  string.substr( equalSign + 1, soh - ( equalSign + 1 ) ) );
572  }
static bool IsDataField(int field, const DataDictionary *pSessionDD, const DataDictionary *pAppDD)
Definition: Message.h:321
FieldBase & getField(FieldBase &field) const
Get a field without type checking.
Definition: FieldMap.h:112
bool isSetField(const FieldBase &field) const
Check to see if a field is set.
Definition: FieldMap.h:144
const int SignatureLength
const int Signature
Group& FIX::Message::getGroup ( unsigned  num,
FIX::Group group 
) const
throw (FieldNotFound
)
inline

Definition at line 109 of file Message.h.

References FIX::FieldMap::clear(), and FIX::FieldMap::getGroup().

110  { group.clear();
111  return static_cast < Group& >
112  ( FieldMap::getGroup( num, group.field(), group ) );
113  }
FieldMap & getGroup(int num, int field, FieldMap &group) const
Get a specific instance of a group.
Definition: FieldMap.h:163
int field() const
Definition: Group.h:56
void clear()
Clear all fields from the map.
Definition: FieldMap.cpp:143
const Header& FIX::Message::getHeader ( ) const
inline
Header& FIX::Message::getHeader ( )
inline

Mutable getter for the message header.

Definition at line 194 of file Message.h.

References m_header.

194 { return m_header; }
Header m_header
Definition: Message.h:338
SessionID FIX::Message::getSessionID ( const std::string &  qualifier = "") const
throw (FieldNotFound
)

Returns the session ID of the intended recipient.

Definition at line 459 of file Message.cpp.

References FIX::FIELD::BeginString, FIX::FIELD::SenderCompID, and FIX::FIELD::TargetCompID.

461 {
462  BeginString beginString;
463  SenderCompID senderCompID;
464  TargetCompID targetCompID;
465 
466  getHeader().getField( beginString );
467  getHeader().getField( senderCompID );
468  getHeader().getField( targetCompID );
469 
470  return SessionID( beginString, senderCompID, targetCompID, qualifier );
471 }
const Header & getHeader() const
Getter for the message header.
Definition: Message.h:192
FieldBase & getField(FieldBase &field) const
Get a field without type checking.
Definition: FieldMap.h:112
const int TargetCompID
const int SenderCompID
const int BeginString
const Trailer& FIX::Message::getTrailer ( ) const
inline

Getter for the message trailer.

Definition at line 196 of file Message.h.

References m_trailer.

Referenced by toXML().

196 { return m_trailer; }
Trailer m_trailer
Definition: Message.h:339
Trailer& FIX::Message::getTrailer ( )
inline

Mutable getter for the message trailer.

Definition at line 198 of file Message.h.

References m_trailer.

198 { return m_trailer; }
Trailer m_trailer
Definition: Message.h:339
bool FIX::Message::hasGroup ( const FIX::Group group) const
inline

Definition at line 120 of file Message.h.

References FIX::Group::field(), and FIX::FieldMap::hasGroup().

121  { return FieldMap::hasGroup( group.field() ); }
int field() const
Definition: Group.h:56
bool hasGroup(int field) const
Check to see any instance of a group exists.
Definition: FieldMap.cpp:129
bool FIX::Message::hasGroup ( unsigned  num,
const FIX::Group group 
) const
inline

Definition at line 122 of file Message.h.

References FIX::Group::field(), and FIX::FieldMap::hasGroup().

123  { return FieldMap::hasGroup( num, group.field() ); }
int field() const
Definition: Group.h:56
bool hasGroup(int field) const
Check to see any instance of a group exists.
Definition: FieldMap.cpp:129
bool FIX::Message::hasValidStructure ( int &  field) const
inline

Definition at line 200 of file Message.h.

References m_field, and m_validStructure.

201  { field = m_field;
202  return m_validStructure;
203  }
int m_field
Definition: Message.h:341
bool m_validStructure
Definition: Message.h:340
bool FIX::Message::InitializeXML ( const std::string &  string)
static

Set global data dictionary for encoding messages into XML.

Definition at line 68 of file Message.cpp.

References DataDictionary, and s_dataDictionary.

69 {
70  try
71  {
72  std::auto_ptr<DataDictionary> p =
73  std::auto_ptr<DataDictionary>(new DataDictionary(url));
74  s_dataDictionary = p;
75  return true;
76  }
77  catch( ConfigError& )
78  { return false; }
79 }
static std::auto_ptr< DataDictionary > s_dataDictionary
Definition: Message.h:342
friend class DataDictionary
Definition: Message.h:69
bool FIX::Message::isAdmin ( ) const
inline

Definition at line 219 of file Message.h.

References FIELD_GET_REF, isAdminMsgType(), FIX::FieldMap::isSetField(), m_header, and FIX::FIELD::MsgType.

Referenced by FIX::MessageCracker::crack().

220  {
222  {
223  const MsgType& msgType = FIELD_GET_REF( m_header, MsgType );
224  return isAdminMsgType( msgType );
225  }
226  return false;
227  }
static bool isAdminMsgType(const MsgType &msgType)
Definition: Message.h:250
bool isSetField(const FieldBase &field) const
Check to see if a field is set.
Definition: FieldMap.h:144
Header m_header
Definition: Message.h:338
#define FIELD_GET_REF(MAP, FLD)
Definition: FieldMap.h:236
const int MsgType
static bool FIX::Message::isAdminMsgType ( const MsgType &  msgType)
inlinestatic

Definition at line 250 of file Message.h.

Referenced by FIX::Session::fromCallback(), isAdmin(), isApp(), FIX::Session::nextResendRequest(), and FIX::Session::sendRaw().

251  { if ( msgType.getValue().length() != 1 ) return false;
252  return strchr
253  ( "0A12345",
254  msgType.getValue().c_str() [ 0 ] ) != 0;
255  }
bool FIX::Message::isApp ( ) const
inline

Definition at line 229 of file Message.h.

References FIELD_GET_REF, isAdminMsgType(), FIX::FieldMap::isSetField(), m_header, and FIX::FIELD::MsgType.

Referenced by FIX::Session::next().

230  {
232  {
233  const MsgType& msgType = FIELD_GET_REF( m_header, MsgType );
234  return !isAdminMsgType( msgType );
235  }
236  return false;
237  }
static bool isAdminMsgType(const MsgType &msgType)
Definition: Message.h:250
bool isSetField(const FieldBase &field) const
Check to see if a field is set.
Definition: FieldMap.h:144
Header m_header
Definition: Message.h:338
#define FIELD_GET_REF(MAP, FLD)
Definition: FieldMap.h:236
const int MsgType
static bool FIX::Message::IsDataField ( int  field,
const DataDictionary pSessionDD,
const DataDictionary pAppDD 
)
inlinestaticprivate

Definition at line 321 of file Message.h.

324  {
325  if( (pSessionDD && pSessionDD->isDataField( field )) ||
326  (pAppDD && pAppDD != pSessionDD && pAppDD->isDataField( field )) )
327  {
328  return true;
329  }
330 
331  return false;
332  }
bool FIX::Message::isEmpty ( )
inline

Definition at line 239 of file Message.h.

References FIX::FieldMap::isEmpty(), m_header, and m_trailer.

240  { return m_header.isEmpty() && FieldMap::isEmpty() && m_trailer.isEmpty(); }
bool isEmpty()
Check if map contains any fields.
Definition: FieldMap.cpp:157
Header m_header
Definition: Message.h:338
Trailer m_trailer
Definition: Message.h:339
bool FIX::Message::isHeaderField ( int  field)
static

Definition at line 391 of file Message.cpp.

References FIX::FIELD::ApplVerID, FIX::FIELD::BeginString, FIX::FIELD::BodyLength, FIX::FIELD::CstmApplVerID, FIX::FIELD::DeliverToCompID, FIX::FIELD::DeliverToLocationID, FIX::FIELD::DeliverToSubID, FIX::FIELD::LastMsgSeqNumProcessed, FIX::FIELD::MessageEncoding, FIX::FIELD::MsgSeqNum, FIX::FIELD::MsgType, FIX::FIELD::NoHops, FIX::FIELD::OnBehalfOfCompID, FIX::FIELD::OnBehalfOfLocationID, FIX::FIELD::OnBehalfOfSendingTime, FIX::FIELD::OnBehalfOfSubID, FIX::FIELD::OrigSendingTime, FIX::FIELD::PossDupFlag, FIX::FIELD::PossResend, FIX::FIELD::SecureDataLen, FIX::FIELD::SenderCompID, FIX::FIELD::SenderLocationID, FIX::FIELD::SenderSubID, FIX::FIELD::SendingTime, FIX::FIELD::TargetCompID, FIX::FIELD::TargetLocationID, FIX::FIELD::TargetSubID, FIX::FIELD::XmlData, and FIX::FIELD::XmlDataLen.

Referenced by isHeaderField(), FIX::DataDictionary::iterate(), and setStringHeader().

392 {
393  switch ( field )
394  {
395  case FIELD::BeginString:
396  case FIELD::BodyLength:
397  case FIELD::MsgType:
398  case FIELD::SenderCompID:
399  case FIELD::TargetCompID:
403  case FIELD::MsgSeqNum:
404  case FIELD::SenderSubID:
406  case FIELD::TargetSubID:
412  case FIELD::PossDupFlag:
413  case FIELD::PossResend:
414  case FIELD::SendingTime:
416  case FIELD::XmlDataLen:
417  case FIELD::XmlData:
421  case FIELD::ApplVerID:
423  case FIELD::NoHops:
424  return true;
425  default:
426  return false;
427  };
428 }
const int ApplVerID
const int SecureDataLen
const int OrigSendingTime
const int DeliverToLocationID
const int CstmApplVerID
const int OnBehalfOfCompID
const int NoHops
const int OnBehalfOfLocationID
const int OnBehalfOfSubID
const int PossResend
const int LastMsgSeqNumProcessed
const int TargetLocationID
const int SendingTime
const int XmlData
const int DeliverToSubID
const int SenderSubID
const int TargetCompID
const int SenderLocationID
const int MessageEncoding
const int SenderCompID
const int XmlDataLen
const int DeliverToCompID
const int PossDupFlag
const int TargetSubID
const int OnBehalfOfSendingTime
const int BeginString
const int MsgSeqNum
const int BodyLength
const int MsgType
bool FIX::Message::isHeaderField ( const FieldBase field,
const DataDictionary pD = 0 
)
static

Definition at line 430 of file Message.cpp.

References FIX::FieldBase::getField(), FIX::DataDictionary::isHeaderField(), and isHeaderField().

432 {
433  if ( isHeaderField( field.getField() ) ) return true;
434  if ( pD ) return pD->isHeaderField( field.getField() );
435  return false;
436 }
static bool isHeaderField(int field)
Definition: Message.cpp:391
bool FIX::Message::isTrailerField ( int  field)
static

Definition at line 438 of file Message.cpp.

References FIX::FIELD::CheckSum, FIX::FIELD::Signature, and FIX::FIELD::SignatureLength.

Referenced by isTrailerField(), and FIX::DataDictionary::iterate().

439 {
440  switch ( field )
441  {
443  case FIELD::Signature:
444  case FIELD::CheckSum:
445  return true;
446  default:
447  return false;
448  };
449 }
const int SignatureLength
const int Signature
const int CheckSum
bool FIX::Message::isTrailerField ( const FieldBase field,
const DataDictionary pD = 0 
)
static

Definition at line 451 of file Message.cpp.

References FIX::FieldBase::getField(), FIX::DataDictionary::isTrailerField(), and isTrailerField().

453 {
454  if ( isTrailerField( field.getField() ) ) return true;
455  if ( pD ) return pD->isTrailerField( field.getField() );
456  return false;
457 }
static bool isTrailerField(int field)
Definition: Message.cpp:438
void FIX::Message::removeGroup ( unsigned  num,
const FIX::Group group 
)
inline

Definition at line 115 of file Message.h.

References FIX::Group::field(), and FIX::FieldMap::removeGroup().

116  { FieldMap::removeGroup( num, group.field() ); }
void removeGroup(int num, int field)
Remove a specific instance of a group.
Definition: FieldMap.cpp:86
int field() const
Definition: Group.h:56
void FIX::Message::removeGroup ( const FIX::Group group)
inline

Definition at line 117 of file Message.h.

References FIX::Group::field(), and FIX::FieldMap::removeGroup().

118  { FieldMap::removeGroup( group.field() ); }
void removeGroup(int num, int field)
Remove a specific instance of a group.
Definition: FieldMap.cpp:86
int field() const
Definition: Group.h:56
void FIX::Message::replaceGroup ( unsigned  num,
const FIX::Group group 
)
inline

Definition at line 106 of file Message.h.

References FIX::Group::field(), and FIX::FieldMap::replaceGroup().

107  { FieldMap::replaceGroup( num, group.field(), group ); }
int field() const
Definition: Group.h:56
void replaceGroup(int num, int field, const FieldMap &group)
Replace a specific instance of a group.
Definition: FieldMap.cpp:77
void FIX::Message::reverseRoute ( const Header header)

Add header informations depending on a source message.

This can be used to add routing informations like OnBehalfOfCompID and DeliverToCompID to a message.

Definition at line 81 of file Message.cpp.

References FIX::FIELD::BeginString, FIX::BeginString_FIX41, FIX::FIELD::DeliverToCompID, FIX::FIELD::DeliverToLocationID, FIX::FIELD::DeliverToSubID, FIX::FieldMap::getFieldIfSet(), m_header, FIX::FIELD::OnBehalfOfCompID, FIX::FIELD::OnBehalfOfLocationID, FIX::FIELD::OnBehalfOfSubID, FIX::FieldMap::removeField(), FIX::FIELD::SenderCompID, FIX::FieldMap::setField(), and FIX::FIELD::TargetCompID.

Referenced by FIX::Session::generateReject().

82 {
83  // required routing tags
84  BeginString beginString;
85  SenderCompID senderCompID;
86  TargetCompID targetCompID;
87 
88  m_header.removeField( beginString.getField() );
89  m_header.removeField( senderCompID.getField() );
90  m_header.removeField( targetCompID.getField() );
91 
92  if( header.getFieldIfSet( beginString ) )
93  {
94  if( beginString.getValue().size() )
95  m_header.setField( beginString );
96 
97  OnBehalfOfLocationID onBehalfOfLocationID;
98  DeliverToLocationID deliverToLocationID;
99 
100  m_header.removeField( onBehalfOfLocationID.getField() );
101  m_header.removeField( deliverToLocationID.getField() );
102 
103  if( beginString >= BeginString_FIX41 )
104  {
105  if( header.getFieldIfSet( onBehalfOfLocationID ) )
106  {
107  if( onBehalfOfLocationID.getValue().size() )
108  m_header.setField( DeliverToLocationID( onBehalfOfLocationID ) );
109  }
110 
111  if( header.getFieldIfSet( deliverToLocationID ) )
112  {
113  if( deliverToLocationID.getValue().size() )
114  m_header.setField( OnBehalfOfLocationID( deliverToLocationID ) );
115  }
116  }
117  }
118 
119  if( header.getFieldIfSet( senderCompID ) )
120  {
121  if( senderCompID.getValue().size() )
122  m_header.setField( TargetCompID( senderCompID ) );
123  }
124 
125  if( header.getFieldIfSet( targetCompID ) )
126  {
127  if( targetCompID.getValue().size() )
128  m_header.setField( SenderCompID( targetCompID ) );
129  }
130 
131  // optional routing tags
132  OnBehalfOfCompID onBehalfOfCompID;
133  OnBehalfOfSubID onBehalfOfSubID;
134  DeliverToCompID deliverToCompID;
135  DeliverToSubID deliverToSubID;
136 
137  m_header.removeField( onBehalfOfCompID.getField() );
138  m_header.removeField( onBehalfOfSubID.getField() );
139  m_header.removeField( deliverToCompID.getField() );
140  m_header.removeField( deliverToSubID.getField() );
141 
142  if( header.getFieldIfSet( onBehalfOfCompID ) )
143  {
144  if( onBehalfOfCompID.getValue().size() )
145  m_header.setField( DeliverToCompID( onBehalfOfCompID ) );
146  }
147 
148  if( header.getFieldIfSet( onBehalfOfSubID ) )
149  {
150  if( onBehalfOfSubID.getValue().size() )
151  m_header.setField( DeliverToSubID( onBehalfOfSubID ) );
152  }
153 
154  if( header.getFieldIfSet( deliverToCompID ) )
155  {
156  if( deliverToCompID.getValue().size() )
157  m_header.setField( OnBehalfOfCompID( deliverToCompID ) );
158  }
159 
160  if( header.getFieldIfSet( deliverToSubID ) )
161  {
162  if( deliverToSubID.getValue().size() )
163  m_header.setField( OnBehalfOfSubID( deliverToSubID ) );
164  }
165 }
const int DeliverToLocationID
const int OnBehalfOfCompID
const int OnBehalfOfLocationID
const int OnBehalfOfSubID
const int DeliverToSubID
const int TargetCompID
void setField(const FieldBase &field, bool overwrite=true)
Set a field without type checking.
Definition: FieldMap.h:79
void removeField(int field)
Remove a field. If field is not present, this is a no-op.
Definition: FieldMap.cpp:117
const char BeginString_FIX41[]
Definition: Values.h:35
const int SenderCompID
const int DeliverToCompID
Header m_header
Definition: Message.h:338
const int BeginString
void FIX::Message::setGroup ( const std::string &  msg,
const FieldBase field,
const std::string &  string,
std::string::size_type &  pos,
FieldMap map,
const DataDictionary dataDictionary 
)

Definition at line 327 of file Message.cpp.

References FIX::FieldMap::addGroupPtr(), extractField(), FIX::FieldBase::getField(), FIX::DataDictionary::getGroup(), FIX::DataDictionary::getOrderedFields(), and FIX::DataDictionary::isField().

331 {
332  int group = field.getField();
333  int delim;
334  const DataDictionary* pDD = 0;
335  if ( !dataDictionary.getGroup( msg, group, delim, pDD ) ) return ;
336  std::auto_ptr<Group> pGroup;
337 
338  while ( pos < string.size() )
339  {
340  std::string::size_type oldPos = pos;
341  FieldBase field = extractField( string, pos, &dataDictionary, &dataDictionary, pGroup.get() );
342 
343  // Start a new group because...
344  if (// found delimiter
345  (field.getField() == delim) ||
346  // no delimiter, but field belongs to group OR field already processed
347  (pDD->isField( field.getField() ) && (pGroup.get() == 0 || pGroup->isSetField( field.getField() )) ))
348  {
349  if ( pGroup.get() )
350  {
351  map.addGroupPtr( group, pGroup.release(), false );
352  }
353  pGroup.reset( new Group( field.getField(), delim, pDD->getOrderedFields() ) );
354  }
355  else if ( !pDD->isField( field.getField() ) )
356  {
357  if ( pGroup.get() )
358  {
359  map.addGroupPtr( group, pGroup.release(), false );
360  }
361  pos = oldPos;
362  return ;
363  }
364 
365  if ( !pGroup.get() ) return ;
366  pGroup->setField( field, false );
367  setGroup( msg, field, string, pos, *pGroup, *pDD );
368  }
369 }
FieldBase extractField(const std::string &string, std::string::size_type &pos, const DataDictionary *pSessionDD=0, const DataDictionary *pAppDD=0, const Group *pGroup=0)
Definition: Message.cpp:532
void setGroup(const std::string &msg, const FieldBase &field, const std::string &string, std::string::size_type &pos, FieldMap &map, const DataDictionary &dataDictionary)
Definition: Message.cpp:327
void setField(int field)
Definition: Field.h:56
friend class DataDictionary
Definition: Message.h:69
void FIX::Message::setSessionID ( const SessionID sessionID)

Sets the session ID of the intended recipient.

Definition at line 473 of file Message.cpp.

References FIX::SessionID::getBeginString(), getHeader(), FIX::SessionID::getSenderCompID(), FIX::SessionID::getTargetCompID(), and FIX::FieldMap::setField().

474 {
475  getHeader().setField( sessionID.getBeginString() );
476  getHeader().setField( sessionID.getSenderCompID() );
477  getHeader().setField( sessionID.getTargetCompID() );
478 }
const Header & getHeader() const
Getter for the message header.
Definition: Message.h:192
void setField(const FieldBase &field, bool overwrite=true)
Set a field without type checking.
Definition: FieldMap.h:79
void FIX::Message::setString ( const std::string &  string)
throw (InvalidMessage
)
inline

Set a message based on a string representation This will fill in the fields on the message by parsing out the string that is passed in.

It will return true on success and false on failure.

Definition at line 162 of file Message.h.

Referenced by setString().

164  { setString(string, true); }
void setString(const std::string &string)
Set a message based on a string representation This will fill in the fields on the message by parsing...
Definition: Message.h:162
void FIX::Message::setString ( const std::string &  string,
bool  validate 
)
throw (InvalidMessage
)
inline

Definition at line 165 of file Message.h.

References setString(), and validate().

167  { setString(string, validate, 0); }
void validate()
Definition: Message.cpp:480
void setString(const std::string &string)
Set a message based on a string representation This will fill in the fields on the message by parsing...
Definition: Message.h:162
void FIX::Message::setString ( const std::string &  string,
bool  validate,
const FIX::DataDictionary pDataDictionary 
)
throw (InvalidMessage
)
inline

Definition at line 168 of file Message.h.

References setString(), and validate().

172  { setString(string, validate, pDataDictionary, pDataDictionary); }
void validate()
Definition: Message.cpp:480
void setString(const std::string &string)
Set a message based on a string representation This will fill in the fields on the message by parsing...
Definition: Message.h:162
void FIX::Message::setString ( const std::string &  string,
bool  validate,
const FIX::DataDictionary pSessionDataDictionary,
const FIX::DataDictionary pApplicationDataDictionary 
)
throw (InvalidMessage
)

Definition at line 256 of file Message.cpp.

References FIX::FIELD::BeginString, FIX::FIELD::BodyLength, FIX::FieldBase::getField(), FIX::FieldBase::getString(), FIX::headerOrder, and FIX::FIELD::MsgType.

261 {
262  clear();
263 
264  std::string::size_type pos = 0;
265  int count = 0;
266  std::string msg;
267 
268  static int const headerOrder[] =
269  {
273  };
274 
275  field_type type = header;
276 
277  while ( pos < string.size() )
278  {
279  FieldBase field = extractField( string, pos, pSessionDataDictionary, pApplicationDataDictionary );
280  if ( count < 3 && headerOrder[ count++ ] != field.getField() )
281  if ( doValidation ) throw InvalidMessage("Header fields out of order");
282 
283  if ( isHeaderField( field, pSessionDataDictionary ) )
284  {
285  if ( type != header )
286  {
287  if(m_field == 0) m_field = field.getField();
288  m_validStructure = false;
289  }
290 
291  if ( field.getField() == FIELD::MsgType )
292  msg = field.getString();
293 
294  m_header.setField( field, false );
295 
296  if ( pSessionDataDictionary )
297  setGroup( "_header_", field, string, pos, getHeader(), *pSessionDataDictionary );
298  }
299  else if ( isTrailerField( field, pSessionDataDictionary ) )
300  {
301  type = trailer;
302  m_trailer.setField( field, false );
303 
304  if ( pSessionDataDictionary )
305  setGroup( "_trailer_", field, string, pos, getTrailer(), *pSessionDataDictionary );
306  }
307  else
308  {
309  if ( type == trailer )
310  {
311  if(m_field == 0) m_field = field.getField();
312  m_validStructure = false;
313  }
314 
315  type = body;
316  setField( field, false );
317 
318  if ( pApplicationDataDictionary )
319  setGroup( msg, field, string, pos, *this, *pApplicationDataDictionary );
320  }
321  }
322 
323  if ( doValidation )
324  validate();
325 }
const Header & getHeader() const
Getter for the message header.
Definition: Message.h:192
FieldBase extractField(const std::string &string, std::string::size_type &pos, const DataDictionary *pSessionDD=0, const DataDictionary *pAppDD=0, const Group *pGroup=0)
Definition: Message.cpp:532
void validate()
Definition: Message.cpp:480
void setGroup(const std::string &msg, const FieldBase &field, const std::string &string, std::string::size_type &pos, FieldMap &map, const DataDictionary &dataDictionary)
Definition: Message.cpp:327
void setField(const FieldBase &field, bool overwrite=true)
Set a field without type checking.
Definition: FieldMap.h:79
int m_field
Definition: Message.h:341
void clear()
Definition: Message.h:242
Header m_header
Definition: Message.h:338
const int BeginString
const Trailer & getTrailer() const
Getter for the message trailer.
Definition: Message.h:196
const int BodyLength
const int MsgType
static bool isHeaderField(int field)
Definition: Message.cpp:391
static bool isTrailerField(int field)
Definition: Message.cpp:438
bool m_validStructure
Definition: Message.h:340
static int const headerOrder[]
Definition: Message.h:40
Trailer m_trailer
Definition: Message.h:339
bool FIX::Message::setStringHeader ( const std::string &  string)

Set a messages header from a string This is an optimization that can be used to get useful information from the header of a FIX string without parsing the whole thing.

Definition at line 371 of file Message.cpp.

References clear(), extractField(), FIX::FieldBase::getField(), FIX::headerOrder, isHeaderField(), m_header, and FIX::FieldMap::setField().

Referenced by FIX::Acceptor::getSession(), FIX::Session::lookupSession(), and FIX::Session::nextResendRequest().

372 {
373  clear();
374 
375  std::string::size_type pos = 0;
376  int count = 0;
377 
378  while ( pos < string.size() )
379  {
380  FieldBase field = extractField( string, pos );
381  if ( count < 3 && headerOrder[ count++ ] != field.getField() )
382  return false;
383 
384  if ( isHeaderField( field ) )
385  m_header.setField( field, false );
386  else break;
387  }
388  return true;
389 }
FieldBase extractField(const std::string &string, std::string::size_type &pos, const DataDictionary *pSessionDD=0, const DataDictionary *pAppDD=0, const Group *pGroup=0)
Definition: Message.cpp:532
void setField(const FieldBase &field, bool overwrite=true)
Set a field without type checking.
Definition: FieldMap.h:79
void clear()
Definition: Message.h:242
Header m_header
Definition: Message.h:338
static bool isHeaderField(int field)
Definition: Message.cpp:391
static int const headerOrder[]
Definition: Message.h:40
FIX::Message::throw ( InvalidMessage  )

Construct a message from a string.

static ApplVerID FIX::Message::toApplVerID ( const BeginString &  value)
inlinestatic

Definition at line 257 of file Message.h.

References FIX::FIELD::ApplVerID, FIX::ApplVerID_FIX40, FIX::ApplVerID_FIX41, FIX::ApplVerID_FIX42, FIX::ApplVerID_FIX43, FIX::ApplVerID_FIX44, FIX::ApplVerID_FIX50, FIX::ApplVerID_FIX50SP1, FIX::ApplVerID_FIX50SP2, FIX::BeginString_FIX40, FIX::BeginString_FIX41, FIX::BeginString_FIX42, FIX::BeginString_FIX43, FIX::BeginString_FIX44, and FIX::BeginString_FIX50.

Referenced by FIX::SessionFactory::create(), FIX::Session::next(), FIX::SessionFactory::processFixDataDictionary(), and FIX::SessionFactory::processFixtDataDictionaries().

258  {
259  if( value == BeginString_FIX40 )
260  return ApplVerID(ApplVerID_FIX40);
261  if( value == BeginString_FIX41 )
262  return ApplVerID(ApplVerID_FIX41);
263  if( value == BeginString_FIX42 )
264  return ApplVerID(ApplVerID_FIX42);
265  if( value == BeginString_FIX43 )
266  return ApplVerID(ApplVerID_FIX43);
267  if( value == BeginString_FIX44 )
268  return ApplVerID(ApplVerID_FIX44);
269  if( value == BeginString_FIX50 )
270  return ApplVerID(ApplVerID_FIX50);
271  if( value == "FIX.5.0SP1" )
273  if( value == "FIX.5.0SP2" )
275  return ApplVerID(ApplVerID(value));
276  }
const int ApplVerID
const char BeginString_FIX44[]
Definition: Values.h:32
const char ApplVerID_FIX44[]
Definition: FixValues.h:816
const char BeginString_FIX42[]
Definition: Values.h:34
const char BeginString_FIX50[]
Definition: Values.h:31
const char BeginString_FIX43[]
Definition: Values.h:33
const char ApplVerID_FIX40[]
Definition: FixValues.h:811
const char ApplVerID_FIX43[]
Definition: FixValues.h:815
const char ApplVerID_FIX50SP1[]
Definition: FixValues.h:807
const char BeginString_FIX41[]
Definition: Values.h:35
const char BeginString_FIX40[]
Definition: Values.h:36
const char ApplVerID_FIX50SP2[]
Definition: FixValues.h:809
const char ApplVerID_FIX42[]
Definition: FixValues.h:814
const char ApplVerID_FIX50[]
Definition: FixValues.h:810
const char ApplVerID_FIX41[]
Definition: FixValues.h:812
static BeginString FIX::Message::toBeginString ( const ApplVerID &  applVerID)
inlinestatic

Definition at line 278 of file Message.h.

References FIX::ApplVerID_FIX40, FIX::ApplVerID_FIX41, FIX::ApplVerID_FIX42, FIX::ApplVerID_FIX43, FIX::ApplVerID_FIX44, FIX::ApplVerID_FIX50, FIX::ApplVerID_FIX50SP1, FIX::ApplVerID_FIX50SP2, FIX::FIELD::BeginString, FIX::BeginString_FIX40, FIX::BeginString_FIX41, FIX::BeginString_FIX42, FIX::BeginString_FIX43, FIX::BeginString_FIX44, and FIX::BeginString_FIX50.

279  {
280  if( applVerID == ApplVerID_FIX40 )
282  else if( applVerID == ApplVerID_FIX41 )
284  else if( applVerID == ApplVerID_FIX42 )
286  else if( applVerID == ApplVerID_FIX43 )
288  else if( applVerID == ApplVerID_FIX44 )
290  else if( applVerID == ApplVerID_FIX50 )
292  else if( applVerID == ApplVerID_FIX50SP1 )
294  else if( applVerID == ApplVerID_FIX50SP2 )
296  else
297  return BeginString("");
298  }
const char BeginString_FIX44[]
Definition: Values.h:32
const char ApplVerID_FIX44[]
Definition: FixValues.h:816
const char BeginString_FIX42[]
Definition: Values.h:34
const char BeginString_FIX50[]
Definition: Values.h:31
const char BeginString_FIX43[]
Definition: Values.h:33
const char ApplVerID_FIX40[]
Definition: FixValues.h:811
const char ApplVerID_FIX43[]
Definition: FixValues.h:815
const char ApplVerID_FIX50SP1[]
Definition: FixValues.h:807
const char BeginString_FIX41[]
Definition: Values.h:35
const int BeginString
const char BeginString_FIX40[]
Definition: Values.h:36
const char ApplVerID_FIX50SP2[]
Definition: FixValues.h:809
const char ApplVerID_FIX42[]
Definition: FixValues.h:814
const char ApplVerID_FIX50[]
Definition: FixValues.h:810
const char ApplVerID_FIX41[]
Definition: FixValues.h:812
std::string FIX::Message::toString ( int  beginStringField = FIELD::BeginString,
int  bodyLengthField = FIELD::BodyLength,
int  checkSumField = FIELD::CheckSum 
) const

Get a string representation of the message.

Definition at line 167 of file Message.cpp.

Referenced by FIX::Session::nextResendRequest(), and FIX::Session::sendRaw().

170 {
171  std::string str;
172  return toString( str, beginStringField, bodyLengthField, checkSumField );
173 }
std::string toString(int beginStringField=FIELD::BeginString, int bodyLengthField=FIELD::BodyLength, int checkSumField=FIELD::CheckSum) const
Get a string representation of the message.
Definition: Message.cpp:167
std::string & FIX::Message::toString ( std::string &  str,
int  beginStringField = FIELD::BeginString,
int  bodyLengthField = FIELD::BodyLength,
int  checkSumField = FIELD::CheckSum 
) const

Get a string representation without making a copy.

Definition at line 175 of file Message.cpp.

References bodyLength(), FIX::FieldMap::calculateString(), checkSum(), m_header, m_trailer, and FIX::FieldMap::setField().

179 {
180  int length = bodyLength( beginStringField, bodyLengthField, checkSumField );
181  m_header.setField( IntField(bodyLengthField, length) );
182  m_trailer.setField( CheckSumField(checkSumField, checkSum(checkSumField)) );
183 
184  m_header.calculateString( str, true );
185  FieldMap::calculateString( str, false );
186  m_trailer.calculateString( str, false );
187 
188  return str;
189 }
std::string & calculateString(std::string &, bool clear=true) const
Definition: FieldMap.cpp:176
int bodyLength(int beginStringField=FIELD::BeginString, int bodyLengthField=FIELD::BodyLength, int checkSumField=FIELD::CheckSum) const
Definition: Message.h:205
void setField(const FieldBase &field, bool overwrite=true)
Set a field without type checking.
Definition: FieldMap.h:79
int checkSum(int checkSumField=FIELD::CheckSum) const
Definition: Message.h:213
Header m_header
Definition: Message.h:338
Trailer m_trailer
Definition: Message.h:339
std::string FIX::Message::toXML ( ) const

Get a XML representation of the message.

Definition at line 191 of file Message.cpp.

192 {
193  std::string str;
194  return toXML( str );
195 }
std::string toXML() const
Get a XML representation of the message.
Definition: Message.cpp:191
std::string & FIX::Message::toXML ( std::string &  str) const

Get a XML representation without making a copy.

Definition at line 197 of file Message.cpp.

References getHeader(), getTrailer(), and toXMLFields().

198 {
199  std::stringstream stream;
200  stream << "<message>" << std::endl
201  << std::setw(2) << " " << "<header>" << std::endl
202  << toXMLFields(getHeader(), 4)
203  << std::setw(2) << " " << "</header>" << std::endl
204  << std::setw(2) << " " << "<body>" << std::endl
205  << toXMLFields(*this, 4)
206  << std::setw(2) << " " << "</body>" << std::endl
207  << std::setw(2) << " " << "<trailer>" << std::endl
208  << toXMLFields(getTrailer(), 4)
209  << std::setw(2) << " " << "</trailer>" << std::endl
210  << "</message>";
211 
212  return str = stream.str();
213 }
const Header & getHeader() const
Getter for the message header.
Definition: Message.h:192
const Trailer & getTrailer() const
Getter for the message trailer.
Definition: Message.h:196
std::string toXMLFields(const FieldMap &fields, int space) const
Definition: Message.cpp:215
std::string FIX::Message::toXMLFields ( const FieldMap fields,
int  space 
) const
private

Definition at line 215 of file Message.cpp.

References FIX::FieldMap::begin(), FIX::FieldMap::end(), FIX::FieldMap::g_begin(), FIX::FieldMap::g_end(), and s_dataDictionary.

Referenced by toXML().

216 {
217  std::stringstream stream;
219  std::string name;
220  for(i = fields.begin(); i != fields.end(); ++i)
221  {
222  int field = i->first;
223  std::string value = i->second.getString();
224 
225  stream << std::setw(space) << " " << "<field ";
226  if(s_dataDictionary.get() && s_dataDictionary->getFieldName(field, name))
227  {
228  stream << "name=\"" << name << "\" ";
229  }
230  stream << "number=\"" << field << "\"";
231  if(s_dataDictionary.get()
232  && s_dataDictionary->getValueName(field, value, name))
233  {
234  stream << " enum=\"" << name << "\"";
235  }
236  stream << ">";
237  stream << "<![CDATA[" << value << "]]>";
238  stream << "</field>" << std::endl;
239  }
240 
242  for(j = fields.g_begin(); j != fields.g_end(); ++j)
243  {
244  std::vector<FieldMap*>::const_iterator k;
245  for(k = j->second.begin(); k != j->second.end(); ++k)
246  {
247  stream << std::setw(space) << " " << "<group>" << std::endl
248  << toXMLFields(*(*k), space+2)
249  << std::setw(space) << " " << "</group>" << std::endl;
250  }
251  }
252 
253  return stream.str();
254 }
Fields::const_iterator iterator
Definition: FieldMap.h:59
Groups::const_iterator g_iterator
Definition: FieldMap.h:61
static std::auto_ptr< DataDictionary > s_dataDictionary
Definition: Message.h:342
std::string toXMLFields(const FieldMap &fields, int space) const
Definition: Message.cpp:215
void FIX::Message::validate ( )
private

Definition at line 480 of file Message.cpp.

References bodyLength(), FIX::FIELD::BodyLength, checkSum(), FIX::FIELD::CheckSum, FIELD_GET_REF, m_header, and m_trailer.

Referenced by setString().

481 {
482  try
483  {
484  const BodyLength& aBodyLength = FIELD_GET_REF( m_header, BodyLength );
485 
486  const int expectedLength = (int)aBodyLength;
487  const int actualLength = bodyLength();
488 
489  if ( expectedLength != actualLength )
490  {
491  std::stringstream text;
492  text << "Expected BodyLength=" << expectedLength
493  << ", Actual BodyLength=" << actualLength;
494  throw InvalidMessage(text.str());
495  }
496  }
497  catch ( FieldNotFound& )
498  {
499  throw InvalidMessage("BodyLength missing");
500  }
501  catch ( IncorrectDataFormat& )
502  {
503  throw InvalidMessage("BodyLength has invalid format");
504  }
505 
506  try
507  {
508  const CheckSum& aCheckSum = FIELD_GET_REF( m_trailer, CheckSum );
509 
510  const int expectedCheckSum = (int)aCheckSum;
511  const int actualCheckSum = checkSum();
512 
513  if ( expectedCheckSum != actualCheckSum )
514  {
515  std::stringstream text;
516  text << "Expected CheckSum=" << expectedCheckSum
517  << ", Actual CheckSum=" << actualCheckSum;
518  throw InvalidMessage(text.str());
519  }
520  }
521  catch ( FieldNotFound& )
522  {
523  throw InvalidMessage("CheckSum missing");
524  }
525  catch ( IncorrectDataFormat& )
526  {
527  throw InvalidMessage("CheckSum has invalid format");
528  }
529 }
int bodyLength(int beginStringField=FIELD::BeginString, int bodyLengthField=FIELD::BodyLength, int checkSumField=FIELD::CheckSum) const
Definition: Message.h:205
int checkSum(int checkSumField=FIELD::CheckSum) const
Definition: Message.h:213
Header m_header
Definition: Message.h:338
const int BodyLength
#define FIELD_GET_REF(MAP, FLD)
Definition: FieldMap.h:236
const int CheckSum
Trailer m_trailer
Definition: Message.h:339

Friends And Related Function Documentation

friend class DataDictionary
friend

Definition at line 69 of file Message.h.

Referenced by InitializeXML().

friend class Session
friend

Definition at line 70 of file Message.h.

Member Data Documentation

int FIX::Message::m_field
protected

Definition at line 341 of file Message.h.

Referenced by clear(), hasValidStructure(), and Message().

Header FIX::Message::m_header
mutableprotected
Trailer FIX::Message::m_trailer
mutableprotected

Definition at line 339 of file Message.h.

Referenced by bodyLength(), checkSum(), clear(), getTrailer(), isEmpty(), Message(), toString(), and validate().

bool FIX::Message::m_validStructure
protected

Definition at line 340 of file Message.h.

Referenced by hasValidStructure(), and Message().

std::auto_ptr< DataDictionary > FIX::Message::s_dataDictionary
staticprotected

Definition at line 342 of file Message.h.

Referenced by InitializeXML(), and toXMLFields().


The documentation for this class was generated from the following files:

Generated on Sat Mar 29 2014 15:13:34 for QuickFIX by doxygen 1.8.5 written by Dimitri van Heesch, © 1997-2001