1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
|
/*
Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
// SIP message
#ifndef _H_SIP_MESSAGE
#define _H_SIP_MESSAGE
#include <list>
#include <string>
#include "definitions.h"
#include "hdr_accept.h"
#include "hdr_accept_encoding.h"
#include "hdr_accept_language.h"
#include "hdr_alert_info.h"
#include "hdr_allow.h"
#include "hdr_allow_events.h"
#include "hdr_auth_info.h"
#include "hdr_authorization.h"
#include "hdr_call_id.h"
#include "hdr_call_info.h"
#include "hdr_contact.h"
#include "hdr_content_disp.h"
#include "hdr_content_encoding.h"
#include "hdr_content_language.h"
#include "hdr_content_length.h"
#include "hdr_content_type.h"
#include "hdr_cseq.h"
#include "hdr_date.h"
#include "hdr_error_info.h"
#include "hdr_event.h"
#include "hdr_expires.h"
#include "hdr_from.h"
#include "hdr_in_reply_to.h"
#include "hdr_max_forwards.h"
#include "hdr_min_expires.h"
#include "hdr_mime_version.h"
#include "hdr_organization.h"
#include "hdr_p_asserted_identity.h"
#include "hdr_p_preferred_identity.h"
#include "hdr_priority.h"
#include "hdr_privacy.h"
#include "hdr_proxy_authenticate.h"
#include "hdr_proxy_authorization.h"
#include "hdr_proxy_require.h"
#include "hdr_rack.h"
#include "hdr_record_route.h"
#include "hdr_refer_sub.h"
#include "hdr_refer_to.h"
#include "hdr_referred_by.h"
#include "hdr_replaces.h"
#include "hdr_reply_to.h"
#include "hdr_require.h"
#include "hdr_request_disposition.h"
#include "hdr_retry_after.h"
#include "hdr_route.h"
#include "hdr_rseq.h"
#include "hdr_server.h"
#include "hdr_service_route.h"
#include "hdr_sip_etag.h"
#include "hdr_sip_if_match.h"
#include "hdr_subject.h"
#include "hdr_subscription_state.h"
#include "hdr_supported.h"
#include "hdr_timestamp.h"
#include "hdr_to.h"
#include "hdr_unsupported.h"
#include "hdr_user_agent.h"
#include "hdr_via.h"
#include "hdr_warning.h"
#include "hdr_www_authenticate.h"
#include "parameter.h"
#include "sip_body.h"
// Macro's to access the body of a message, eg msg.sdp_body
#define SDP_BODY ((t_sdp *)body)
#define OPAQUE_BODY ((t_sip_body_opaque)*body)
using namespace std;
enum t_msg_type {
MSG_REQUEST,
MSG_RESPONSE,
MSG_SIPFRAG, // Only a sequence of headers (RFC 3420)
};
class t_sip_message {
protected:
/**
* Local IP address that will be uses for this SIP message.
* The local IP address can only be determined when the destination
* of a SIP message is known (because of multi homing).
*/
unsigned long local_ip_;
public:
// The source IP address and port are only set for messages
// received from the network. So the transaction user knows
// where a message comes from.
t_ip_port src_ip_port;
// SIP version
string version;
// All possible headers
t_hdr_accept hdr_accept;
t_hdr_accept_encoding hdr_accept_encoding;
t_hdr_accept_language hdr_accept_language;
t_hdr_alert_info hdr_alert_info;
t_hdr_allow hdr_allow;
t_hdr_allow_events hdr_allow_events;
t_hdr_auth_info hdr_auth_info;
t_hdr_authorization hdr_authorization;
t_hdr_call_id hdr_call_id;
t_hdr_call_info hdr_call_info;
t_hdr_contact hdr_contact;
t_hdr_content_disp hdr_content_disp;
t_hdr_content_encoding hdr_content_encoding;
t_hdr_content_language hdr_content_language;
t_hdr_content_length hdr_content_length;
t_hdr_content_type hdr_content_type;
t_hdr_cseq hdr_cseq;
t_hdr_date hdr_date;
t_hdr_error_info hdr_error_info;
t_hdr_event hdr_event;
t_hdr_expires hdr_expires;
t_hdr_from hdr_from;
t_hdr_in_reply_to hdr_in_reply_to;
t_hdr_max_forwards hdr_max_forwards;
t_hdr_min_expires hdr_min_expires;
t_hdr_mime_version hdr_mime_version;
t_hdr_organization hdr_organization;
t_hdr_p_asserted_identity hdr_p_asserted_identity;
t_hdr_p_preferred_identity hdr_p_preferred_identity;
t_hdr_priority hdr_priority;
t_hdr_privacy hdr_privacy;
t_hdr_proxy_authenticate hdr_proxy_authenticate;
t_hdr_proxy_authorization hdr_proxy_authorization;
t_hdr_proxy_require hdr_proxy_require;
t_hdr_rack hdr_rack;
t_hdr_record_route hdr_record_route;
t_hdr_refer_sub hdr_refer_sub;
t_hdr_refer_to hdr_refer_to;
t_hdr_referred_by hdr_referred_by;
t_hdr_replaces hdr_replaces;
t_hdr_reply_to hdr_reply_to;
t_hdr_require hdr_require;
t_hdr_request_disposition hdr_request_disposition;
t_hdr_retry_after hdr_retry_after;
t_hdr_route hdr_route;
t_hdr_rseq hdr_rseq;
t_hdr_server hdr_server;
t_hdr_service_route hdr_service_route;
t_hdr_sip_etag hdr_sip_etag;
t_hdr_sip_if_match hdr_sip_if_match;
t_hdr_subject hdr_subject;
t_hdr_subscription_state hdr_subscription_state;
t_hdr_supported hdr_supported;
t_hdr_timestamp hdr_timestamp;
t_hdr_to hdr_to;
t_hdr_unsupported hdr_unsupported;
t_hdr_user_agent hdr_user_agent;
t_hdr_via hdr_via;
t_hdr_warning hdr_warning;
t_hdr_www_authenticate hdr_www_authenticate;
// Unknown headers are represented by parameters.
// Parameter.name = header name
// Parameter.value = header value
list<t_parameter> unknown_headers;
// A SIP message can carry a body
t_sip_body *body;
t_sip_message();
t_sip_message(const t_sip_message& m);
virtual ~t_sip_message();
virtual t_msg_type get_type(void) const;
void add_unknown_header(const string &name, const string &value);
// Check if the message is valid. At this class the
// general rules applying to both requests and responses
// is checked.
// fatal is true if one of the headers mandatory for all
// messages is missing (to, from, cseq, call-id, via).
// reason contains a reason string if the message is invalid.
virtual bool is_valid(bool &fatal, string &reason) const;
// Return encoded headers
// The version should be encode by the subclasses.
// Parameter add_content_length indicates if a Content-Length
// header must be added. Usually it must, only for sipfrag bodies
// it may be omitted.
virtual string encode(bool add_content_length = true);
// Return list of environment variable settings for all headers
// (see header.h for the format)
// Besides the header variables the following variables will be
// returned as well:
//
// SIP_REQUEST_METHOD, for a request
// SIP_REQUEST_URI, for a request
// SIP_STATUS_CODE, for a response
// SIP_STATUS_REASON, for a response
virtual list<string> encode_env(void);
// Create a copy of the message
virtual t_sip_message *copy(void) const;
/**
* Set a plain text body in the message.
* @param text [in] The text.
* @param charset [in] The character set used for encoding.
* @post The Content-Type header is set to "text/plain".
* @post If a body was already present then it is deleted.
*/
void set_body_plain_text(const string &text, const string &charset);
/**
* Set a body with the contents of a file.
* @param filename [in] The name of the file.
* @param media [in] The mime type of the contents.
* @return True of body is set, false if file could not be read.
*/
bool set_body_from_file(const string &filename, const t_media &media);
/**
* Get the size of an encoded SIP message.
* @return Size in bytes.
*/
size_t get_encoded_size(void);
/**
* Check if all local IP address are correctly filled in. This
* check is an integrity check to help debugging the auto IP
* discover feature.
*/
bool local_ip_check(void) const;
/** Determine the local IP address for this SIP message. */
virtual void calc_local_ip(void);
/**
* Get the local IP address for this SIP message.
* The local IP address can be used as source address for sending
* the message.
* @return The local IP address.
* @return 0, if the local IP address is not determined yet.
*/
unsigned long get_local_ip(void);
};
#endif
|