reSIProcate
SIP stack, Dialog Usage Manager and related libraries
Loading...
Searching...
No Matches
DialogInfoContents.hxx
Go to the documentation of this file.
1#if !defined(RESIP_DialogInfoContents_HXX)
2#define RESIP_DialogInfoContents_HXX
3
4#include <map>
5#include <list>
6
8#include "rutil/Data.hxx"
9#include "rutil/HashMap.hxx"
10#include "resip/stack/Uri.hxx"
12
13namespace resip
14{
15
16class XMLCursor;
17
22{
23public:
24
31 // Warning if you modify the above list, make sure you modify DialogInfoStateStrings in the .cxx file to match
32
42 // Warning if you modify the above list, make sure you modify DialogStateStrings in the .cxx file to match
43
55 // Warning if you modify the above list, make sure you modify DialogStateEventStrings in the .cxx file to match
56
63 // Warning if you modify the above list, make sure you modify DialogStateEventStrings in the .cxx file to match
64
66
68 DialogInfoContents(const Mime& contentType);
70 DialogInfoContents(const HeaderFieldValue& hfv, const Mime& contentType);
71 virtual ~DialogInfoContents();
72
76 virtual Contents* clone() const;
77 static const Mime& getStaticType();
78 virtual EncodeStream& encodeParsed(EncodeStream& str) const;
79 virtual void parse(ParseBuffer& pb);
80
81 // Default is 3 spaces " "
82 void setEncodeIndent(const Data& indent) { mIndent = indent; }
83
84 // Accesors for data
85 void setEntity(const Uri& entity) { checkParsed(); mEntity = entity; }
86 const Uri& getEntity() const { checkParsed(); return mEntity; }
87
89 uint32_t getVersion() const { checkParsed(); return mVersion; }
90
91 void setDialogInfoState(DialogInfoState dialogInfoState) { checkParsed(); mDialogInfoState = dialogInfoState; }
92 DialogInfoState getDialogInfoState() const { checkParsed(); return mDialogInfoState; }
93
94 // A DialogInfoContents can have multiple Dialog sections in it
95 class Dialog
96 {
97 public:
99 {
100 public:
102 DialogIdInfo(const Data& callId, const Data& localTag, const Data& remoteTag) :
103 mCallId(callId), mLocalTag(localTag), mRemoteTag(remoteTag) {}
107 };
108
109 Dialog() : mDirection(MaxOrUnsetDirection), mState(Trying), mStateEvent(MaxOrUnsetDialogStateEvent), mStateCode(0), mDuration(0),
110 mHasDuration(false), mAppearance(0), mHasAppearance(false), mExclusive(false), mHasExclusive(false) {}
111
112 // Accesors for data
113 void setId(const Data& id) { mId = id; }
114 const Data& getId() const { return mId; }
115
116 void setCallId(const Data& callId) { mCallId = callId; }
117 const Data& getCallId() const { return mCallId; }
118
119 void setLocalTag(const Data& localTag) { mLocalTag = localTag; }
120 const Data& getLocalTag() const { return mLocalTag; }
121
122 void setRemoteTag(const Data& remoteTag) { mRemoteTag = remoteTag; }
123 const Data& getRemoteTag() const { return mRemoteTag; }
124
125 void setDirection(const Direction& direction) { mDirection = direction; }
126 const Direction& getDirection() const { return mDirection; }
127
128 void setState(const DialogState& state) { mState = state; }
129 const DialogState& getState() const { return mState; }
130
131 void setStateEvent(const DialogStateEvent& stateEvent) { mStateEvent = stateEvent; }
132 const DialogStateEvent& getStateEvent() const { return mStateEvent; }
133
134 void setStateCode(const int& stateCode) { mStateCode = stateCode; }
135 const int& getStateCode() const { return mStateCode; }
136
137 void setDuration(const uint32_t& duration) { mDuration = duration; mHasDuration = true; }
138 void clearDuration() { mDuration = 0; mHasDuration = false; }
139 bool hasDuration() const { return mHasDuration; }
140 const uint32_t& getDuration() const { return mDuration; }
141
142 void setReplacesInfo(const Data& callId, const Data& localTag, const Data& remoteTag)
143 { mReplaces.mCallId = callId; mReplaces.mLocalTag = localTag; mReplaces.mRemoteTag = remoteTag; }
144 const Dialog::DialogIdInfo& getReplaces() const { return mReplaces; }
145 const Data& getReplacesCallId() const { return mReplaces.mCallId; }
146 const Data& getReplacesLocalTag() const { return mReplaces.mLocalTag; }
147 const Data& getReplacesRemoteTag() const { return mReplaces.mRemoteTag; }
148
149 void setReferredBy(const NameAddr& referredBy) { mReferredBy = referredBy; }
150 const NameAddr& getReferredBy() const { return mReferredBy; }
151
152 void addRouteToRouteSet(const NameAddr& route) { mRouteSet.push_back(route); }
153 void setRouteSet(const NameAddrs& routes) { mRouteSet = routes; }
154 void clearRouteSet() { mRouteSet.clear(); }
155 const NameAddrs& getRouteSet() const { return mRouteSet; }
156
157 // RFC7463 Elements
158 void setAppearance(unsigned int appearanceNum) { mAppearance = appearanceNum; mHasAppearance = true; }
159 void clearAppearance() { mAppearance = 0; mHasAppearance = false; }
160 bool hasAppearance() const { return mHasAppearance; }
161 bool getAppearance() const { return mAppearance; }
162
163 void setExclusive(bool exclusive) { mExclusive = exclusive; mHasExclusive = true; }
164 void clearExclusive() { mExclusive = false; mHasExclusive = false; }
165 bool hasExclusive() const { return mHasExclusive; }
166 bool getExclusive() const { return mExclusive; }
167
168 void addReplacedDialog(const Data& callId, const Data& localTag, const Data& remoteTag)
169 { mReplacedDialogs.push_back(DialogIdInfo(callId, localTag, remoteTag)); }
170 void addReplacedDialog(const Dialog::DialogIdInfo& dialogIdInfo) { mReplacedDialogs.push_back(dialogIdInfo); }
171 void clearReplacedDialogs() { mReplacedDialogs.clear(); }
172 const std::list<Dialog::DialogIdInfo>& getReplacedDialogs() const { return mReplacedDialogs; }
173
174 void addJoinedDialog(const Data& callId, const Data& localTag, const Data& remoteTag)
175 { mJoinedDialogs.push_back(DialogIdInfo(callId, localTag, remoteTag)); }
176 void addJoinedDialog(const Dialog::DialogIdInfo& dialogIdInfo) { mJoinedDialogs.push_back(dialogIdInfo); }
177 void clearJoinedDialogs() { mJoinedDialogs.clear(); }
178 const std::list<Dialog::DialogIdInfo>& getJoinedDialogs() const { return mJoinedDialogs; }
179
181 {
182 public:
183 Participant() : mCSeq(0), mHasCSeq(false) {}
184
185 void setIdentity(const NameAddr& identity) { mIdentity = identity; }
186 const NameAddr& getIdentity() const { return mIdentity; }
187
188 void setTarget(const Uri& target) { mTarget = target; }
189 void setTarget(const NameAddr& targetWithContactParams);
190 const Uri& getTarget() const { return mTarget; }
191
192 typedef std::map<Data, Data> TargetParams;
193 void addTargetParam(const Data& name, const Data& value) { mTargetParams[name] = value; }
194 void clearTargetParams() { mTargetParams.clear(); }
195 const TargetParams& getTargetParams() const { return mTargetParams; }
196 bool getTargetParam(const Data& name, Data& value) const;
197
198 void setSessionDescription(const Data& sessionDescription, const Data& sessionDescriptionType)
199 { mSessionDescription = sessionDescription; mSessionDescriptionType = sessionDescriptionType; }
200 const Data& getSessionDescription() const { return mSessionDescription; }
201 const Data& getSessionDescriptionType() const { return mSessionDescriptionType; }
202
203 void setCSeq(const uint32_t& cseq) { mCSeq = cseq; mHasCSeq = true; }
204 void clearCSeq() { mCSeq = 0; mHasCSeq = false; }
205 bool hasCSeq() const { return mHasCSeq; }
206 const uint32_t& getCSeq() const { return mCSeq; }
207
208 private:
209 NameAddr mIdentity;
210 Uri mTarget;
211 TargetParams mTargetParams;
212 Data mSessionDescription;
213 Data mSessionDescriptionType;
214 uint32_t mCSeq;
215 bool mHasCSeq;
216
217 friend class Dialog;
218 friend class DialogInfoContents;
219 EncodeStream& encode(EncodeStream& str, const char* baseElementName, const Data& indent) const;
220 void parse(XMLCursor& xml, const Data& namespacePrefix);
221 void parseParam(XMLCursor& xml);
222 };
223
224 Participant& localParticipant() { return mLocalParticipant; }
225 const Participant& localParticipant() const { return mLocalParticipant; }
226
227 Participant& remoteParticipant() { return mRemoteParticipant; }
228 const Participant& remoteParticipant() const { return mRemoteParticipant; }
229
230 // add element name and value to the extra Dialog child elements map
231 // These are local/non-standard child elements to the Dialog element
232 void addDialogElement(const Data& childElementName, const Data& elementValue) { mExtraDialogElements.insert( std::pair<Data,Data>(childElementName, elementValue));}
233
234 // get the instance'th occurance of the named Dialog child element.
235 // The first instance is index 0.
236 bool getDialogElement(const Data& childElementName, Data& elementValue, int instance=0) const;
237
238 private:
239 Data mId;
240 Data mCallId;
241 Data mLocalTag;
242 Data mRemoteTag;
243 Direction mDirection;
244
245 DialogState mState;
246 DialogStateEvent mStateEvent;
247 int mStateCode;
248
249 uint32_t mDuration;
250 bool mHasDuration;
251
252 DialogIdInfo mReplaces;
253
254 NameAddr mReferredBy;
255
256 NameAddrs mRouteSet;
257
258 Participant mLocalParticipant;
259 Participant mRemoteParticipant;
260
261 // RFC7463 specific elements
262 unsigned int mAppearance;
263 bool mHasAppearance;
264 bool mExclusive;
265 bool mHasExclusive;
266 std::list<DialogIdInfo> mReplacedDialogs;
267 std::list<DialogIdInfo> mJoinedDialogs;
268
269 std::multimap<Data, Data> mExtraDialogElements;
270
271 friend class DialogInfoContents;
272 EncodeStream& encodeParsed(EncodeStream& str, const Data& indent) const;
273 };
274
275 typedef std::list<Dialog> DialogList;
276 const DialogList& getDialogs() const { checkParsed(); return mDialogs; }
277 void addDialog(const Dialog& dialog);
278 bool removeDialog(const Data& id);
279 void clearDialogs() { checkParsed(); mDialogs.clear(); }
280
281 static bool init();
284 static const char* dialogStateToString(const DialogState& dialogState);
288 static const char* directionToString(const Direction& direction);
290 static bool compareTag(const Data& tagName, const Data& compareToTagNoPrefix, const Data& namespacePrefix);
291
292private:
293
294 static EncodeStream& encodeNameAddrElement(EncodeStream& str, const char* elementName, const NameAddr& nameAddr);
295 void parseDialog(XMLCursor& xml);
296 static bool parseDialogIdInfo(XMLCursor& xml, Dialog::DialogIdInfo& dialogIdInfo);
297 static bool parseUriValue(XMLCursor& xml, Uri& uri);
298 static bool parseNameAddrElement(XMLCursor& xml, NameAddr& nameAddr);
299
300 // Base DialogInfoContents data members
301 Data mBaseDialogInfoNamespacePrefix;
302 Data mSharedAppearanceDialogInfoNamespacePrefix;
303 Data mIndent;
304 Uri mEntity;
305 uint32_t mVersion;
306 DialogInfoState mDialogInfoState;
307
308 DialogList mDialogs;
309};
310
312
313}
314
315#endif
316
317/* ====================================================================
318*
319* Copyright (c) 2016-2021 SIP Spectrum, Inc. www.sipspectrum.com
320*
321* Redistribution and use in source and binary forms, with or without
322* modification, are permitted provided that the following conditions
323* are met:
324*
325* 1. Redistributions of source code must retain the above copyright
326* notice, this list of conditions and the following disclaimer.
327*
328* 2. Redistributions in binary form must reproduce the above copyright
329* notice, this list of conditions and the following disclaimer in
330* the documentation and/or other materials provided with the
331* distribution.
332*
333* 3. Neither the name of the author(s) nor the names of any contributors
334* may be used to endorse or promote products derived from this software
335* without specific prior written permission.
336*
337* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTORS "AS IS" AND
338* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
339* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
340* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTORS BE LIABLE
341* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
342* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
343* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
344* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
345* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
346* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
347* SUCH DAMAGE.
348*
349* ====================================================================
350*
351*/
352/*
353* vi: set shiftwidth=3 expandtab:
354*/
Wraps your platform's implementation of hash_map, hash_multimap, and hash_set.
Base class for all SIP body types.
Definition Contents.hxx:51
int & version()
returns the major version of MIME used by the contents
Definition Contents.hxx:275
An alternative to std::string, encapsulates an arbitrary buffer of bytes.
Definition Data.hxx:90
DialogIdInfo(const Data &callId, const Data &localTag, const Data &remoteTag)
void setSessionDescription(const Data &sessionDescription, const Data &sessionDescriptionType)
void addTargetParam(const Data &name, const Data &value)
bool getTargetParam(const Data &name, Data &value) const
const std::list< Dialog::DialogIdInfo > & getReplacedDialogs() const
const Dialog::DialogIdInfo & getReplaces() const
void addReplacedDialog(const Dialog::DialogIdInfo &dialogIdInfo)
void setRouteSet(const NameAddrs &routes)
const NameAddrs & getRouteSet() const
void addJoinedDialog(const Data &callId, const Data &localTag, const Data &remoteTag)
void setRemoteTag(const Data &remoteTag)
void setDuration(const uint32_t &duration)
void setAppearance(unsigned int appearanceNum)
void setState(const DialogState &state)
const std::list< Dialog::DialogIdInfo > & getJoinedDialogs() const
const Participant & localParticipant() const
const Participant & remoteParticipant() const
const Direction & getDirection() const
void addJoinedDialog(const Dialog::DialogIdInfo &dialogIdInfo)
const DialogStateEvent & getStateEvent() const
const DialogState & getState() const
void setStateCode(const int &stateCode)
void addRouteToRouteSet(const NameAddr &route)
void setReplacesInfo(const Data &callId, const Data &localTag, const Data &remoteTag)
void addReplacedDialog(const Data &callId, const Data &localTag, const Data &remoteTag)
void setReferredBy(const NameAddr &referredBy)
void setStateEvent(const DialogStateEvent &stateEvent)
void setDirection(const Direction &direction)
bool getDialogElement(const Data &childElementName, Data &elementValue, int instance=0) const
void setLocalTag(const Data &localTag)
void addDialogElement(const Data &childElementName, const Data &elementValue)
SIP body type for holding DialogInfo contents (MIME content-type application/dialog-info+xml).
virtual void parse(ParseBuffer &pb)
void addDialog(const Dialog &dialog)
static const char * dialogInfoStateToString(const DialogInfoState &dialogInfoState)
virtual Contents * clone() const
duplicate an DialogInfoContents object
void setVersion(uint32_t version)
static const char * dialogStateEventToString(const DialogStateEvent &dialogStateEvent)
static DialogState dialogStateStringToEnum(const Data &dialogStateString)
static bool compareTag(const Data &tagName, const Data &compareToTagNoPrefix, const Data &namespacePrefix)
void setEncodeIndent(const Data &indent)
static const char * directionToString(const Direction &direction)
static Direction directionStringToEnum(const Data &directionString)
void setEntity(const Uri &entity)
RESIP_HeapCount(DialogInfoContents)
bool removeDialog(const Data &id)
static const char * dialogStateToString(const DialogState &dialogState)
static const DialogInfoContents Empty
const DialogList & getDialogs() const
virtual EncodeStream & encodeParsed(EncodeStream &str) const
static const Mime & getStaticType()
static DialogInfoState dialogInfoStateStringToEnum(const Data &dialogInfoStateString)
DialogInfoState getDialogInfoState() const
static DialogStateEvent dialogStateEventStringToEnum(const Data &dialogStateEventString)
void setDialogInfoState(DialogInfoState dialogInfoState)
dcm! – kill typedef std::list<DialogId> DialogIdSet;
Definition Dialog.hxx:29
void checkParsed() const
Represents the "media-type" element in the RFC 3261 grammar.
Definition Mime.hxx:20
Represents the "name-addr" and the "addr-spec" elements in the RFC 3261 grammar.
Definition NameAddr.hxx:19
Provides string-parsing functionality with protection from buffer overflow.
void clear()
clear the mParsers vector
void push_back(const T &t)
Inserts a header field value at the back of this container.
Represents the "SIP-URI" and "SIPS-URI" elements in the RFC 3261 grammar.
Definition Uri.hxx:22
dcm! – add UnusedChecking(_enum) below;
static bool invokeDialogInfoContentsInit
unsigned int uint32_t
Definition Stun.hxx:34
#define EncodeStream
void list()
Definition userAdmin.cxx:66