Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
belle-sip
Commits
ce805eca
Commit
ce805eca
authored
Sep 26, 2016
by
jehan
Browse files
add diversion header
parent
3f1643d1
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
111 additions
and
0 deletions
+111
-0
include/belle-sip/headers.h
include/belle-sip/headers.h
+23
-0
include/belle-sip/types.h
include/belle-sip/types.h
+1
-0
src/belle_sip_headers_impl.c
src/belle_sip_headers_impl.c
+67
-0
src/belle_sip_internal.h
src/belle_sip_internal.h
+1
-0
src/grammars/belle_sip_message.g
src/grammars/belle_sip_message.g
+19
-0
No files found.
include/belle-sip/headers.h
View file @
ce805eca
...
...
@@ -238,6 +238,29 @@ BELLESIP_EXPORT belle_sip_header_contact_t* belle_sip_header_contact_create (con
#define BELLE_SIP_HEADER_TO(t) BELLE_SIP_CAST(t,belle_sip_header_to_t)
#define BELLE_SIP_TO "To"
/******************************
* Diversion header object inherent from header_address
*
******************************/
typedef
struct
_belle_sip_header_diversion
belle_sip_header_diversion_t
;
BELLESIP_EXPORT
belle_sip_header_diversion_t
*
belle_sip_header_diversion_new
();
BELLESIP_EXPORT
belle_sip_header_diversion_t
*
belle_sip_header_diversion_parse
(
const
char
*
diversion
)
;
BELLESIP_EXPORT
belle_sip_header_diversion_t
*
belle_sip_header_diversion_create
(
const
belle_sip_header_address_t
*
address
,
const
char
*
tag
);
BELLESIP_EXPORT
belle_sip_header_diversion_t
*
belle_sip_header_diversion_create2
(
const
char
*
address
,
const
char
*
tag
);
BELLESIP_EXPORT
void
belle_sip_header_diversion_set_tag
(
belle_sip_header_diversion_t
*
diversion
,
const
char
*
tag
);
BELLESIP_EXPORT
const
char
*
belle_sip_header_diversion_get_tag
(
const
belle_sip_header_diversion_t
*
from
);
BELLESIP_EXPORT
void
belle_sip_header_diversion_set_random_tag
(
belle_sip_header_diversion_t
*
obj
);
#define BELLE_SIP_HEADER_DIVERSION(t) BELLE_SIP_CAST(t,belle_sip_header_diversion_t)
#define BELLE_SIP_DIVERSION "Diversion"
/******************************
* Via header object inherent from header_address
*
...
...
include/belle-sip/types.h
View file @
ce805eca
...
...
@@ -65,6 +65,7 @@ BELLE_SIP_DECLARE_TYPES_BEGIN(belle_sip,1)
BELLE_SIP_TYPE_ID
(
belle_sip_header_from_t
),
BELLE_SIP_TYPE_ID
(
belle_sip_header_to_t
),
BELLE_SIP_TYPE_ID
(
belle_sip_header_via_t
),
BELLE_SIP_TYPE_ID
(
belle_sip_header_diversion_t
),
BELLE_SIP_TYPE_ID
(
belle_sip_uri_t
),
BELLE_SIP_TYPE_ID
(
belle_sip_message_t
),
BELLE_SIP_TYPE_ID
(
belle_sip_request_t
),
...
...
src/belle_sip_headers_impl.c
View file @
ce805eca
...
...
@@ -49,6 +49,8 @@ static struct header_name_func_pair header_table[] = {
,{
PROTO_SIP
,
BELLE_SIP_FROM
,
(
header_parse_func
)
belle_sip_header_from_parse
}
,{
PROTO_SIP
,
"t"
,
(
header_parse_func
)
belle_sip_header_to_parse
}
,{
PROTO_SIP
,
BELLE_SIP_TO
,
(
header_parse_func
)
belle_sip_header_to_parse
}
,{
PROTO_SIP
,
"d"
,
(
header_parse_func
)
belle_sip_header_diversion_parse
}
,{
PROTO_SIP
,
BELLE_SIP_DIVERSION
,
(
header_parse_func
)
belle_sip_header_diversion_parse
}
,{
PROTO_SIP
,
"i"
,
(
header_parse_func
)
belle_sip_header_call_id_parse
}
,{
PROTO_SIP
,
BELLE_SIP_CALL_ID
,
(
header_parse_func
)
belle_sip_header_call_id_parse
}
,{
PROTO_SIP
,
"l"
,
(
header_parse_func
)
belle_sip_header_content_length_parse
}
...
...
@@ -568,6 +570,71 @@ const char *belle_sip_header_to_get_tag(const belle_sip_header_to_t *obj){
return
belle_sip_header_to_get_raw_tag
(
obj
);
}
/**************************
* Diversion header object inherits from header_address
****************************
*/
struct
_belle_sip_header_diversion
{
belle_sip_header_address_t
address
;
};
static
void
belle_sip_header_diversion_destroy
(
belle_sip_header_diversion_t
*
diversion
)
{
}
void
belle_sip_header_diversion_clone
(
belle_sip_header_diversion_t
*
contact
,
const
belle_sip_header_diversion_t
*
orig
){
}
belle_sip_error_code
belle_sip_header_diversion_marshal
(
belle_sip_header_diversion_t
*
diversion
,
char
*
buff
,
size_t
buff_size
,
size_t
*
offset
)
{
BELLE_SIP_FROM_LIKE_MARSHAL
(
diversion
,
FALSE
)
}
BELLE_SIP_NEW_HEADER
(
header_diversion
,
header_address
,
BELLE_SIP_DIVERSION
)
BELLE_SIP_PARSE
(
header_diversion
)
GET_SET_STRING_PARAM2
(
belle_sip_header_diversion
,
tag
,
raw_tag
);
belle_sip_header_diversion_t
*
belle_sip_header_diversion_create2
(
const
char
*
uri
,
const
char
*
tag
){
belle_sip_header_address_t
*
address
=
belle_sip_header_address_parse
(
uri
);
if
(
address
)
{
belle_sip_header_diversion_t
*
diversion
=
belle_sip_header_diversion_create
(
address
,
tag
);
belle_sip_object_unref
(
address
);
return
diversion
;
}
else
return
NULL
;
}
belle_sip_header_diversion_t
*
belle_sip_header_diversion_create
(
const
belle_sip_header_address_t
*
address
,
const
char
*
tag
)
{
belle_sip_header_diversion_t
*
header
=
belle_sip_header_diversion_new
();
belle_sip_uri_t
*
uri
;
_belle_sip_object_copy
((
belle_sip_object_t
*
)
header
,(
belle_sip_object_t
*
)
address
);
/*clear unwanted uri components*/
if
((
uri
=
belle_sip_header_address_get_uri
(
BELLE_SIP_HEADER_ADDRESS
(
header
))))
{
belle_sip_parameters_t
*
params
=
BELLE_SIP_PARAMETERS
(
uri
);
belle_sip_parameters_remove_parameter
(
params
,
"lr"
);
belle_sip_parameters_remove_parameter
(
params
,
"ttl"
);
belle_sip_parameters_remove_parameter
(
params
,
"method"
);
belle_sip_parameters_remove_parameter
(
params
,
"maddr"
);
belle_sip_parameters_remove_parameter
(
params
,
"transport"
);
belle_sip_uri_set_port
(
uri
,
0
);
belle_sip_uri_headers_clean
(
uri
);
}
belle_sip_header_set_name
(
BELLE_SIP_HEADER
(
header
),
BELLE_SIP_DIVERSION
);
/*restaure header name*/
if
(
tag
)
belle_sip_header_diversion_set_tag
(
header
,
tag
);
return
header
;
}
void
belle_sip_header_diversion_set_random_tag
(
belle_sip_header_diversion_t
*
obj
){
char
tmp
[
8
];
/*not less than 32bit */
belle_sip_header_diversion_set_tag
(
obj
,
belle_sip_random_token
(
tmp
,
sizeof
(
tmp
)));
}
void
belle_sip_header_diversion_set_tag
(
belle_sip_header_diversion_t
*
obj
,
const
char
*
tag
){
if
(
tag
==
BELLE_SIP_RANDOM_TAG
)
belle_sip_header_diversion_set_random_tag
(
obj
);
else
belle_sip_header_diversion_set_raw_tag
(
obj
,
tag
);
}
const
char
*
belle_sip_header_diversion_get_tag
(
const
belle_sip_header_diversion_t
*
obj
){
return
belle_sip_header_diversion_get_raw_tag
(
obj
);
}
/******************************
* User-Agent header inherits from header
...
...
src/belle_sip_internal.h
View file @
ce805eca
...
...
@@ -140,6 +140,7 @@ BELLE_SIP_DECLARE_VPTR(belle_sip_header_contact_t);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_header_from_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_header_to_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_header_via_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_header_diversion_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_uri_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_message_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_request_t
);
...
...
src/grammars/belle_sip_message.g
View file @
ce805eca
...
...
@@ -183,6 +183,7 @@ message_header [belle_sip_message_t* message]
// | supported
// | timestamp*/
// | header_to {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_to.ret));}/*
// | header_diversion {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_diversion.ret));}/*
// | unsupported
// | user_agent*/
// | header_via {belle_sip_message_add_header(message,BELLE_SIP_HEADER($header_via.ret));}/*
...
...
@@ -1216,6 +1217,24 @@ to_spec
to_param
: /*tag_param |*/ generic_param [BELLE_SIP_PARAMETERS($header_to::current)];
diversion_token: {IS_HEADER_NAMED(Diversion,d)}? token;
header_diversion returns [belle_sip_header_diversion_t* ret=NULL]
scope { belle_sip_header_diversion_t* current; }
@init { $header_diversion::current = belle_sip_header_diversion_new(); $ret = $header_diversion::current;}
: diversion_token /*'Diversion' ( 'Diversion' | 'd' )*/ sp_tab_colon diversion_spec;
catch [ANTLR3_RECOGNITION_EXCEPTION]
{
belle_sip_message("[\%s] reason [\%s]",(const char*)EXCEPTION->name,(const char*)EXCEPTION->message);
belle_sip_object_unref($header_diversion::current);
$ret=NULL;
}
diversion_spec
: ( name_addr_with_generic_uri[BELLE_SIP_HEADER_ADDRESS($header_diversion::current)] | paramless_addr_spec_with_generic_uri[BELLE_SIP_HEADER_ADDRESS($header_diversion::current)] )
( SEMI lws? diversion_param lws?)*;
diversion_param
: /*tag_param |*/ generic_param [BELLE_SIP_PARAMETERS($header_diversion::current)];
refer_to_token: {IS_TOKEN(Refer-To)}? token;
header_refer_to returns [belle_sip_header_refer_to_t* ret=NULL]
: refer_to_token /*'Refer-To'*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment