Commit 8cedab5a authored by Simon Morlat's avatar Simon Morlat

constifies getters, fixes and cleanups

Merge branch 'master' of belledonne-communications.com:belle-sip

Conflicts:
	include/belle-sip/message.h
parents ffc30233 af550943
......@@ -63,6 +63,7 @@ typedef enum belle_sip_type_id{
BELLE_SIP_TYPE_ID(belle_sip_header_route_t),
BELLE_SIP_TYPE_ID(belle_sip_header_record_route_t),
BELLE_SIP_TYPE_ID(belle_sip_header_content_length_t),
BELLE_SIP_TYPE_ID(belle_sip_header_t),
belle_sip_type_id_end
}belle_sip_type_id_t;
......
......@@ -21,6 +21,8 @@
#include "belle-sip/uri.h"
/***************************************************************************************
* header address
*
......@@ -44,7 +46,7 @@ void belle_sip_header_address_set_uri(belle_sip_header_address_t* address, belle
/**
*
*/
const char* belle_sip_header_address_get_displayname(belle_sip_header_address_t* address);
const char* belle_sip_header_address_get_displayname(const belle_sip_header_address_t* address);
/**
*
*/
......@@ -61,6 +63,10 @@ void belle_sip_header_address_set_displayname(belle_sip_header_address_t* addres
typedef struct _belle_sip_header belle_sip_header_t;
const char *belle_sip_header_get_name(const belle_sip_header_t *h);
#define BELLE_SIP_HEADER(h) BELLE_SIP_CAST(h,belle_sip_header_t)
/***********************
* Contact header object
************************/
......@@ -77,17 +83,17 @@ belle_sip_header_contact_t* belle_sip_header_contact_parse (const char* contact)
*@returns value of the expires parameter measured in delta-seconds, O implies removal of Registration specified in Contact Header.
*
*/
int belle_sip_header_contact_get_expires(belle_sip_header_contact_t* contact);
int belle_sip_header_contact_get_expires(const belle_sip_header_contact_t* contact);
/**
* Returns the value of the q-value parameter of this ContactHeader. The q-value parameter indicates the relative preference amongst a set of locations. q-values are decimal numbers from 0 to 1, with higher values indicating higher preference.
* @return the q-value parameter of this ContactHeader, -1 if the q-value is not set.
*/
float belle_sip_header_contact_get_qvalue(belle_sip_header_contact_t* contact);
float belle_sip_header_contact_get_qvalue(const belle_sip_header_contact_t* contact);
/**
* Returns a boolean value that indicates if the contact header has the format of Contact: *.
* @return true if this is a wildcard address, false otherwise.
*/
unsigned int belle_sip_header_contact_is_wildcard(belle_sip_header_contact_t* contact);
unsigned int belle_sip_header_contact_is_wildcard(const belle_sip_header_contact_t* contact);
/**
*
*/
......@@ -118,7 +124,7 @@ belle_sip_header_contact_t* belle_sip_header_contact_parse (const char* contact)
void belle_sip_header_from_set_tag(belle_sip_header_from_t* from, const char* tag);
const char* belle_sip_header_from_get_tag(belle_sip_header_from_t* from);
const char* belle_sip_header_from_get_tag(const belle_sip_header_from_t* from);
#define BELLE_SIP_HEADER_FROM(t) BELLE_SIP_CAST(t,belle_sip_header_from_t)
/******************************
......@@ -130,12 +136,12 @@ belle_sip_header_contact_t* belle_sip_header_contact_parse (const char* contact)
belle_sip_header_to_t* belle_sip_header_to_new();
belle_sip_header_to_t* belle_sip_header_to_parse (const char* to) ;
belle_sip_header_to_t* belle_sip_header_to_parse(const char* to) ;
void belle_sip_header_to_set_tag(belle_sip_header_to_t* from, const char* tag);
const char* belle_sip_header_to_get_tag(belle_sip_header_to_t* from);
const char* belle_sip_header_to_get_tag(const belle_sip_header_to_t* from);
#define BELLE_SIP_HEADER_TO(t) BELLE_SIP_CAST(t,belle_sip_header_to_t)
......@@ -148,17 +154,17 @@ typedef struct _belle_sip_header_via belle_sip_header_via_t;
belle_sip_header_via_t* belle_sip_header_via_new();
belle_sip_header_via_t* belle_sip_header_via_parse (const char* via) ;
const char* belle_sip_header_via_get_branch(belle_sip_header_via_t* via);
const char* belle_sip_header_via_get_transport(belle_sip_header_via_t* via);
const char* belle_sip_header_via_get_host(belle_sip_header_via_t* via);
int belle_sip_header_via_get_port(belle_sip_header_via_t* via);
int belle_sip_header_via_get_listening_port(belle_sip_header_via_t *via);
const char* belle_sip_header_via_get_maddr(belle_sip_header_via_t* via);
const char* belle_sip_header_via_get_protocol(belle_sip_header_via_t* via);
const char* belle_sip_header_via_get_received(belle_sip_header_via_t* via);
int belle_sip_header_via_get_rport(belle_sip_header_via_t* via);
int belle_sip_header_via_get_ttl(belle_sip_header_via_t* via);
const char* belle_sip_header_via_get_branch(const belle_sip_header_via_t* via);
const char* belle_sip_header_via_get_transport(const belle_sip_header_via_t* via);
const char* belle_sip_header_via_get_host(const belle_sip_header_via_t* via);
int belle_sip_header_via_get_port(const belle_sip_header_via_t* via);
int belle_sip_header_via_get_listening_port(const belle_sip_header_via_t *via);
const char* belle_sip_header_via_get_maddr(const belle_sip_header_via_t* via);
const char* belle_sip_header_via_get_protocol(const belle_sip_header_via_t* via);
const char* belle_sip_header_via_get_received(const belle_sip_header_via_t* via);
int belle_sip_header_via_get_rport(const belle_sip_header_via_t* via);
int belle_sip_header_via_get_ttl(const belle_sip_header_via_t* via);
void belle_sip_header_via_set_branch(belle_sip_header_via_t* via,const char* branch);
void belle_sip_header_via_set_host(belle_sip_header_via_t* via, const char* host);
......@@ -180,7 +186,7 @@ typedef struct _belle_sip_header_call_id belle_sip_header_call_id_t;
belle_sip_header_call_id_t* belle_sip_header_call_id_new();
belle_sip_header_call_id_t* belle_sip_header_call_id_parse (const char* call_id) ;
const char* belle_sip_header_call_id_get_call_id(belle_sip_header_call_id_t* call_id);
const char* belle_sip_header_call_id_get_call_id(const belle_sip_header_call_id_t* call_id);
void belle_sip_header_call_id_set_call_id(belle_sip_header_call_id_t* via,const char* call_id);
#define BELLE_SIP_HEADER_CALL_ID(t) BELLE_SIP_CAST(t,belle_sip_header_call_id_t)
/******************************
......@@ -192,9 +198,9 @@ typedef struct _belle_sip_header_cseq belle_sip_header_cseq_t;
belle_sip_header_cseq_t* belle_sip_header_cseq_new();
belle_sip_header_cseq_t* belle_sip_header_cseq_parse (const char* cseq) ;
const char* belle_sip_header_cseq_get_method(belle_sip_header_cseq_t* cseq);
const char* belle_sip_header_cseq_get_method(const belle_sip_header_cseq_t* cseq);
void belle_sip_header_cseq_set_method(belle_sip_header_cseq_t* cseq,const char* method);
unsigned int belle_sip_header_cseq_get_seq_number(belle_sip_header_cseq_t* cseq);
unsigned int belle_sip_header_cseq_get_seq_number(const belle_sip_header_cseq_t* cseq);
void belle_sip_header_cseq_set_seq_number(belle_sip_header_cseq_t* cseq,unsigned int seq_number);
#define BELLE_SIP_HEADER_CSEQ(t) BELLE_SIP_CAST(t,belle_sip_header_cseq_t)
/******************************
......@@ -206,9 +212,9 @@ typedef struct _belle_sip_header_content_type belle_sip_header_content_type_t;
belle_sip_header_content_type_t* belle_sip_header_content_type_new();
belle_sip_header_content_type_t* belle_sip_header_content_type_parse (const char* content_type) ;
const char* belle_sip_header_content_type_get_type(belle_sip_header_content_type_t* content_type);
const char* belle_sip_header_content_type_get_type(const belle_sip_header_content_type_t* content_type);
void belle_sip_header_content_type_set_type(belle_sip_header_content_type_t* content_type,const char* type);
const char* belle_sip_header_content_type_get_subtype(belle_sip_header_content_type_t* content_type);
const char* belle_sip_header_content_type_get_subtype(const belle_sip_header_content_type_t* content_type);
void belle_sip_header_content_type_set_subtype(belle_sip_header_content_type_t* content_type,const char* sub_type);
#define BELLE_SIP_HEADER_CONTENT_TYPE(t) BELLE_SIP_CAST(t,belle_sip_header_content_type_t)
/******************************
......@@ -240,7 +246,7 @@ typedef struct _belle_sip_header_content_length belle_sip_header_content_length_
belle_sip_header_content_length_t* belle_sip_header_content_length_new();
belle_sip_header_content_length_t* belle_sip_header_content_length_parse (const char* content_length) ;
unsigned int belle_sip_header_content_length_get_content_length(belle_sip_header_content_length_t* content_length);
unsigned int belle_sip_header_content_length_get_content_length(const belle_sip_header_content_length_t* content_length);
void belle_sip_header_content_length_set_content_length(belle_sip_header_content_length_t* content_length,unsigned int length);
#define BELLE_SIP_HEADER_CONTENT_LENGTH(t) BELLE_SIP_CAST(t,belle_sip_header_content_length_t)
......
......@@ -26,9 +26,11 @@ typedef struct _belle_sip_response belle_sip_response_t;
#define BELLE_SIP_REQUEST(obj) BELLE_SIP_CAST(obj,belle_sip_request_t)
#define BELLE_SIP_RESPONSE(obj) BELLE_SIP_CAST(obj,belle_sip_response_t)
BELLE_SIP_BEGIN_DECLS
belle_sip_message_t* belle_sip_message_parse(const char* raw);
int belle_sip_message_is_request(belle_sip_message_t *msg);
belle_sip_request_t* belle_sip_request_new();
belle_sip_request_t* belle_sip_request_parse(const char* raw);
......@@ -37,6 +39,7 @@ belle_sip_request_t* belle_sip_request_parse(const char* raw);
belle_sip_uri_t* belle_sip_request_get_uri(belle_sip_request_t* request);
void belle_sip_request_set_uri(belle_sip_request_t* request,belle_sip_uri_t* uri);
const char* belle_sip_request_get_method(belle_sip_request_t* request);
......@@ -44,9 +47,14 @@ void belle_sip_request_set_method(belle_sip_request_t* request,const char* metho
int belle_sip_message_is_response(belle_sip_message_t *msg);
belle_sip_header_t *belle_sip_message_get_header_first(belle_sip_message_t *msg, const char *header_name);
belle_sip_header_t *belle_sip_message_get_header(belle_sip_message_t *msg, const char *header_name);
belle_sip_header_t *belle_sip_message_get_header_last(belle_sip_message_t *msg, const char *header_name);
/**
* add an header to this message
* @param msg
* @param header to add, must be one of header type
*/
void belle_sip_message_add_header(belle_sip_message_t *msg, belle_sip_header_t* header);
char *belle_sip_message_to_string(belle_sip_message_t *msg);
......
......@@ -37,68 +37,68 @@ typedef struct _belle_sip_uri belle_sip_uri_t;
* Returns the value of the named header, or null if it is not set.
*
*/
const char* belle_sip_uri_get_header(belle_sip_uri_t* uri,const char* name);
const char* belle_sip_uri_get_header(const belle_sip_uri_t* uri,const char* name);
/**
* Returns an Iterator over the const char*names of all headers present in this SipURI.
*
*/
const belle_sip_list_t* belle_sip_uri_get_header_names(belle_sip_uri_t* uri) ;
const belle_sip_list_t* belle_sip_uri_get_header_names(const belle_sip_uri_t* uri) ;
/**
* Returns the host part of this SipURI.
*
*/
const char* belle_sip_uri_get_host(belle_sip_uri_t* uri) ;
const char* belle_sip_uri_get_host(const belle_sip_uri_t* uri) ;
/**
* Returns the value of the maddr parameter, or null if this is not set.
*
*/
const char* belle_sip_uri_get_maddr_param(belle_sip_uri_t* uri) ;
const char* belle_sip_uri_get_maddr_param(const belle_sip_uri_t* uri) ;
/**
* Returns the value of the method parameter, or null if this is not set.
*
*/
const char* belle_sip_uri_get_method_param(belle_sip_uri_t* uri) ;
const char* belle_sip_uri_get_method_param(const belle_sip_uri_t* uri) ;
/**
* Returns the port part of this SipURI.
*
*/
unsigned int belle_sip_uri_get_port(belle_sip_uri_t* uri) ;
unsigned int belle_sip_uri_get_port(const belle_sip_uri_t* uri) ;
/**
* Returns the value of the "transport" parameter, or null if this is not set.
*
*/
const char* belle_sip_uri_get_transport_param(belle_sip_uri_t* uri) ;
const char* belle_sip_uri_get_transport_param(const belle_sip_uri_t* uri) ;
/**
* Returns the value of the "ttl" parameter, or -1 if this is not set.
*
*/
int belle_sip_uri_get_ttl_param(belle_sip_uri_t* uri) ;
int belle_sip_uri_get_ttl_param(const belle_sip_uri_t* uri) ;
/**
* Returns the user part of this SipURI.
*
*/
const char* belle_sip_uri_get_user(belle_sip_uri_t* uri) ;
const char* belle_sip_uri_get_user(const belle_sip_uri_t* uri) ;
/**
* Returns the value of the userParam, or null if this is not set.
*
*/
const char* belle_sip_uri_get_user_param(belle_sip_uri_t* uri) ;
const char* belle_sip_uri_get_user_param(const belle_sip_uri_t* uri) ;
/**
* Gets user password of SipURI, or null if it is not set.
*
*/
const char* belle_sip_uri_get_user_password(belle_sip_uri_t* uri) ;
const char* belle_sip_uri_get_user_password(const belle_sip_uri_t* uri) ;
/**
* Returns whether the the lr parameter is set.
*
*/
unsigned int belle_sip_uri_has_lr_param(belle_sip_uri_t* uri) ;
unsigned int belle_sip_uri_has_lr_param(const belle_sip_uri_t* uri) ;
/**
*
* Returns true if this SipURI is secure i.e. if this SipURI represents a sips URI.
*
*/
unsigned int belle_sip_uri_is_secure(belle_sip_uri_t* uri) ;
unsigned int belle_sip_uri_is_secure(const belle_sip_uri_t* uri) ;
/**
* Removes the port part of this SipURI.
*
......
......@@ -27,6 +27,23 @@
#include "belle_sip_messageLexer.h"
#include "belle_sip_internal.h"
/************************
* header
***********************/
struct _belle_sip_header {
belle_sip_object_t base;
char* name;
};
GET_SET_STRING(belle_sip_header,name);
void belle_sip_header_init(belle_sip_header_t *header) {
belle_sip_object_init_type(header,belle_sip_header_t);
belle_sip_object_init((belle_sip_object_t*)header); /*super*/
}
static void belle_sip_header_destroy(belle_sip_header_t *header){
if (header->name) belle_sip_free((void*)header->name);
}
/************************
* header_address
......@@ -44,6 +61,7 @@ static void belle_sip_header_address_init(belle_sip_header_address_t* object){
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));
belle_sip_header_destroy((belle_sip_header_t*)contact);
}
BELLE_SIP_NEW(header_address,object)
......@@ -101,7 +119,7 @@ int belle_sip_header_contact_set_qvalue(belle_sip_header_contact_t* contact, flo
_belle_sip_header_contact_set_q(contact,qValue);
return 0;
}
float belle_sip_header_contact_get_qvalue(belle_sip_header_contact_t* contact) {
float belle_sip_header_contact_get_qvalue(const belle_sip_header_contact_t* contact) {
return belle_sip_header_contact_get_q(contact);
}
/**************************
......@@ -186,6 +204,7 @@ int belle_sip_header_via_set_ttl (belle_sip_header_via_t* obj,int value) {
return -1;
}
}
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);
......@@ -196,7 +215,7 @@ int belle_sip_header_via_set_port (belle_sip_header_via_t* obj,int value) {
}
}
int belle_sip_header_via_get_listening_port(belle_sip_header_via_t *via){
int belle_sip_header_via_get_listening_port(const belle_sip_header_via_t *via){
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;
......
......@@ -218,7 +218,7 @@ uint64_t belle_sip_time_ms(void);
/*parameters accessors*/
#define GET_SET_STRING(object_type,attribute) \
const char* object_type##_get_##attribute (object_type##_t* obj) {\
const char* object_type##_get_##attribute (const object_type##_t* obj) {\
return obj->attribute;\
}\
void object_type##_set_##attribute (object_type##_t* obj,const char* value) {\
......@@ -228,7 +228,7 @@ uint64_t belle_sip_time_ms(void);
}
#define GET_SET_STRING_PARAM(object_type,attribute) GET_SET_STRING_PARAM2(object_type,attribute,attribute)
#define GET_SET_STRING_PARAM2(object_type,attribute,func_name) \
const char* object_type##_get_##func_name (object_type##_t* obj) {\
const char* object_type##_get_##func_name (const object_type##_t* obj) {\
const char* l_value = belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(obj),#attribute);\
if (l_value == NULL) { \
belle_sip_warning("cannot find parameters [%s]",#attribute);\
......@@ -244,7 +244,7 @@ uint64_t belle_sip_time_ms(void);
#define GET_SET_INT(object_type,attribute,type) GET_SET_INT_PRIVATE(object_type,attribute,type,)
#define GET_SET_INT_PRIVATE(object_type,attribute,type,set_prefix) \
type object_type##_get_##attribute (object_type##_t* obj) {\
type object_type##_get_##attribute (const object_type##_t* obj) {\
return obj->attribute;\
}\
void set_prefix##object_type##_set_##attribute (object_type##_t* obj,type value) {\
......@@ -262,7 +262,7 @@ uint64_t belle_sip_time_ms(void);
#define GET_SET_INT_PARAM_PRIVATE(object_type,attribute,type,set_prefix) GET_SET_INT_PARAM_PRIVATE2(object_type,attribute,type,set_prefix,attribute)
#define GET_SET_INT_PARAM_PRIVATE2(object_type,attribute,type,set_prefix,func_name) \
type object_type##_get_##func_name (object_type##_t* obj) {\
type object_type##_get_##func_name (const object_type##_t* obj) {\
const char* l_value = belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(obj),#attribute);\
if (l_value == NULL) { \
belle_sip_error("cannot find parameters [%s]",#attribute);\
......@@ -281,14 +281,14 @@ uint64_t belle_sip_time_ms(void);
}
#define GET_SET_BOOL(object_type,attribute,getter) \
unsigned int object_type##_##getter##_##attribute (object_type##_t* obj) {\
unsigned int object_type##_##getter##_##attribute (const object_type##_t* obj) {\
return obj->attribute;\
}\
void object_type##_set_##attribute (object_type##_t* obj,unsigned int value) {\
obj->attribute=value;\
}
#define GET_SET_BOOL_PARAM2(object_type,attribute,getter,func_name) \
unsigned int object_type##_##getter##_##func_name (object_type##_t* obj) {\
unsigned int object_type##_##getter##_##func_name (const object_type##_t* obj) {\
return belle_sip_parameters_is_parameter(BELLE_SIP_PARAMETERS(obj),#attribute);\
}\
void object_type##_set_##func_name (object_type##_t* obj,unsigned int value) {\
......
......@@ -30,12 +30,13 @@ options {
message
: request /*| response*/ ;
message returns [belle_sip_message_t* ret]
: request {$ret = BELLE_SIP_MESSAGE($request.ret);}
/*| response*/ ;
request returns [belle_sip_request_t* ret]
scope { belle_sip_request_t* current; }
@init {$request::current = belle_sip_request_new(); $ret=$request::current; }
: request_line message_header+ CRLF message_body ? ;
: request_line message_header[BELLE_SIP_MESSAGE($request::current)]+ CRLF message_body ? ;
request_line
: method {belle_sip_request_set_method($request::current,(const char*)($method.text->chars));}
......@@ -48,27 +49,28 @@ request_line
sip_version
: 'SIP/' DIGIT '.' DIGIT;
message_header
: (/*accept
message_header [belle_sip_message_t* message]
: (/*accept
| accept_encoding
| accept_language
| alert_info
| allow
| authentication_info
| authorization
|*/ header_call_id/*
|*/ header_call_id {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_call_id.ret));}/*
| call_info
| contact
| content_disposition
| content_encoding
| content_language*/
| header_content_length
| header_content_type
| header_cseq/*
| header_content_length {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_content_length.ret));}
| header_content_type {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_content_type.ret));}
| header_cseq {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_cseq.ret));}/*
| date
| error_info
| expires*/
| header_from /*
| header_from {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_from.ret));}/*
| in_reply_to
| max_forwards
| mime_version
......@@ -78,22 +80,24 @@ message_header
| proxy_authenticate
| proxy_authorization
| proxy_require*/
| header_record_route /*
| header_record_route {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_record_route.ret));}/*
| reply_to
| require
| retry_after*/
| header_route /*
| header_route {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_route.ret));}/*
| server
| subject
| supported
| timestamp*/
| header_to/*
| header_to {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_to.ret));}/*
| unsupported
| user_agent*/
| header_via /*
| header_via {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_via.ret));}/*
| warning
| www_authenticate*/
| header_extension_header) CRLF;
| header_extension_header
) CRLF
;
/*
invitem
: 'INVITE' ; //INVITE in caps
......
......@@ -76,14 +76,14 @@ char* belle_sip_uri_to_string(belle_sip_uri_t* uri) {
}
const char* belle_sip_uri_get_header(belle_sip_uri_t* uri,const char* name) {
const char* belle_sip_uri_get_header(const belle_sip_uri_t* uri,const char* name) {
return belle_sip_parameters_get_parameter(uri->header_list,name);
}
void belle_sip_uri_set_header(belle_sip_uri_t* uri,const char* name,const char* value) {
belle_sip_parameters_set_parameter(uri->header_list,name,value);
}
const belle_sip_list_t* belle_sip_uri_get_header_names(belle_sip_uri_t* uri) {
const belle_sip_list_t* belle_sip_uri_get_header_names(const belle_sip_uri_t* uri) {
return belle_sip_parameters_get_parameter_names(uri->header_list);
}
......
......@@ -26,6 +26,7 @@ typedef struct _headers_container {
static headers_container_t* belle_sip_message_headers_container_new(const char* name) {
headers_container_t* headers_container = belle_sip_new0(headers_container_t);
headers_container->name= belle_sip_strdup(name);
return NULL; /*FIXME*/
}
struct _belle_sip_message {
......@@ -34,6 +35,8 @@ struct _belle_sip_message {
belle_sip_list_t* headernames_list;
};
BELLE_SIP_PARSE(message)
static int belle_sip_headers_container_comp_func(const headers_container_t *a, const char*b) {
return strcmp(a->name,b);
}
......@@ -48,8 +51,19 @@ headers_container_t* belle_sip_headers_container_get(belle_sip_message_t* messag
return result?(headers_container_t*)(result->data):NULL;
}
void belle_sip_message_add_header(belle_sip_message_t *message,belle_sip_header_t* header) {
// first check if already exist
headers_container_t* headers_container = belle_sip_headers_container_get(message,belle_sip_header_get_name(header));
if (headers_container == NULL) {
headers_container = belle_sip_message_headers_container_new(belle_sip_header_get_name(header));
belle_sip_list_append(message->header_list,headers_container);
}
belle_sip_list_append(headers_container->header_list,header);
}
const belle_sip_list_t* belle_sip_message_get_headers(belle_sip_message_t *message,const char* header_name) {
headers_container_t* headers_container = belle_sip_headers_container_get(message,header_name);
return headers_container ? headers_container->header_list:NULL;
}
struct _belle_sip_request {
belle_sip_message_t message;
};
......@@ -74,10 +88,24 @@ int belle_sip_message_is_response(belle_sip_message_t *msg){
return 0;
}
belle_sip_header_t *belle_sip_message_get_header_last(belle_sip_message_t *msg, const char *header_name){
belle_sip_header_t *belle_sip_message_get_header(belle_sip_message_t *msg, const char *header_name){
const belle_sip_list_t *l=belle_sip_message_get_headers(msg,header_name);
if (l!=NULL)
return (belle_sip_header_t*)l->data;
return NULL;
}
void belle_sip_response_get_return_hop(belle_sip_response_t *msg, belle_sip_hop_t *hop){
belle_sip_header_via_t *via=BELLE_SIP_HEADER_VIA(belle_sip_message_get_header(BELLE_SIP_MESSAGE(msg),"via"));
hop->transport=belle_sip_header_via_get_protocol(via);
hop->host=belle_sip_header_via_get_received(via);
if (hop->host==NULL)
hop->host=belle_sip_header_via_get_host(via);
hop->port=belle_sip_header_via_get_rport(via);
if (hop->port==-1)
hop->port=belle_sip_header_via_get_listening_port(via);
}
char *belle_sip_message_to_string(belle_sip_message_t *msg){
return NULL;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment