Commit 59e93394 authored by Simon Morlat's avatar Simon Morlat

try to send the first message, in progress

parent 587cac86
......@@ -118,6 +118,7 @@ belle_sip_header_contact_t* belle_sip_header_contact_parse (const char* contact)
belle_sip_header_from_t* belle_sip_header_from_new();
belle_sip_header_from_t* belle_sip_header_from_create(const char *address, const char *tag);
belle_sip_header_from_t* belle_sip_header_from_parse (const char* from) ;
......@@ -135,9 +136,9 @@ 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_create(const char *address, const char *tag);
void belle_sip_header_to_set_tag(belle_sip_header_to_t* from, const char* tag);
......@@ -152,7 +153,7 @@ belle_sip_header_contact_t* belle_sip_header_contact_parse (const char* contact)
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_create(const char *host, int port, const char *transport, const char *branch);
belle_sip_header_via_t* belle_sip_header_via_parse (const char* 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);
......@@ -196,7 +197,7 @@ void belle_sip_header_call_id_set_call_id(belle_sip_header_call_id_t* via,const
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_create(unsigned int number, const char *method);
belle_sip_header_cseq_t* belle_sip_header_cseq_parse (const char* 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);
......
......@@ -42,13 +42,19 @@ 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);
belle_sip_request_t* belle_sip_request_create(belle_sip_uri_t *requri, const char* method,
belle_sip_header_call_id_t *callid,
belle_sip_header_cseq_t *cseq,
belle_sip_header_from_t *from,
belle_sip_header_to_t *to,
belle_sip_header_via_t *via,
int max_forwards);
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);
void belle_sip_request_set_uri(belle_sip_request_t* request, belle_sip_uri_t* uri);
const char* belle_sip_request_get_method(const belle_sip_request_t* request);
void belle_sip_request_set_method(belle_sip_request_t* request,const char* method);
......
......@@ -35,6 +35,8 @@ void belle_sip_provider_add_sip_listener(belle_sip_provider_t *p, belle_sip_list
void belle_sip_provider_remove_sip_listener(belle_sip_provider_t *p, belle_sip_listener_t *l, void *user_ctx);
belle_sip_header_call_id_t * belle_sip_provider_create_call_id(belle_sip_provider_t *prov);
belle_sip_client_transaction_t *belle_sip_provider_create_client_transaction(belle_sip_provider_t *p, belle_sip_request_t *req);
belle_sip_server_transaction_t *belle_sip_provider_create_server_transaction(belle_sip_provider_t *p, belle_sip_request_t *req);
......
......@@ -47,6 +47,8 @@ void belle_sip_stack_delete_listening_point(belle_sip_stack_t *s, belle_sip_list
belle_sip_provider_t *belle_sip_stack_create_provider(belle_sip_stack_t *s, belle_sip_listening_point_t *lp);
belle_sip_main_loop_t* belle_sip_stack_get_main_loop(belle_sip_stack_t *stack);
void belle_sip_stack_main(belle_sip_stack_t *stack);
void belle_sip_stack_sleep(belle_sip_stack_t *stack, unsigned int milliseconds);
......
......@@ -25,14 +25,7 @@ typedef struct _belle_sip_uri belle_sip_uri_t;
*
*/
belle_sip_uri_t* belle_sip_uri_parse (const char* uri) ;
/**
*
*/
belle_sip_uri_t* belle_sip_uri_ref (belle_sip_uri_t* address) ;
/**
*
*/
void belle_sip_uri_unref (belle_sip_uri_t* address) ;
/**
* Returns the value of the named header, or null if it is not set.
*
......
......@@ -52,7 +52,7 @@ belle_sip_header_t* belle_sip_header_get_next(const belle_sip_header_t* header)
int belle_sip_header_marshal(belle_sip_header_t* header, char* buff,unsigned int offset,unsigned int buff_size) {
if (header->name) {
return snprintf(buff+offset,buff_size-offset,"%s:",header->name);
return snprintf(buff+offset,buff_size-offset,"%s: ",header->name);
} else {
belle_sip_warning("no header name found");
return 0;
......@@ -79,8 +79,11 @@ static void belle_sip_header_address_destroy(belle_sip_header_address_t* contact
if (contact->uri) belle_sip_object_unref(BELLE_SIP_OBJECT(contact->uri));
}
static void belle_sip_header_address_clone(belle_sip_header_address_t *addr){
static void belle_sip_header_address_clone(belle_sip_header_address_t *addr, const belle_sip_header_address_t *orig){
addr->displayname=belle_sip_strdup(orig->displayname);
addr->uri=(belle_sip_uri_t*)belle_sip_object_clone(BELLE_SIP_OBJECT(orig->uri));
}
int belle_sip_header_address_marshal(belle_sip_header_address_t* header, char* buff,unsigned int offset,unsigned int buff_size) {
/*1 display name*/
unsigned int current_offset=offset;
......@@ -112,7 +115,7 @@ belle_sip_uri_t* belle_sip_header_address_get_uri(belle_sip_header_address_t* ad
}
void belle_sip_header_address_set_uri(belle_sip_header_address_t* address, belle_sip_uri_t* uri) {
address->uri=uri;
address->uri=(belle_sip_uri_t*)belle_sip_object_ref(uri);
}
......@@ -176,6 +179,7 @@ float belle_sip_header_contact_get_qvalue(const belle_sip_header_contact_t* cont
current_offset+=belle_sip_##header_marshal(BELLE_SIP_HEADER(header), buff,current_offset, buff_size);\
current_offset+=belle_sip_header_address_marshal(&header->address, buff,current_offset, buff_size); \
return current_offset-offset;
struct _belle_sip_header_from {
belle_sip_header_address_t address;
};
......@@ -189,6 +193,14 @@ int belle_sip_header_from_marshal(belle_sip_header_from_t* from, char* buff,unsi
BELLE_SIP_FROM_LIKE_MARSHAL(from);
}
belle_sip_header_from_t* belle_sip_header_from_create(const char *address, const char *tag){
char *tmp=belle_sip_strdup_printf("From: %s",address);
belle_sip_header_from_t *from=belle_sip_header_from_parse(tmp);
if (tag) belle_sip_header_from_set_tag(from,tag);
belle_sip_free(tmp);
return from;
}
BELLE_SIP_NEW_HEADER(header_from,header_address,"From")
BELLE_SIP_PARSE(header_from)
GET_SET_STRING_PARAM(belle_sip_header_from,tag);
......@@ -214,6 +226,14 @@ BELLE_SIP_NEW_HEADER(header_to,header_address,"To")
BELLE_SIP_PARSE(header_to)
GET_SET_STRING_PARAM(belle_sip_header_to,tag);
belle_sip_header_to_t* belle_sip_header_to_create(const char *address, const char *tag){
char *tmp=belle_sip_strdup_printf("To: %s",address);
belle_sip_header_to_t *to=belle_sip_header_to_parse(tmp);
if (tag) belle_sip_header_to_set_tag(to,tag);
belle_sip_free(tmp);
return to;
}
/**************************
* Via header object inherits from parameters
****************************
......@@ -233,6 +253,7 @@ static void belle_sip_header_via_destroy(belle_sip_header_via_t* via) {
static void belle_sip_header_via_clone(belle_sip_header_via_t* via, const belle_sip_header_via_t*orig){
}
int belle_sip_header_via_marshal(belle_sip_header_via_t* via, char* buff,unsigned int offset,unsigned int buff_size) {
unsigned int current_offset=offset;
current_offset+=belle_sip_header_marshal(BELLE_SIP_HEADER(via), buff,current_offset, buff_size);
......@@ -245,6 +266,16 @@ int belle_sip_header_via_marshal(belle_sip_header_via_t* via, char* buff,unsigne
return current_offset-offset;
}
belle_sip_header_via_t* belle_sip_header_via_create(const char *host, int port, const char *transport, const char *branch){
belle_sip_header_via_t *via=belle_sip_header_via_new();
via->host=belle_sip_strdup(host);
via->port=port;
via->transport=belle_sip_strdup(transport);
via->protocol=belle_sip_strdup("SIP/2.0");
belle_sip_header_via_set_branch(via,branch);
return via;
}
BELLE_SIP_NEW_HEADER(header_via,header_address,"Via")
BELLE_SIP_PARSE(header_via)
GET_SET_STRING(belle_sip_header_via,protocol);
......@@ -325,16 +356,17 @@ GET_SET_STRING(belle_sip_header_call_id,call_id);
*/
struct _belle_sip_header_cseq {
belle_sip_header_t header;
const char* method;
char* method;
unsigned int seq_number;
};
static void belle_sip_header_cseq_destroy(belle_sip_header_cseq_t* cseq) {
if (cseq->method) belle_sip_free((void*)cseq->method);
if (cseq->method) belle_sip_free(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);
if (cseq->method) belle_sip_free(cseq->method);
cseq->method=belle_sip_strdup(orig->method);
}
int belle_sip_header_cseq_marshal(belle_sip_header_cseq_t* cseq, char* buff,unsigned int offset,unsigned int buff_size) {
unsigned int current_offset=offset;
......@@ -342,6 +374,12 @@ int belle_sip_header_cseq_marshal(belle_sip_header_cseq_t* cseq, char* buff,unsi
current_offset+=snprintf(buff+current_offset,buff_size-current_offset,"%i %s",cseq->seq_number,cseq->method);
return current_offset-offset;
}
belle_sip_header_cseq_t * belle_sip_header_cseq_create(unsigned int number, const char *method){
belle_sip_header_cseq_t *cseq=belle_sip_header_cseq_new();
cseq->method=belle_sip_strdup(method);
cseq->seq_number=number;
return cseq;
}
BELLE_SIP_NEW_HEADER(header_cseq,header,"CSeq")
BELLE_SIP_PARSE(header_cseq)
GET_SET_STRING(belle_sip_header_cseq,method);
......
......@@ -26,6 +26,12 @@
#include <errno.h>
#include <unistd.h>
#ifndef WIN32
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#endif
/* include all public headers*/
#include "belle-sip/belle-sip.h"
......@@ -86,7 +92,7 @@ belle_sip_object_t * _belle_sip_object_new(size_t objsize, belle_sip_object_vptr
int belle_sip_object_marshal(belle_sip_object_t* obj, char* buff,unsigned int offset,size_t buff_size);
#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_new_unowed(_type)(_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*/
......@@ -260,6 +266,11 @@ char * belle_sip_concat (const char *str, ...);
uint64_t belle_sip_time_ms(void);
unsigned int belle_sip_random(void);
char *belle_sip_strdup_printf(const char *fmt,...);
/*parameters accessors*/
#define GET_SET_STRING(object_type,attribute) \
const char* object_type##_get_##attribute (const object_type##_t* obj) {\
......@@ -370,7 +381,7 @@ belle_sip_##object_type##_t* belle_sip_##object_type##_parse (const char* value)
, belle_sip_##object_type##_clone\
, belle_sip_##object_type##_marshal); \
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_type##_t* l_object = belle_sip_object_new_unowed(belle_sip_##object_type##_t);\
belle_sip_##super_type##_init((belle_sip_##super_type##_t*)l_object); \
belle_sip_##init_type##_init((belle_sip_##init_type##_t*) l_object); \
if (name) belle_sip_header_set_name(BELLE_SIP_HEADER(l_object),name);\
......
......@@ -112,9 +112,11 @@ belle_sip_object_t *belle_sip_object_clone(const belle_sip_object_t *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){
if (has_type(obj,id)==0){
belle_sip_fatal("Bad cast to %s at %s:%i",castname,file,fileno);
return NULL;
if (obj!=NULL){
if (has_type(obj,id)==0){
belle_sip_fatal("Bad cast to %s at %s:%i",castname,file,fileno);
return NULL;
}
}
return obj;
}
......
......@@ -56,6 +56,14 @@ void belle_sip_uri_destroy(belle_sip_uri_t* uri) {
belle_sip_object_unref(BELLE_SIP_OBJECT(uri->header_list));
}
void belle_sip_uri_clone(belle_sip_uri_t* uri, const belle_sip_uri_t *orig){
uri->secure=orig->secure;
uri->user=belle_sip_strdup(orig->user);
uri->host=belle_sip_strdup(orig->host);
uri->port=orig->port;
uri->header_list=(belle_sip_parameters_t*)belle_sip_object_clone(BELLE_SIP_OBJECT(orig->header_list));
}
int belle_sip_uri_marshal(belle_sip_uri_t* uri, char* buff,unsigned int offset,unsigned int buff_size) {
unsigned int current_offset=offset;
const belle_sip_list_t* list=belle_sip_parameters_get_parameters(uri->header_list);
......@@ -88,7 +96,7 @@ int belle_sip_uri_marshal(belle_sip_uri_t* uri, char* buff,unsigned int offset,u
}
BELLE_SIP_PARSE(uri);
BELLE_SIP_INSTANCIATE_VPTR(belle_sip_uri_t,belle_sip_parameters_t,belle_sip_uri_destroy,NULL,belle_sip_uri_marshal);
BELLE_SIP_INSTANCIATE_VPTR(belle_sip_uri_t,belle_sip_parameters_t,belle_sip_uri_destroy,belle_sip_uri_clone,belle_sip_uri_marshal);
belle_sip_uri_t* belle_sip_uri_new () {
......
......@@ -344,6 +344,27 @@ BELLE_SIP_PARSE(response)
GET_SET_STRING(belle_sip_response,reason_phrase);
GET_SET_INT(belle_sip_response,status_code,int)
belle_sip_request_t* belle_sip_request_create(belle_sip_uri_t *requri, const char* method,
belle_sip_header_call_id_t *callid,
belle_sip_header_cseq_t * cseq,
belle_sip_header_from_t *from,
belle_sip_header_to_t *to,
belle_sip_header_via_t *via,
int max_forward /*FIXME*/)
{
belle_sip_request_t *ret=belle_sip_request_new();
belle_sip_request_set_uri(ret,requri);
belle_sip_request_set_method(ret,method);
belle_sip_message_add_header((belle_sip_message_t*)ret,BELLE_SIP_HEADER(via));
belle_sip_message_add_header((belle_sip_message_t*)ret,BELLE_SIP_HEADER(from));
belle_sip_message_add_header((belle_sip_message_t*)ret,BELLE_SIP_HEADER(to));
belle_sip_message_add_header((belle_sip_message_t*)ret,BELLE_SIP_HEADER(cseq));
belle_sip_message_add_header((belle_sip_message_t*)ret,BELLE_SIP_HEADER(callid));
return ret;
}
static void belle_sip_response_init_default(belle_sip_response_t *resp, int status_code, const char *phrase){
resp->status_code=status_code;
resp->sip_version=belle_sip_strdup("SIP/2.0");
......
......@@ -37,6 +37,7 @@ BELLE_SIP_INSTANCIATE_VPTR(belle_sip_provider_t,belle_sip_object_t,belle_sip_pro
belle_sip_provider_t *belle_sip_provider_new(belle_sip_stack_t *s, belle_sip_listening_point_t *lp){
belle_sip_provider_t *p=belle_sip_object_new(belle_sip_provider_t);
p->stack=s;
belle_sip_provider_add_listening_point(p,lp);
return p;
}
......@@ -72,6 +73,14 @@ void belle_sip_provider_remove_sip_listener(belle_sip_provider_t *p, belle_sip_l
p->listeners=belle_sip_list_remove_custom(p->listeners,listener_ctx_compare,&ctx);
}
belle_sip_header_call_id_t * belle_sip_provider_create_call_id(belle_sip_provider_t *prov){
belle_sip_header_call_id_t *cid=belle_sip_header_call_id_new();
char tmp[32];
snprintf(tmp,sizeof(tmp),"%u",belle_sip_random());
belle_sip_header_call_id_set_call_id(cid,tmp);
return cid;
}
belle_sip_client_transaction_t *belle_sip_provider_create_client_transaction(belle_sip_provider_t *p, belle_sip_request_t *req){
return belle_sip_client_transaction_new(p,req);
}
......
......@@ -67,6 +67,10 @@ void belle_sip_stack_delete_provider(belle_sip_stack_t *s, belle_sip_provider_t
belle_sip_object_unref(p);
}
belle_sip_main_loop_t * belle_sip_stack_get_main_loop(belle_sip_stack_t *stack){
return stack->ml;
}
void belle_sip_stack_main(belle_sip_stack_t *stack){
belle_sip_main_loop_run(stack->ml);
}
......@@ -88,3 +92,18 @@ void belle_sip_stack_get_next_hop(belle_sip_stack_t *stack, belle_sip_request_t
hop->host=belle_sip_uri_get_host(uri);
hop->port=belle_sip_uri_get_listening_port(uri);
}
unsigned int belle_sip_random(void){
#ifdef __linux
static int fd=-1;
if (fd==-1) fd=open("/dev/urandom",O_RDONLY);
if (fd!=-1){
unsigned int tmp;
if (read(fd,&tmp,4)!=4){
belle_sip_error("Reading /dev/urandom failed.");
}else return tmp;
}else belle_sip_error("Could not open /dev/urandom");
#endif
return (unsigned int) random();
}
if BUILD_TESTS
noinst_PROGRAMS=belle_sip_tester cast_test
noinst_PROGRAMS=belle_sip_tester cast_test basic_test
belle_sip_tester_SOURCES= belle_sip_tester.c \
belle_sip_uri_tester.c \
......@@ -9,6 +9,8 @@ belle_sip_tester_SOURCES= belle_sip_tester.c \
cast_test_SOURCES=cast_test.c
basic_test_SOURCES=basic_test.c
INCLUDES=-I$(top_srcdir)/include -I$(top_srcdir)/src
LDADD=$(top_builddir)/src/libbellesip.la -lcunit
......
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