summaryrefslogtreecommitdiffstats
path: root/src/parser/sip_message.h
blob: c326d1f6f0ae865fa815e18e2fc660792cf5fc15 (plain)
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