1 #ifndef __AMSIPMSG_H__
2 #define __AMSIPMSG_H__
3 #include "AmArg.h"
4 #include "AmMimeBody.h"
5 
6 #include <string>
7 using std::string;
8 
9 #include "sip/trans_layer.h"
10 
11 /* enforce common naming in Req&Rpl */
12 class _AmSipMsgInDlg
13   : public AmObject
14 {
15  public:
16   string from;
17   string from_tag;
18 
19   string to;
20   string to_tag;
21 
22   string callid;
23 
24   unsigned int cseq;
25   string cseq_method;
26 
27   unsigned int rseq;
28 
29   string route;
30   string contact;
31 
32   string hdrs;
33 
34   AmMimeBody body;
35 
36   // transaction ticket from sip stack
37   trans_ticket tt;
38 
39   string         remote_ip;
40   unsigned short remote_port;
41   string         local_ip;
42   unsigned short local_port;
43   string         trsp;
44 
_AmSipMsgInDlg()45   _AmSipMsgInDlg() : cseq(0), rseq(0) { }
~_AmSipMsgInDlg()46   virtual ~_AmSipMsgInDlg() { };
47 
48   virtual string print() const = 0;
49 };
50 
51 #ifdef PROPAGATE_UNPARSED_REPLY_HEADERS
52 
53 struct AmSipHeader
54 {
55   string name, value;
AmSipHeaderAmSipHeader56   AmSipHeader() { }
AmSipHeaderAmSipHeader57   AmSipHeader(const string &_name, const string &_value): name(_name), value(_value) { }
AmSipHeaderAmSipHeader58   AmSipHeader(const cstring &_name, const cstring &_value): name(_name.s, _name.len), value(_value.s, _value.len) { }
59 };
60 
61 #endif
62 
63 /** \brief represents a SIP reply */
64 class AmSipReply : public _AmSipMsgInDlg
65 {
66  public:
67   unsigned int code;
68   string       reason;
69   string       to_uri;
70 #ifdef PROPAGATE_UNPARSED_REPLY_HEADERS
71   list<AmSipHeader> unparsed_headers;
72 #endif
73 
AmSipReply()74  AmSipReply() : _AmSipMsgInDlg(), code(0) { }
~AmSipReply()75   ~AmSipReply() { }
76   string print() const;
77 };
78 
79 
80 /** \brief represents a SIP request */
81 class AmSipRequest : public _AmSipMsgInDlg
82 {
83  public:
84   string method;
85 
86   string user;
87   string domain;
88   string r_uri;
89   string from_uri;
90 
91   string rack_method;
92   unsigned int rack_cseq;
93 
94   string vias;
95   string via1;
96   string via_branch;
97   bool   first_hop;
98 
99   int max_forwards;
100 
101   unsigned short local_if;
102 
103   AmSipRequest();
~AmSipRequest()104   ~AmSipRequest() { }
105 
106   string print() const;
107   void log(msg_logger *logger) const;
108 };
109 
110 string getHeader(const string& hdrs,const string& hdr_name, bool single = false);
111 
112 string getHeader(const string& hdrs,const string& hdr_name,
113 		 const string& compact_hdr_name, bool single = false);
114 
115 /** find a header, starting from char skip
116     if found, value is between pos1 and pos2
117     and hdr start is the start of the header
118     @return true if found */
119 bool findHeader(const string& hdrs,const string& hdr_name, const size_t skip,
120 		size_t& pos1, size_t& pos2,
121 		size_t& hdr_start);
122 
123 /** @return whether header hdr_name is in hdrs */
124 bool hasHeader(const string& hdrs,const string& hdr_name);
125 
126 bool removeHeader(string& hdrs, const string& hdr_name);
127 
128 /** add an option tag @param tag to list @param hdr_name */
129 void addOptionTag(string& hdrs, const string& hdr_name, const string& tag);
130 
131 /** remove an option tag @param tag from list @param hdr_name */
132 void removeOptionTag(string& hdrs, const string& hdr_name, const string& tag);
133 
134 #endif /* __AMSIPMSG_H__ */
135 
136 
137 /** EMACS **
138  * Local variables:
139  * mode: c++
140  * c-basic-offset: 2
141  * End:
142  */
143