ANNA Suite  2020b
Multipurpose development suite for Telco applications
Message.hpp
Go to the documentation of this file.
1 // ANNA - Anna is Not Nothingness Anymore //
2 // //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
4 // //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7 
8 
9 #ifndef anna_diameter_comm_Message_hpp
10 #define anna_diameter_comm_Message_hpp
11 
12 // Local
15 
17 #include <anna/comm/Message.hpp>
19 #include <anna/core/functions.hpp>
20 
21 
22 
23 namespace anna {
24 namespace xml {
25 class Node;
26 }
27 }
28 
29 
30 
31 namespace anna {
32 
33 namespace diameter {
34 
35 namespace comm {
36 
37 
38 class ClientSession;
39 class ServerSession;
40 
45 class Message : public anna::comm::Message {
46 public:
47 
51  struct OnExpiry { enum _v { Abandon, Ignore, Retransmit }; };
52 
57  Message(const OnExpiry::_v onExpiry = OnExpiry::Ignore) : anna::comm::Message(StatusCodeBuffer::Reserve),
58  a_classCode(ClassCode::ApplicationMessage),
59  a_onExpiry(onExpiry) { initialize(); }
60 
65  const ClassCode::_v & getClassCode() const { return a_classCode; }
66 
71  OnExpiry::_v getOnExpiry() const { return a_onExpiry; }
72 
79  void setOnExpiry(const OnExpiry::_v onExpiry) { a_onExpiry = onExpiry; }
80 
81  // Internal use (CER message)
82  void setClassCode(const ClassCode::_v & classCode) { a_classCode = classCode; }
83 
84 
89  virtual std::string asString() const ;
90 
96  virtual anna::xml::Node* asXML(anna::xml::Node* parent) const ;
97 
98 
99  // Helpers
100  HopByHop getHopByHop() const ;
101  EndToEnd getEndToEnd() const ;
102  HopByHop getRequestHopByHop() const { return a_requestHopByHop; }
103  EndToEnd getRequestEndToEnd() const { return a_requestEndToEnd; }
104  void setRequestHopByHop(HopByHop hbh) { a_requestHopByHop = hbh; }
105  void setRequestEndToEnd(EndToEnd ete) { a_requestEndToEnd = ete; }
106  CommandId getCommandId(bool &isRequest) const ;
107  CommandId getCommandId() const { bool dummy; return getCommandId(dummy); }
108  ApplicationId getApplicationId() const ;
109 
110  bool fixRequestSequence(HopByHop hbh, EndToEnd ete) ;
111 
112  // http://diameter-protocol.blogspot.com.es/2011/05/diameter-message-structure-and-message.html
113 
118  bool endToEndSequenced() const { return a_endToEndSequenced; }
119 
126  void forwardEndToEnd() { a_endToEndSequenced = false; }
127 
134  void sequenceEndToEnd() { a_endToEndSequenced = true; }
135 
136 
137  // Statistics
138  void updateRequestTimestampMs(void) { a_request_timestamp_ms = anna::functions::millisecond(); }
139  const anna::Millisecond & getRequestTimestampMs() const { return (a_request_timestamp_ms); }
140 
141  int getRetries() const { return a_retries; }
142  void setRetries(int value) { a_retries = value; }
143 
144 
145  int getRequestServerSessionKey() const { return a_requestServerSessionKey; }
146 
148  void setRequestServerSessionKey(int value) { a_requestServerSessionKey = value; }
149 
150  const std::string & getRequestClientSessionKey() const { return a_requestClientSessionKey; }
151 
153  void setRequestClientSessionKey(const std::string & value) { a_requestClientSessionKey = value; }
154 
156  void initialize() {
157  a_retries = 1;
158  a_requestServerSessionKey = -1; // means unknown/unset
159  a_requestClientSessionKey = ""; // means unknown/unset
160  a_requestHopByHop = 0;
161  a_requestEndToEnd = 0;
162  a_endToEndSequenced = true;
163  }
164 
165 
166 protected:
172  Message(const ClassCode::_v & classCode, const OnExpiry::_v onExpiry = OnExpiry::Ignore) : anna::comm::Message(StatusCodeBuffer::Reserve),
173  a_classCode(classCode),
174  a_onExpiry(onExpiry) { initialize(); }
175 
176 
177 private:
178  ClassCode::_v a_classCode;
179  OnExpiry::_v a_onExpiry;
180  anna::Millisecond a_request_timestamp_ms; // Lapsed timestamp milliseconds at request event. Used for statistic purposes.
181  int a_retries;
182  int a_requestServerSessionKey; // useful to resolve origin of messages when diameter sessions are involved in the other side (if another interface, inherit from this Message class and put/carry context information)
183  std::string a_requestClientSessionKey; // idem for request which was received from servers
184  HopByHop a_requestHopByHop; // application backup for hop-by-hop in order to restore on answer receive
185  EndToEnd a_requestEndToEnd; // application backup for end-to-end in order to restore on answer receive
186  bool a_endToEndSequenced; // end-to-end will be sequenced by default (true)
187 
188  void send(ClientSession&) const noexcept(false);
189  void send(ServerSession&) const noexcept(false);
190  void restoreSequencesAfterFix() ;
191 
192  static const char* asText(const OnExpiry::_v) ;
193 
194  friend class Session;
195  friend class ClientSession;
196  friend class ServerSession;
197 };
198 
199 }
200 }
201 }
202 
203 #endif
204 
const anna::Millisecond & getRequestTimestampMs() const
Definition: Message.hpp:139
const ClassCode::_v & getClassCode() const
Definition: Message.hpp:65
Definition: Millisecond.hpp:24
bool endToEndSequenced() const
Definition: Message.hpp:118
void initialize()
Definition: Message.hpp:156
unsigned int EndToEnd
Definition: defines.hpp:70
void sequenceEndToEnd()
Definition: Message.hpp:134
Message(const ClassCode::_v &classCode, const OnExpiry::_v onExpiry=OnExpiry::Ignore)
Definition: Message.hpp:172
unsigned int HopByHop
Definition: defines.hpp:68
Definition: Node.hpp:56
void updateRequestTimestampMs(void)
Definition: Message.hpp:138
int getRetries() const
Definition: Message.hpp:141
EndToEnd getRequestEndToEnd() const
Definition: Message.hpp:103
int getRequestServerSessionKey() const
Definition: Message.hpp:145
void setClassCode(const ClassCode::_v &classCode)
Definition: Message.hpp:82
CommandId getCommandId() const
Definition: Message.hpp:107
void forwardEndToEnd()
Definition: Message.hpp:126
static Millisecond millisecond()
Definition: functions.hpp:379
void setRetries(int value)
Definition: Message.hpp:142
const std::string & getRequestClientSessionKey() const
Definition: Message.hpp:150
void setRequestClientSessionKey(const std::string &value)
Definition: Message.hpp:153
_v
Definition: ClassCode.hpp:28
void setRequestHopByHop(HopByHop hbh)
Definition: Message.hpp:104
Definition: Message.hpp:26
Definition: Message.hpp:45
Definition: ServerSession.hpp:53
Definition: ClientSession.hpp:51
Definition: ClassCode.hpp:27
Definition: Message.hpp:51
xml::Node Node
Definition: Node.hpp:21
Definition: app.hpp:12
unsigned int ApplicationId
Definition: defines.hpp:64
HopByHop getRequestHopByHop() const
Definition: Message.hpp:102
OnExpiry::_v getOnExpiry() const
Definition: Message.hpp:71
void setOnExpiry(const OnExpiry::_v onExpiry)
Definition: Message.hpp:79
std::pair< U24, bool > CommandId
Definition: defines.hpp:32
Definition: Session.hpp:55
Definition: Message.hpp:87
void setRequestServerSessionKey(int value)
Definition: Message.hpp:148
void setRequestEndToEnd(EndToEnd ete)
Definition: Message.hpp:105
Message(const OnExpiry::_v onExpiry=OnExpiry::Ignore)
Definition: Message.hpp:57