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
dc829e4d
Commit
dc829e4d
authored
Feb 19, 2011
by
Simon Morlat
Browse files
new object inheritance model
parent
ac963f87
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
264 additions
and
114 deletions
+264
-114
include/belle-sip/belle-sip.h
include/belle-sip/belle-sip.h
+5
-3
include/belle-sip/message.h
include/belle-sip/message.h
+3
-0
src/belle_sip_headers_impl.c
src/belle_sip_headers_impl.c
+55
-28
src/belle_sip_internal.h
src/belle_sip_internal.h
+58
-17
src/belle_sip_loop.c
src/belle_sip_loop.c
+6
-2
src/belle_sip_object.c
src/belle_sip_object.c
+63
-28
src/belle_sip_parameters.c
src/belle_sip_parameters.c
+8
-10
src/belle_sip_uri_impl.c
src/belle_sip_uri_impl.c
+5
-1
src/listeningpoint.c
src/listeningpoint.c
+17
-10
src/message.c
src/message.c
+22
-4
src/provider.c
src/provider.c
+3
-1
src/sender_task.c
src/sender_task.c
+3
-1
src/sipstack.c
src/sipstack.c
+3
-1
src/transaction.c
src/transaction.c
+8
-7
tester/Makefile.am
tester/Makefile.am
+5
-1
No files found.
include/belle-sip/belle-sip.h
View file @
dc829e4d
...
...
@@ -100,11 +100,13 @@ void belle_sip_object_set_name(belle_sip_object_t *obj,const char* name);
**/
const
char
*
belle_sip_object_get_name
(
belle_sip_object_t
*
obj
);
belle_sip_object_t
*
belle_sip_object_clone
(
const
belle_sip_object_t
*
obj
);
/**
* De
stroy
the object: this function is intended for unowed object, that is objects
* that were created with a 0 reference count.
* De
lete
the object: this function is intended for unowed object, that is objects
* that were created with a 0 reference count.
For all others, use belle_sip_object_unref().
**/
void
belle_sip_object_de
stroy
(
void
*
obj
);
void
belle_sip_object_de
lete
(
void
*
obj
);
void
*
belle_sip_object_cast
(
belle_sip_object_t
*
obj
,
belle_sip_type_id_t
id
,
const
char
*
castname
,
const
char
*
file
,
int
fileno
);
...
...
include/belle-sip/message.h
View file @
dc829e4d
...
...
@@ -60,6 +60,9 @@ char *belle_sip_message_to_string(belle_sip_message_t *msg);
int
belle_sip_response_get_status_code
(
const
belle_sip_response_t
*
response
);
belle_sip_response_t
*
belle_sip_response_new
(
void
);
belle_sip_response_t
*
belle_sip_response_new_from_request
(
belle_sip_request_t
*
req
);
BELLE_SIP_END_DECLS
#endif
...
...
src/belle_sip_headers_impl.c
View file @
dc829e4d
...
...
@@ -34,34 +34,38 @@
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*/
}
void
belle_sip_header_destroy
(
belle_sip_header_t
*
header
){
static
void
belle_sip_header_destroy
(
belle_sip_header_t
*
header
){
if
(
header
->
name
)
belle_sip_free
((
void
*
)
header
->
name
);
}
BELLE_SIP_INSTANCIATE_VPTR
(
belle_sip_header_t
,
belle_sip_object_t
,
belle_sip_header_destroy
,
NULL
);
/************************
* header_address
***********************/
struct
_belle_sip_header_address
{
belle_sip_parameters_t
params
;
belle_sip_parameters_t
base
;
const
char
*
displayname
;
belle_sip_uri_t
*
uri
;
};
static
void
belle_sip_header_address_init
(
belle_sip_header_address_t
*
object
){
belle_sip_object_init_type
(
object
,
belle_sip_header_address_t
);
belle_sip_parameters_init
((
belle_sip_parameters_t
*
)
object
);
/*super*/
}
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
)
static
void
belle_sip_header_address_clone
(
belle_sip_header_address_t
*
addr
){
}
BELLE_SIP_NEW
(
header_address
,
parameters
)
GET_SET_STRING
(
belle_sip_header_address
,
displayname
);
void
belle_sip_header_address_set_quoted_displayname
(
belle_sip_header_address_t
*
address
,
const
char
*
value
)
{
...
...
@@ -89,7 +93,9 @@ struct _belle_sip_header_contact {
};
void
belle_sip_header_contact_destroy
(
belle_sip_header_contact_t
*
contact
)
{
belle_sip_header_address_destroy
(
BELLE_SIP_HEADER_ADDRESS
(
contact
));
}
void
belle_sip_header_contact_clone
(
belle_sip_header_contact_t
*
contact
,
const
belle_sip_header_contact_t
*
orig
){
}
BELLE_SIP_NEW_WITH_NAME
(
header_contact
,
header_address
,
"Contact"
)
...
...
@@ -128,15 +134,18 @@ struct _belle_sip_header_from {
};
static
void
belle_sip_header_from_destroy
(
belle_sip_header_from_t
*
from
)
{
belle_sip_header_address_destroy
(
BELLE_SIP_HEADER_ADDRESS
(
from
));
}
static
void
belle_sip_header_from_clone
(
belle_sip_header_from_t
*
from
,
const
belle_sip_header_from_t
*
cloned
)
{
}
BELLE_SIP_NEW_WITH_NAME
(
header_from
,
header_address
,
"From"
)
BELLE_SIP_PARSE
(
header_from
)
GET_SET_STRING_PARAM
(
belle_sip_header_from
,
tag
);
/**************************
* To header object inher
ent
from header_address
* To header object inher
its
from header_address
****************************
*/
struct
_belle_sip_header_to
{
...
...
@@ -144,7 +153,9 @@ struct _belle_sip_header_to {
};
static
void
belle_sip_header_to_destroy
(
belle_sip_header_to_t
*
to
)
{
belle_sip_header_address_destroy
(
BELLE_SIP_HEADER_ADDRESS
(
to
));
}
void
belle_sip_header_to_clone
(
belle_sip_header_to_t
*
contact
,
const
belle_sip_header_to_t
*
orig
){
}
BELLE_SIP_NEW_WITH_NAME
(
header_to
,
header_address
,
"To"
)
...
...
@@ -152,21 +163,23 @@ BELLE_SIP_PARSE(header_to)
GET_SET_STRING_PARAM
(
belle_sip_header_to
,
tag
);
/**************************
* Vi
q
header object inher
ent
from parameters
* Vi
a
header object inher
its
from parameters
****************************
*/
struct
_belle_sip_header_via
{
belle_sip_parameters_t
params_list
;
const
char
*
protocol
;
const
char
*
transport
;
const
char
*
host
;
char
*
protocol
;
char
*
transport
;
char
*
host
;
int
port
;
};
static
void
belle_sip_header_via_destroy
(
belle_sip_header_via_t
*
via
)
{
belle_sip_parameters_destroy
(
BELLE_SIP_PARAMETERS
(
via
));
if
(
via
->
host
)
belle_sip_free
((
void
*
)
via
->
host
);
if
(
via
->
protocol
)
belle_sip_free
((
void
*
)
via
->
protocol
);
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
){
}
BELLE_SIP_NEW_WITH_NAME
(
header_via
,
header_address
,
"Via"
)
...
...
@@ -219,7 +232,7 @@ int belle_sip_header_via_get_listening_port(const belle_sip_header_via_t *via){
}
/**************************
* call_id header object inher
ent
from object
* call_id header object inher
its
from object
****************************
*/
struct
_belle_sip_header_call_id
{
...
...
@@ -228,12 +241,13 @@ struct _belle_sip_header_call_id {
};
static
void
belle_sip_header_call_id_destroy
(
belle_sip_header_call_id_t
*
call_id
)
{
belle_sip_object_destroy
(
BELLE_SIP_OBJECT
(
call_id
));
if
(
call_id
->
call_id
)
belle_sip_free
((
void
*
)
call_id
->
call_id
);
}
static
void
belle_sip_header_call_id_clone
(
belle_sip_header_call_id_t
*
call_id
,
const
belle_sip_header_call_id_t
*
orig
){
}
BELLE_SIP_NEW_WITH_NAME
(
header_call_id
,
object
,
"Call-ID"
)
BELLE_SIP_NEW_WITH_NAME
(
header_call_id
,
header
,
"Call-ID"
)
BELLE_SIP_PARSE
(
header_call_id
)
GET_SET_STRING
(
belle_sip_header_call_id
,
call_id
);
/**************************
...
...
@@ -247,12 +261,14 @@ struct _belle_sip_header_cseq {
};
static
void
belle_sip_header_cseq_destroy
(
belle_sip_header_cseq_t
*
cseq
)
{
belle_sip_object_destroy
(
BELLE_SIP_OBJECT
(
cseq
));
if
(
cseq
->
method
)
belle_sip_free
((
void
*
)
cseq
->
method
);
}
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
);
}
BELLE_SIP_NEW_WITH_NAME
(
header_cseq
,
object
,
"Cseq"
)
BELLE_SIP_NEW_WITH_NAME
(
header_cseq
,
header
,
"Cseq"
)
BELLE_SIP_PARSE
(
header_cseq
)
GET_SET_STRING
(
belle_sip_header_cseq
,
method
);
GET_SET_INT
(
belle_sip_header_cseq
,
seq_number
,
unsigned
int
)
...
...
@@ -267,11 +283,13 @@ struct _belle_sip_header_content_type {
};
static
void
belle_sip_header_content_type_destroy
(
belle_sip_header_content_type_t
*
content_type
)
{
belle_sip_parameters_destroy
(
BELLE_SIP_PARAMETERS
(
content_type
));
if
(
content_type
->
type
)
belle_sip_free
((
void
*
)
content_type
->
type
);
if
(
content_type
->
subtype
)
belle_sip_free
((
void
*
)
content_type
->
subtype
);
}
static
void
belle_sip_header_content_type_clone
(
belle_sip_header_content_type_t
*
content_type
,
const
belle_sip_header_content_type_t
*
orig
){
}
BELLE_SIP_NEW_WITH_NAME
(
header_content_type
,
parameters
,
"Content-Type"
)
BELLE_SIP_PARSE
(
header_content_type
)
GET_SET_STRING
(
belle_sip_header_content_type
,
type
);
...
...
@@ -285,7 +303,9 @@ struct _belle_sip_header_route {
};
static
void
belle_sip_header_route_destroy
(
belle_sip_header_route_t
*
route
)
{
belle_sip_header_address_destroy
(
BELLE_SIP_HEADER_ADDRESS
(
route
));
}
static
void
belle_sip_header_route_clone
(
belle_sip_header_route_t
*
route
,
const
belle_sip_header_route_t
*
orig
)
{
}
BELLE_SIP_NEW_WITH_NAME
(
header_route
,
header_address
,
"Route"
)
...
...
@@ -299,7 +319,10 @@ struct _belle_sip_header_record_route {
};
static
void
belle_sip_header_record_route_destroy
(
belle_sip_header_record_route_t
*
record_route
)
{
belle_sip_header_address_destroy
(
BELLE_SIP_HEADER_ADDRESS
(
record_route
));
}
static
void
belle_sip_header_record_route_clone
(
belle_sip_header_record_route_t
*
record_route
,
const
belle_sip_header_record_route_t
*
orig
)
{
}
BELLE_SIP_NEW_WITH_NAME
(
header_record_route
,
header_address
,
"Record-Route"
)
...
...
@@ -314,9 +337,13 @@ struct _belle_sip_header_content_length {
};
static
void
belle_sip_header_content_length_destroy
(
belle_sip_header_content_length_t
*
content_length
)
{
belle_sip_object_destroy
(
BELLE_SIP_OBJECT
(
content_length
));
}
static
void
belle_sip_header_content_length_clone
(
belle_sip_header_content_length_t
*
content_length
,
const
belle_sip_header_content_length_t
*
orig
)
{
}
BELLE_SIP_NEW_WITH_NAME
(
header_content_length
,
object
,
"Content-Length"
)
BELLE_SIP_NEW_WITH_NAME
(
header_content_length
,
header
,
"Content-Length"
)
BELLE_SIP_PARSE
(
header_content_length
)
GET_SET_INT
(
belle_sip_header_content_length
,
content_length
,
unsigned
int
)
src/belle_sip_internal.h
View file @
dc829e4d
...
...
@@ -30,29 +30,70 @@
#include "belle-sip/belle-sip.h"
typedef
void
(
*
belle_sip_object_destroy_t
)(
belle_sip_object_t
*
);
typedef
void
(
*
belle_sip_object_clone_t
)(
belle_sip_object_t
*
obj
,
const
belle_sip_object_t
*
orig
);
struct
_belle_sip_object
{
uint8_t
type_ids
[
8
];
/*table of belle_sip_type_id_t for all inheritance chain*/
int
ref
;
void
*
vptr
;
struct
_belle_sip_object
_vptr
{
belle_sip_type_id_t
id
;
struct
_belle_sip_object_vptr
*
parent
;
void
*
interfaces
;
/*unused for the moment*/
belle_sip_object_destroy_t
destroy
;
const
char
*
nam
e
;
belle_sip_object_clone_t
clon
e
;
};
belle_sip_object_t
*
_belle_sip_object_new
(
size_t
objsize
,
belle_sip_type_id_t
id
,
void
*
vptr
,
belle_sip_object_destroy_t
destroy_func
,
int
initially_unowed
);
void
_belle_sip_object_init_type
(
belle_sip_object_t
*
obj
,
belle_sip_type_id_t
id
);
void
belle_sip_object_init
(
belle_sip_object_t
*
obj
);
typedef
struct
_belle_sip_object_vptr
belle_sip_object_vptr_t
;
extern
belle_sip_object_vptr_t
belle_sip_object_t_vptr
;
#define BELLE_SIP_OBJECT_VPTR_NAME(object_type) object_type##_vptr
#define BELLE_SIP_DECLARE_VPTR(object_type) \
extern belle_sip_object_vptr_t BELLE_SIP_OBJECT_VPTR_NAME(object_type);
#define BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_BEGIN(vptr_type,object_type, parent_type, destroy, clone) \
vptr_type object_type##_vptr={ {\
BELLE_SIP_TYPE_ID(object_type), \
(belle_sip_object_vptr_t*)&BELLE_SIP_OBJECT_VPTR_NAME(parent_type), \
NULL, \
(belle_sip_object_destroy_t)destroy, \
(belle_sip_object_clone_t)clone },
#define BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_END };
#define BELLE_SIP_INSTANCIATE_VPTR(object_type,parent_type,destroy,clone) \
belle_sip_object_vptr_t object_type##_vptr={ \
BELLE_SIP_TYPE_ID(object_type), \
(belle_sip_object_vptr_t*)&BELLE_SIP_OBJECT_VPTR_NAME(parent_type), \
NULL, \
(belle_sip_object_destroy_t)destroy, \
(belle_sip_object_clone_t)clone \
}
#define belle_sip_object_new(_type,destroy) (_type*)_belle_sip_object_new(sizeof(_type),BELLE_SIP_TYPE_ID(_type),NULL,(belle_sip_object_destroy_t)destroy,0)
#define belle_sip_object_new_unowed(_type,destroy) (_type*)_belle_sip_object_new(sizeof(_type),BELLE_SIP_TYPE_ID(_type),NULL,(belle_sip_object_destroy_t)destroy,1)
#define belle_sip_object_init_type(obj, _type) _belle_sip_object_init_type((belle_sip_object_t*)obj, BELLE_SIP_TYPE_ID(_type))
#define belle_sip_object_new_with_vptr(_type,vptr,destroy) (_type*)_belle_sip_object_new(sizeof(_type),BELLE_SIP_TYPE_ID(_type),vptr,(belle_sip_object_destroy_t)destroy,0)
#define belle_sip_object_new_unowed_with_vptr(_type,vptr,destroy) (_type*)_belle_sip_object_new(sizeof(_type),BELLE_SIP_TYPE_ID(_type),vptr,(belle_sip_object_destroy_t)destroy,1)
struct
_belle_sip_object
{
belle_sip_object_vptr_t
*
vptr
;
size_t
size
;
int
ref
;
char
*
name
;
};
belle_sip_object_t
*
_belle_sip_object_new
(
size_t
objsize
,
belle_sip_object_vptr_t
*
vptr
,
int
initially_unowed
);
#define belle_sip_object_new(_type) (_type*)_belle_sip_object_new(sizeof(_type),(belle_sip_object_vptr_t*)&BELLE_SIP_OBJECT_VPTR_NAME(_type),0)
#define belle_sip_object_new_unowed(_type,destroy)(_type*)_belle_sip_object_new(sizeof(_type),(belle_sip_object_vptr_t*)&BELLE_SIP_OBJECT_VPTR_NAME(_type),1)
#define BELLE_SIP_OBJECT_VPTR(obj,vptr_type) ((vptr_type*)(((belle_sip_object_t*)obj)->vptr))
#define belle_sip_object_init(obj)
/*nothing*/
/*list of all vptrs (classes) used in belle-sip*/
BELLE_SIP_DECLARE_VPTR
(
belle_sip_object_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_uri_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_header_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_parameters_t
);
BELLE_SIP_DECLARE_VPTR
(
belle_sip_header_contact_t
);
struct
_belle_sip_list
{
struct
_belle_sip_list
*
next
;
...
...
@@ -322,8 +363,9 @@ belle_sip_##object_type##_t* belle_sip_##object_type##_parse (const char* value)
#define BELLE_SIP_NEW(object_type,super_type) BELLE_SIP_NEW_WITH_NAME(object_type,super_type,NULL)
#define BELLE_SIP_NEW_WITH_NAME(object_type,super_type,name) \
BELLE_SIP_INSTANCIATE_VPTR(belle_sip_##object_type##_t,belle_sip_##super_type##_t , belle_sip_##object_type##_destroy, belle_sip_##object_type##_clone); \
belle_sip_##object_type##_t* belle_sip_##object_type##_new () { \
belle_sip_##object_type##_t* l_object = belle_sip_object_new(belle_sip_##object_type##_t
, (belle_sip_object_destroy_t)belle_sip_##object_type##_destroy
);\
belle_sip_##object_type##_t* l_object = belle_sip_object_new(belle_sip_##object_type##_t);\
belle_sip_##super_type##_init((belle_sip_##super_type##_t*)l_object); \
belle_sip_object_set_name(BELLE_SIP_OBJECT(l_object),name);\
return l_object;\
...
...
@@ -353,7 +395,7 @@ struct _belle_sip_header {
belle_sip_object_t
base
;
const
char
*
name
;
};
void
belle_sip_header_destroy
(
belle_sip_header_t
*
header
);
void
belle_sip_header_init
(
belle_sip_header_t
*
obj
);
/*class parameters*/
struct
_belle_sip_parameters
{
...
...
@@ -363,7 +405,6 @@ struct _belle_sip_parameters {
};
void
belle_sip_parameters_init
(
belle_sip_parameters_t
*
obj
);
void
belle_sip_parameters_destroy
(
belle_sip_parameters_t
*
params
);
/*
* Listening points and channels
...
...
src/belle_sip_loop.c
View file @
dc829e4d
...
...
@@ -42,8 +42,10 @@ void belle_sip_fd_source_init(belle_sip_source_t *s, belle_sip_source_func_t fun
s
->
notify
=
func
;
}
BELLE_SIP_INSTANCIATE_VPTR
(
belle_sip_source_t
,
belle_sip_object_t
,
belle_sip_source_destroy
,
NULL
);
belle_sip_source_t
*
belle_sip_fd_source_new
(
belle_sip_source_func_t
func
,
void
*
data
,
int
fd
,
unsigned
int
events
,
unsigned
int
timeout_value_ms
){
belle_sip_source_t
*
s
=
belle_sip_object_new
(
belle_sip_source_t
,
belle_sip_source_destroy
);
belle_sip_source_t
*
s
=
belle_sip_object_new
(
belle_sip_source_t
);
belle_sip_fd_source_init
(
s
,
func
,
data
,
fd
,
events
,
timeout_value_ms
);
return
s
;
}
...
...
@@ -87,8 +89,10 @@ static int main_loop_done(void *data, unsigned int events){
return
TRUE
;
}
BELLE_SIP_INSTANCIATE_VPTR
(
belle_sip_main_loop_t
,
belle_sip_object_t
,
belle_sip_main_loop_destroy
,
NULL
);
belle_sip_main_loop_t
*
belle_sip_main_loop_new
(
void
){
belle_sip_main_loop_t
*
m
=
belle_sip_object_new
(
belle_sip_main_loop_t
,
belle_sip_main_loop_destroy
);
belle_sip_main_loop_t
*
m
=
belle_sip_object_new
(
belle_sip_main_loop_t
);
if
(
pipe
(
m
->
control_fds
)
==-
1
){
belle_sip_fatal
(
"Could not create control pipe."
);
}
...
...
src/belle_sip_object.c
View file @
dc829e4d
...
...
@@ -18,29 +18,21 @@
#include "belle_sip_internal.h"
static
uint8_t
*
find_type
(
belle_sip_object_t
*
obj
,
belle_sip_type_id_t
id
){
int
i
;
for
(
i
=
0
;
i
<
sizeof
(
obj
->
type_ids
);
++
i
){
if
(
obj
->
type_ids
[
i
]
==
(
uint8_t
)
id
)
return
&
obj
->
type_ids
[
i
];
static
int
has_type
(
belle_sip_object_t
*
obj
,
belle_sip_type_id_t
id
){
belle_sip_object_vptr_t
*
vptr
=
obj
->
vptr
;
while
(
vptr
!=
NULL
){
if
(
vptr
->
id
==
id
)
return
TRUE
;
vptr
=
vptr
->
parent
;
}
return
NULL
;
return
FALSE
;
}
void
_belle_sip_object_init_type
(
belle_sip_object_t
*
obj
,
belle_sip_type_id_t
id
){
uint8_t
*
t
=
find_type
(
obj
,
id
);
if
(
t
!=
NULL
)
belle_sip_fatal
(
"This object already inherits type %i"
,
id
);
t
=
find_type
(
obj
,
0
);
if
(
t
==
NULL
)
belle_sip_fatal
(
"This object has too much inheritance !"
);
*
t
=
id
;
}
belle_sip_object_t
*
_belle_sip_object_new
(
size_t
objsize
,
belle_sip_type_id_t
id
,
void
*
vptr
,
belle_sip_object_destroy_t
destroy_func
,
int
initially_unowed
){
belle_sip_object_t
*
_belle_sip_object_new
(
size_t
objsize
,
belle_sip_object_vptr_t
*
vptr
,
int
initially_unowed
){
belle_sip_object_t
*
obj
=
(
belle_sip_object_t
*
)
belle_sip_malloc0
(
objsize
);
obj
->
type_ids
[
0
]
=
id
;
obj
->
ref
=
initially_unowed
?
0
:
1
;
obj
->
vptr
=
vptr
;
obj
->
destroy
=
destroy_func
;
obj
->
size
=
objsize
;
return
obj
;
}
...
...
@@ -57,39 +49,82 @@ void belle_sip_object_unref(void *ptr){
belle_sip_object_t
*
obj
=
BELLE_SIP_OBJECT
(
ptr
);
if
(
obj
->
ref
==
0
){
belle_sip_warning
(
"Destroying unowed object"
);
belle_sip_object_de
stroy
(
obj
);
belle_sip_object_de
lete
(
obj
);
return
;
}
obj
->
ref
--
;
if
(
obj
->
ref
==
0
){
belle_sip_object_de
stroy
(
obj
);
belle_sip_object_de
lete
(
obj
);
}
}
void
belle_sip_object_destroy
(
void
*
ptr
){
static
void
_belle_sip_object_uninit
(
belle_sip_object_t
*
obj
){
if
(
obj
->
name
)
belle_sip_free
(
obj
->
name
);
}
static
void
_belle_sip_object_clone
(
belle_sip_object_t
*
obj
,
const
belle_sip_object_t
*
orig
){
if
(
orig
->
name
!=
NULL
)
obj
->
name
=
belle_sip_strdup
(
obj
->
name
);
}
belle_sip_object_vptr_t
belle_sip_object_t_vptr
=
{
BELLE_SIP_TYPE_ID
(
belle_sip_object_t
),
NULL
,
/*no parent, it's god*/
NULL
,
_belle_sip_object_uninit
,
_belle_sip_object_clone
};
void
belle_sip_object_delete
(
void
*
ptr
){
belle_sip_object_t
*
obj
=
BELLE_SIP_OBJECT
(
ptr
);
belle_sip_object_vptr_t
*
vptr
;
if
(
obj
->
ref
!=
0
){
belle_sip_error
(
"Destroying referenced object !"
);
if
(
obj
->
destroy
)
obj
->
destroy
(
obj
);
vptr
=
obj
->
vptr
;
while
(
vptr
!=
NULL
){
if
(
vptr
->
destroy
)
vptr
->
destroy
(
obj
);
vptr
=
vptr
->
parent
;
}
belle_sip_free
(
obj
);
}
}
belle_sip_object_t
*
belle_sip_object_clone
(
const
belle_sip_object_t
*
obj
){
belle_sip_object_t
*
newobj
;
belle_sip_object_vptr_t
*
vptr
;
newobj
=
belle_sip_malloc0
(
obj
->
size
);
newobj
->
ref
=
1
;
newobj
->
vptr
=
obj
->
vptr
;
vptr
=
obj
->
vptr
;
while
(
vptr
!=
NULL
){
if
(
vptr
->
clone
==
NULL
){
belle_sip_fatal
(
"Object of type %i cannot be cloned, it does not provide a clone() implementation."
,
vptr
->
id
);
return
NULL
;
}
else
vptr
->
clone
(
newobj
,
obj
);
}
return
newobj
;
}
void
*
belle_sip_object_cast
(
belle_sip_object_t
*
obj
,
belle_sip_type_id_t
id
,
const
char
*
castname
,
const
char
*
file
,
int
fileno
){
if
(
find
_type
(
obj
,
id
)
==
NULL
){
if
(
has
_type
(
obj
,
id
)
==
0
){
belle_sip_fatal
(
"Bad cast to %s at %s:%i"
,
castname
,
file
,
fileno
);
return
NULL
;
}
return
obj
;
}
void
belle_sip_object_init
(
belle_sip_object_t
*
obj
)
{
belle_sip_object_init_type
(
obj
,
belle_sip_object_t
);
}
void
belle_sip_object_set_name
(
belle_sip_object_t
*
object
,
const
char
*
name
)
{
if
(
name
==
NULL
)
return
;
if
(
object
->
name
)
belle_sip_free
((
void
*
)
object
->
name
);
object
->
name
=
belle_sip_strdup
(
name
);
if
(
object
->
name
)
{
belle_sip_free
(
object
->
name
);
object
->
name
=
NULL
;
}
if
(
name
)
object
->
name
=
belle_sip_strdup
(
name
);
}
const
char
*
belle_sip_object_get_name
(
belle_sip_object_t
*
object
)
{
return
object
->
name
;
}
src/belle_sip_parameters.c
View file @
dc829e4d
...
...
@@ -20,22 +20,20 @@
#include "belle_sip_internal.h"
#include "belle-sip/headers.h"
void
belle_sip_parameters_destroy
(
belle_sip_parameters_t
*
params
)
{
void
belle_sip_parameters_init
(
belle_sip_parameters_t
*
obj
){
}
static
void
belle_sip_parameters_destroy
(
belle_sip_parameters_t
*
params
)
{
if
(
params
->
param_list
)
belle_sip_list_free
(
params
->
param_list
);
if
(
params
->
paramnames_list
)
belle_sip_list_free
(
params
->
paramnames_list
);
belle_sip_header_destroy
(
BELLE_SIP_HEADER
(
params
));
}
void
belle_sip_parameters_init
(
belle_sip_parameters_t
*
obj
)
{
belle_sip_object_init_type
(
obj
,
belle_sip_parameters_t
);
belle_sip_header_init
((
belle_sip_header_t
*
)
obj
);
}
belle_sip_parameters_t
*
belle_sip_parameters_new
()
{
belle_sip_parameters_t
*
l_object
=
(
belle_sip_parameters_t
*
)
belle_sip_object_new
(
belle_sip_parameters_t
,(
belle_sip_object_destroy_t
)
belle_sip_parameters_destroy
);
belle_sip_header_init
((
belle_sip_header_t
*
)
l_object
);
return
l_object
;
static
void
belle_sip_parameters_clone
(
belle_sip_parameters_t
*
params
,
const
belle_sip_parameters_t
*
orig
){
belle_sip_fatal
(
"not implemented"
);
}
BELLE_SIP_NEW
(
parameters
,
header
)
const
char
*
belle_sip_parameters_get_parameter
(
belle_sip_parameters_t
*
params
,
const
char
*
name
)
{
belle_sip_list_t
*
lResult
=
belle_sip_list_find_custom
(
params
->
param_list
,
(
belle_sip_compare_func
)
belle_sip_param_pair_comp_func
,
name
);
if
(
lResult
)
{
...
...
src/belle_sip_uri_impl.c
View file @
dc829e4d
...
...
@@ -56,10 +56,14 @@ void belle_sip_uri_destroy(belle_sip_uri_t* uri) {
belle_sip_object_unref
(
BELLE_SIP_OBJECT
(
uri
->
header_list
));
}
BELLE_SIP_PARSE
(
uri
);
BELLE_SIP_INSTANCIATE_VPTR
(
belle_sip_uri_t
,
belle_sip_object_t
,
belle_sip_uri_destroy
,
NULL
);
belle_sip_uri_t
*
belle_sip_uri_new
()
{
belle_sip_uri_t
*
l_object
=
(
belle_sip_uri_t
*
)
belle_sip_object_new
(
belle_sip_uri_t
,(
belle_sip_object_destroy_t
)
belle_sip_uri_destroy
);
belle_sip_uri_t
*
l_object
=
(
belle_sip_uri_t
*
)
belle_sip_object_new
(
belle_sip_uri_t
);
belle_sip_parameters_init
((
belle_sip_parameters_t
*
)
l_object
);
/*super*/
l_object
->
header_list
=
belle_sip_parameters_new
();
return
l_object
;
...
...
src/listeningpoint.c
View file @
dc829e4d
...
...
@@ -32,13 +32,16 @@
typedef
struct
belle_sip_channel_vptr
{
belle_sip_object_vptr_t
base
;
int
(
*
channel_send
)(
belle_sip_channel_t
*
obj
,
const
void
*
buf
,
size_t
buflen
);
int
(
*
channel_recv
)(
belle_sip_channel_t
*
obj
,
void
*
buf
,
size_t
buflen
);
belle_sip_source_t
*
(
*
create_source
)(
belle_sip_channel_t
*
obj
,
unsigned
int
events
,
unsigned
int
timeout
,
belle_sip_source_func_t
callback
,
void
*
data
);
}
belle_sip_channel_vptr_t
;
BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_BEGIN
(
belle_sip_channel_vptr_t
,
belle_sip_channel_t
,
belle_sip_object_t
,
NULL
,
NULL
)
BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_END
static
void
belle_sip_channel_init
(
belle_sip_channel_t
*
obj
,
belle_sip_listening_point_t
*
lp
){
belle_sip_object_init_type
(
obj
,
belle_sip_channel_t
);
obj
->
lp
=
lp
;
obj
->
peer
.
ai_addr
=
(
struct
sockaddr
*
)
&
obj
->
peer_addr
;
}
...
...
@@ -100,11 +103,11 @@ static belle_sip_source_t *udp_channel_create_source(belle_sip_channel_t *obj, u
return
belle_sip_fd_source_new
(
callback
,
data
,
chan
->
sock
,
events
,
timeout
);
}
static
belle_sip_channel_vptr_t
udp_channel_
vptr
=
{
BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_BEGIN
(
belle_sip_channel_vptr_t
,
belle_sip_
udp_channel_
t
,
belle_sip_channel_t
,
udp_channel_uninit
,
NULL
)
udp_channel_send
,
udp_channel_recv
,
udp_channel_create_source
};
BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_END
static
int
create_udp_socket
(
const
char
*
addr
,
int
port
){
struct
addrinfo
hints
=
{
0
};
...
...
@@ -135,7 +138,7 @@ static int create_udp_socket(const char *addr, int port){
}
belle_sip_udp_channel_t
*
belle_sip_udp_channel_new
(
belle_sip_listening_point_t
*
lp
,
int
sock
,
const
struct
addrinfo
*
dest
){
belle_sip_udp_channel_t
*
obj
=
belle_sip_object_new
_with_vptr
(
belle_sip_udp_channel_t
,
&
udp_channel_vptr
,
udp_channel_uninit
);
belle_sip_udp_channel_t
*
obj
=
belle_sip_object_new
(
belle_sip_udp_channel_t
);
belle_sip_channel_init
((
belle_sip_channel_t
*
)
obj
,
lp
);
obj
->
sock
=
sock
;
memcpy
(
obj
->
base
.
peer
.
ai_addr
,
dest
->
ai_addr
,
dest
->
ai_addrlen
);
...
...
@@ -157,11 +160,11 @@ struct belle_sip_listening_point{
};
typedef
struct
belle_sip_listening_point_vptr
{
belle_sip_object_vptr_t
base
;
belle_sip_channel_t
*
(
*
find_output_channel
)(
belle_sip_listening_point_t
*
lp
,
const
struct
addrinfo
*
dest
);
}
belle_sip_listening_point_vptr_t
;
static
void
belle_sip_listening_point_init
(
belle_sip_listening_point_t
*
lp
,
belle_sip_stack_t
*
s
,
const
char
*
transport
,
const
char
*
address
,
int
port
){
belle_sip_object_init_type
(
lp
,
belle_sip_listening_point_t
);