belle_sip_headers_impl.c 10.8 KB
Newer Older
jehan's avatar
jehan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
	belle-sip - SIP (RFC3261) library.
    Copyright (C) 2010  Belledonne Communications SARL

    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 3 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 <http://www.gnu.org/licenses/>.
*/



#include "belle-sip/headers.h"
jehan's avatar
jehan committed
22
#include "belle-sip/parameters.h"
jehan's avatar
jehan committed
23 24 25 26 27 28 29
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "belle_sip_messageParser.h"
#include "belle_sip_messageLexer.h"
#include "belle_sip_internal.h"

jehan's avatar
jehan committed
30 31 32
/************************
 * header
 ***********************/
jehan's avatar
jehan committed
33

jehan's avatar
jehan committed
34
GET_SET_STRING(belle_sip_header,name);
35

jehan's avatar
jehan committed
36
void belle_sip_header_init(belle_sip_header_t *header) {
Simon Morlat's avatar
Simon Morlat committed
37

jehan's avatar
jehan committed
38
}
39

Simon Morlat's avatar
Simon Morlat committed
40
static void belle_sip_header_destroy(belle_sip_header_t *header){
jehan's avatar
jehan committed
41 42
	if (header->name) belle_sip_free((void*)header->name);
}
jehan's avatar
jehan committed
43

Simon Morlat's avatar
Simon Morlat committed
44 45 46
BELLE_SIP_INSTANCIATE_VPTR(belle_sip_header_t,belle_sip_object_t,belle_sip_header_destroy,NULL);


jehan's avatar
jehan committed
47 48 49 50
/************************
 * header_address
 ***********************/
struct _belle_sip_header_address {
Simon Morlat's avatar
Simon Morlat committed
51
	belle_sip_parameters_t base;
jehan's avatar
jehan committed
52 53 54
	const char* displayname;
	belle_sip_uri_t* uri;
};
Simon Morlat's avatar
Simon Morlat committed
55

jehan's avatar
jehan committed
56 57
static void belle_sip_header_address_init(belle_sip_header_address_t* object){
	belle_sip_parameters_init((belle_sip_parameters_t*)object); /*super*/
jehan's avatar
jehan committed
58 59
}

jehan's avatar
jehan committed
60 61 62
static void belle_sip_header_address_destroy(belle_sip_header_address_t* contact) {
	if (contact->displayname) belle_sip_free((void*)(contact->displayname));
	if (contact->uri) belle_sip_object_unref(BELLE_SIP_OBJECT(contact->uri));
jehan's avatar
jehan committed
63 64
}

Simon Morlat's avatar
Simon Morlat committed
65 66 67 68
static void belle_sip_header_address_clone(belle_sip_header_address_t *addr){
}

BELLE_SIP_NEW(header_address,parameters)
jehan's avatar
jehan committed
69 70
GET_SET_STRING(belle_sip_header_address,displayname);

jehan's avatar
jehan committed
71 72 73 74 75 76
void belle_sip_header_address_set_quoted_displayname(belle_sip_header_address_t* address,const char* value) {
		if (address->displayname != NULL) belle_sip_free((void*)(address->displayname));
		size_t value_size = strlen(value);
		address->displayname=belle_sip_malloc0(value_size-2+1);
		strncpy((char*)(address->displayname),value+1,value_size-2);
}
jehan's avatar
jehan committed
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
belle_sip_uri_t* belle_sip_header_address_get_uri(belle_sip_header_address_t* address) {
	return address->uri;
}

void belle_sip_header_address_set_uri(belle_sip_header_address_t* address, belle_sip_uri_t* uri) {
	address->uri=uri;
}



/************************
 * header_contact
 ***********************/
struct _belle_sip_header_contact {
	belle_sip_header_address_t address;
	unsigned int wildcard;
 };

jehan's avatar
jehan committed
95
void belle_sip_header_contact_destroy(belle_sip_header_contact_t* contact) {
Simon Morlat's avatar
Simon Morlat committed
96 97 98
}

void belle_sip_header_contact_clone(belle_sip_header_contact_t *contact, const belle_sip_header_contact_t *orig){
jehan's avatar
jehan committed
99 100
}

101
BELLE_SIP_NEW_WITH_NAME(header_contact,header_address,"Contact")
jehan's avatar
jehan committed
102
BELLE_SIP_PARSE(header_contact)
jehan's avatar
jehan committed
103

jehan's avatar
jehan committed
104 105
GET_SET_INT_PARAM_PRIVATE(belle_sip_header_contact,expires,int,_)
GET_SET_INT_PARAM_PRIVATE(belle_sip_header_contact,q,float,_);
jehan's avatar
jehan committed
106 107
GET_SET_BOOL(belle_sip_header_contact,wildcard,is);

jehan's avatar
jehan committed
108

jehan's avatar
jehan committed
109 110
int belle_sip_header_contact_set_expires(belle_sip_header_contact_t* contact, int expires) {
	if (expires < 0 ) {
111
		 belle_sip_error("bad expires value [%i] for contact",expires);
jehan's avatar
jehan committed
112 113 114 115 116 117
		return -1;
	}
	_belle_sip_header_contact_set_expires(contact,expires);
	return 0;
 }
int belle_sip_header_contact_set_qvalue(belle_sip_header_contact_t* contact, float qValue) {
jehan's avatar
jehan committed
118
	 if (qValue != -1 && qValue < 0 && qValue >1) {
119
		 belle_sip_error("bad q value [%f] for contact",qValue);
jehan's avatar
jehan committed
120 121
		 return -1;
	 }
jehan's avatar
jehan committed
122
	 _belle_sip_header_contact_set_q(contact,qValue);
jehan's avatar
jehan committed
123 124
	 return 0;
}
125
float	belle_sip_header_contact_get_qvalue(const belle_sip_header_contact_t* contact) {
jehan's avatar
jehan committed
126 127 128
	return belle_sip_header_contact_get_q(contact);
}
/**************************
jehan's avatar
jehan committed
129
* From header object inherent from header_address
jehan's avatar
jehan committed
130
****************************
jehan's avatar
jehan committed
131 132 133 134 135
*/
struct _belle_sip_header_from  {
	belle_sip_header_address_t address;
};

jehan's avatar
jehan committed
136 137 138
static void belle_sip_header_from_destroy(belle_sip_header_from_t* from) {
}

Simon Morlat's avatar
Simon Morlat committed
139 140 141 142
static void belle_sip_header_from_clone(belle_sip_header_from_t* from, const belle_sip_header_from_t* cloned) {
}


143
BELLE_SIP_NEW_WITH_NAME(header_from,header_address,"From")
jehan's avatar
jehan committed
144
BELLE_SIP_PARSE(header_from)
jehan's avatar
jehan committed
145 146 147
GET_SET_STRING_PARAM(belle_sip_header_from,tag);

/**************************
Simon Morlat's avatar
Simon Morlat committed
148
* To header object inherits from header_address
jehan's avatar
jehan committed
149 150 151 152 153
****************************
*/
struct _belle_sip_header_to  {
	belle_sip_header_address_t address;
};
jehan's avatar
jehan committed
154

jehan's avatar
jehan committed
155
static void belle_sip_header_to_destroy(belle_sip_header_to_t* to) {
Simon Morlat's avatar
Simon Morlat committed
156 157 158
}

void belle_sip_header_to_clone(belle_sip_header_to_t *contact, const belle_sip_header_to_t *orig){
jehan's avatar
jehan committed
159
}
jehan's avatar
jehan committed
160

161
BELLE_SIP_NEW_WITH_NAME(header_to,header_address,"To")
jehan's avatar
jehan committed
162 163
BELLE_SIP_PARSE(header_to)
GET_SET_STRING_PARAM(belle_sip_header_to,tag);
164

jehan's avatar
jehan committed
165
/**************************
Simon Morlat's avatar
Simon Morlat committed
166
* Via header object inherits from parameters
jehan's avatar
jehan committed
167 168 169
****************************
*/
struct _belle_sip_header_via  {
170
	belle_sip_parameters_t params_list;
Simon Morlat's avatar
Simon Morlat committed
171 172 173
	char* protocol;
	char* transport;
	char* host;
174
	int port;
jehan's avatar
jehan committed
175 176
};

177
static void belle_sip_header_via_destroy(belle_sip_header_via_t* via) {
Simon Morlat's avatar
Simon Morlat committed
178 179 180 181 182
	if (via->host) belle_sip_free(via->host);
	if (via->protocol) belle_sip_free(via->protocol);
}

static void belle_sip_header_via_clone(belle_sip_header_via_t* via, const belle_sip_header_via_t*orig){
jehan's avatar
jehan committed
183 184
}

185
BELLE_SIP_NEW_WITH_NAME(header_via,header_address,"Via")
jehan's avatar
jehan committed
186
BELLE_SIP_PARSE(header_via)
187 188 189 190 191 192 193 194 195 196 197
GET_SET_STRING(belle_sip_header_via,protocol);
GET_SET_STRING(belle_sip_header_via,transport);
GET_SET_STRING(belle_sip_header_via,host);
GET_SET_INT_PRIVATE(belle_sip_header_via,port,int,_);

GET_SET_STRING_PARAM(belle_sip_header_via,branch);
GET_SET_STRING_PARAM(belle_sip_header_via,maddr);
GET_SET_STRING_PARAM(belle_sip_header_via,received);

GET_SET_INT_PARAM_PRIVATE(belle_sip_header_via,rport,int,_)
GET_SET_INT_PARAM_PRIVATE(belle_sip_header_via,ttl,int,_)
Simon Morlat's avatar
Simon Morlat committed
198

199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
int belle_sip_header_via_set_rport (belle_sip_header_via_t* obj,int  value) {
	if (value ==-1 || (value>0 && value<65536)) {
		_belle_sip_header_via_set_rport(obj,value);
		return 0;
	} else {
		belle_sip_error("bad rport value [%i] for via",value);
		return -1;
	}
}
int belle_sip_header_via_set_ttl (belle_sip_header_via_t* obj,int  value) {
	if (value ==-1 || (value>0 && value<=255)) {
		_belle_sip_header_via_set_ttl(obj,value);
		return 0;
	} else {
		belle_sip_error("bad ttl value [%i] for via",value);
		return -1;
	}
}
217

218 219 220 221 222 223 224 225 226
int belle_sip_header_via_set_port (belle_sip_header_via_t* obj,int  value) {
	if (value ==-1 || (value>0 && value<65536)) {
		_belle_sip_header_via_set_port(obj,value);
		return 0;
	} else {
		belle_sip_error("bad port value [%i] for via",value);
		return -1;
	}
}
Simon Morlat's avatar
Simon Morlat committed
227

228
int belle_sip_header_via_get_listening_port(const belle_sip_header_via_t *via){
Simon Morlat's avatar
Simon Morlat committed
229 230 231 232 233
	int ret=belle_sip_header_via_get_port(via);
	if (ret==-1) ret=belle_sip_listening_point_get_well_known_port(via->protocol);
	return ret;
}

234
/**************************
Simon Morlat's avatar
Simon Morlat committed
235
* call_id header object inherits from object
236 237
****************************
*/
jehan's avatar
jehan committed
238
struct _belle_sip_header_call_id  {
239
	belle_sip_object_t base;
jehan's avatar
jehan committed
240
	const char* call_id;
241
};
jehan's avatar
jehan committed
242

jehan's avatar
jehan committed
243 244
static void belle_sip_header_call_id_destroy(belle_sip_header_call_id_t* call_id) {
	if (call_id->call_id) belle_sip_free((void*)call_id->call_id);
Simon Morlat's avatar
Simon Morlat committed
245
}
jehan's avatar
jehan committed
246

Simon Morlat's avatar
Simon Morlat committed
247
static void belle_sip_header_call_id_clone(belle_sip_header_call_id_t* call_id,const belle_sip_header_call_id_t *orig){
248 249
}

Simon Morlat's avatar
Simon Morlat committed
250
BELLE_SIP_NEW_WITH_NAME(header_call_id,header,"Call-ID")
jehan's avatar
jehan committed
251 252
BELLE_SIP_PARSE(header_call_id)
GET_SET_STRING(belle_sip_header_call_id,call_id);
253 254 255 256 257 258 259 260 261
/**************************
* cseq header object inherent from object
****************************
*/
struct _belle_sip_header_cseq  {
	belle_sip_object_t base;
	const char* method;
	unsigned int seq_number;
};
jehan's avatar
jehan committed
262

263 264
static void belle_sip_header_cseq_destroy(belle_sip_header_cseq_t* cseq) {
	if (cseq->method) belle_sip_free((void*)cseq->method);
Simon Morlat's avatar
Simon Morlat committed
265
}
266

Simon Morlat's avatar
Simon Morlat committed
267 268
static void belle_sip_header_cseq_clone(belle_sip_header_cseq_t* cseq, const belle_sip_header_cseq_t *orig) {
	if (cseq->method) belle_sip_free((void*)cseq->method);
269 270
}

Simon Morlat's avatar
Simon Morlat committed
271
BELLE_SIP_NEW_WITH_NAME(header_cseq,header,"Cseq")
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
BELLE_SIP_PARSE(header_cseq)
GET_SET_STRING(belle_sip_header_cseq,method);
GET_SET_INT(belle_sip_header_cseq,seq_number,unsigned int)
/**************************
* content type header object inherent from parameters
****************************
*/
struct _belle_sip_header_content_type  {
	belle_sip_parameters_t params_list;
	const char* type;
	const char* subtype;
};

static void belle_sip_header_content_type_destroy(belle_sip_header_content_type_t* content_type) {
	if (content_type->type) belle_sip_free((void*)content_type->type);
	if (content_type->subtype) belle_sip_free((void*)content_type->subtype);
}
jehan's avatar
jehan committed
289

Simon Morlat's avatar
Simon Morlat committed
290 291 292
static void belle_sip_header_content_type_clone(belle_sip_header_content_type_t* content_type, const belle_sip_header_content_type_t* orig){
}

293
BELLE_SIP_NEW_WITH_NAME(header_content_type,parameters,"Content-Type")
294 295 296
BELLE_SIP_PARSE(header_content_type)
GET_SET_STRING(belle_sip_header_content_type,type);
GET_SET_STRING(belle_sip_header_content_type,subtype);
jehan's avatar
jehan committed
297 298 299 300 301 302 303 304 305
/**************************
* Route header object inherent from header_address
****************************
*/
struct _belle_sip_header_route  {
	belle_sip_header_address_t address;
};

static void belle_sip_header_route_destroy(belle_sip_header_route_t* route) {
Simon Morlat's avatar
Simon Morlat committed
306 307 308
}

static void belle_sip_header_route_clone(belle_sip_header_route_t* route, const belle_sip_header_route_t* orig) {
jehan's avatar
jehan committed
309 310
}

311
BELLE_SIP_NEW_WITH_NAME(header_route,header_address,"Route")
jehan's avatar
jehan committed
312 313 314 315 316 317 318 319 320 321
BELLE_SIP_PARSE(header_route)
/**************************
* Record route header object inherent from header_address
****************************
*/
struct _belle_sip_header_record_route  {
	belle_sip_header_address_t address;
};

static void belle_sip_header_record_route_destroy(belle_sip_header_record_route_t* record_route) {
Simon Morlat's avatar
Simon Morlat committed
322 323 324 325
}

static void belle_sip_header_record_route_clone(belle_sip_header_record_route_t* record_route,
                                const belle_sip_header_record_route_t* orig               ) {
jehan's avatar
jehan committed
326 327
}

328
BELLE_SIP_NEW_WITH_NAME(header_record_route,header_address,"Record-Route")
jehan's avatar
jehan committed
329
BELLE_SIP_PARSE(header_record_route)
jehan's avatar
jehan committed
330 331 332 333 334 335 336 337 338 339
/**************************
* content length header object inherent from object
****************************
*/
struct _belle_sip_header_content_length  {
	belle_sip_object_t base;
	unsigned int content_length;
};

static void belle_sip_header_content_length_destroy(belle_sip_header_content_length_t* content_length) {
Simon Morlat's avatar
Simon Morlat committed
340
}
jehan's avatar
jehan committed
341

Simon Morlat's avatar
Simon Morlat committed
342 343
static void belle_sip_header_content_length_clone(belle_sip_header_content_length_t* content_length,
                                                 const belle_sip_header_content_length_t *orig ) {
jehan's avatar
jehan committed
344
}
Simon Morlat's avatar
Simon Morlat committed
345 346 347


BELLE_SIP_NEW_WITH_NAME(header_content_length,header,"Content-Length")
jehan's avatar
jehan committed
348 349
BELLE_SIP_PARSE(header_content_length)
GET_SET_INT(belle_sip_header_content_length,content_length,unsigned int)