#ifndef FIX_SESSIONID_H
#define FIX_SESSIONID_H
#include "Fields.h"
namespace FIX {
class SessionID {
public:
SessionID() { toString(m_frozenString); }
SessionID(
const std::string &beginString,
const std::string &senderCompID,
const std::string &targetCompID,
const std::string &sessionQualifier = "")
: m_beginString(BeginString(beginString)),
m_senderCompID(SenderCompID(senderCompID)),
m_targetCompID(TargetCompID(targetCompID)),
m_sessionQualifier(sessionQualifier),
m_isFIXT(false) {
toString(m_frozenString);
if (beginString.substr(0, 4) == "FIXT") {
m_isFIXT = true;
}
}
const BeginString &getBeginString() const { return m_beginString; }
const SenderCompID &getSenderCompID() const { return m_senderCompID; }
const TargetCompID &getTargetCompID() const { return m_targetCompID; }
const std::string &getSessionQualifier() const { return m_sessionQualifier; }
const bool isFIXT() const { return m_isFIXT; }
std::string toString() const { return m_frozenString; }
const std::string &toStringFrozen() const { return m_frozenString; }
void fromString(const std::string &str) {
std::string::size_type first = str.find_first_of(':');
std::string::size_type second = str.find("->");
std::string::size_type third = str.find_last_of(':');
if (first == std::string::npos) {
return;
}
if (second == std::string::npos) {
return;
}
m_beginString = str.substr(0, first);
m_senderCompID = str.substr(first + 1, second - first - 1);
if (first == third) {
m_targetCompID = str.substr(second + 2);
m_sessionQualifier = "";
} else {
m_targetCompID = str.substr(second + 2, third - second - 2);
m_sessionQualifier = str.substr(third + 1);
}
toString(m_frozenString);
}
std::string &toString(std::string &str) const {
str = getBeginString().getValue() + ":" + getSenderCompID().getValue() + "->" + getTargetCompID().getValue();
if (m_sessionQualifier.size()) {
str += ":" + m_sessionQualifier;
}
return str;
}
friend bool operator<(const SessionID &, const SessionID &);
friend bool operator==(const SessionID &, const SessionID &);
friend bool operator!=(const SessionID &, const SessionID &);
friend std::ostream &operator<<(std::ostream &, const SessionID &);
friend std::istream &operator>>(std::istream &, SessionID &);
SessionID operator~() const {
return SessionID(m_beginString, SenderCompID(m_targetCompID), TargetCompID(m_senderCompID), m_sessionQualifier);
}
private:
BeginString m_beginString;
SenderCompID m_senderCompID;
TargetCompID m_targetCompID;
std::string m_sessionQualifier;
bool m_isFIXT;
std::string m_frozenString;
};
inline bool operator<(const SessionID &lhs, const SessionID &rhs) {
return lhs.toStringFrozen() < rhs.toStringFrozen();
}
inline bool operator==(const SessionID &lhs, const SessionID &rhs) {
return lhs.toStringFrozen() == rhs.toStringFrozen();
}
inline bool operator!=(const SessionID &lhs, const SessionID &rhs) { return !(lhs == rhs); }
inline std::ostream &operator<<(std::ostream &stream, const SessionID &sessionID) {
stream << sessionID.toStringFrozen();
return stream;
}
inline std::istream &operator>>(std::istream &stream, SessionID &sessionID) {
std::string str;
stream >> str;
sessionID.fromString(str);
return stream;
}
} #endif