work in progress in sal. Near to code complete, except for subscribe/notify.

This commit is contained in:
Simon Morlat 2010-01-26 22:31:33 +01:00
parent 74e0bbb7a3
commit 40e4b5d421
4 changed files with 1044 additions and 32 deletions

View file

@ -99,9 +99,9 @@ static void initiate_incoming(const SalStreamDescription *local_cap,
SalStreamDescription *result){
result->payloads=match_payloads(local_cap->payloads,remote_offer->payloads);
if (result->payloads && !only_telephone_event(result->payloads)){
result->port=remote_offer->port;
result->bandwidth=remote_offer->bandwidth;
result->ptime=remote_offer->ptime;
result->port=local_cap->port;
result->bandwidth=local_cap->bandwidth;
result->ptime=local_cap->ptime;
}else{
result->port=0;
}
@ -136,7 +136,7 @@ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities
initiate_incoming(&local_capabilities->streams[i],&remote_offer->streams[i],&result->streams[i]);
}
result->nstreams=local_capabilities->nstreams;
strcpy(result->addr,remote_offer->addr);
strcpy(result->addr,local_capabilities->addr);
return 0;
}

View file

@ -36,6 +36,29 @@ struct SalOp;
typedef struct SalOp SalOp;
struct SalAddress;
typedef struct SalAddress SalAddress;
/* Address manipulation API*/
SalAddress * sal_address_new(const char *uri);
SalAddress * sal_address_clone(const SalAddress *addr);
const char *sal_address_get_scheme(const SalAddress *addr);
const char *sal_address_get_display_name(const SalAddress* addr);
const char *sal_address_get_username(const SalAddress *addr);
const char *sal_address_get_domain(const SalAddress *addr);
void sal_address_set_display_name(SalAddress *addr, const char *display_name);
void sal_address_set_username(SalAddress *addr, const char *username);
void sal_address_set_domain(SalAddress *addr, const char *host);
void sal_address_set_port(SalAddress *addr, const char *port);
void sal_address_set_port_int(SalAddress *uri, int port);
void sal_address_clean(SalAddress *addr);
char *sal_address_as_string(const SalAddress *u);
char *sal_address_as_string_uri_only(const SalAddress *u);
void sal_address_destroy(SalAddress *u);
Sal * sal_init();
void sal_uninit(Sal* sal);
@ -92,26 +115,81 @@ typedef struct SalOpBase{
typedef enum SalError{
SalErrorNetwork,
SalErrorNoResponse,
SalErrorMedia,
SalErrorAuth,
SalErrorForbidden
SalErrorFailure, /* see SalReason for more details */
SalErrorUnknown
} SalError;
typedef enum SalReason{
SalReasonDeclined,
SalReasonBusy,
SalReasonRedirect,
SalReasonTemporarilyUnavailable,
SalReasonNotFound,
SalReasonDoNotDisturb,
SalReasonForbidden,
SalReasonUnknown
}SalReason;
typedef enum SalPresenceStatus{
SalPresenceOffline,
SalPresenceOnline,
SalPresenceBusy,
SalPresenceBerightback,
SalPresenceAway,
SalPresenceOnthephone,
SalPresenceOuttolunch,
SalPresenceDonotdisturb,
SalPresenceMoved,
SalPresenceAltService,
}SalPresenceStatus;
typedef void (*SalOnCallReceived)(SalOp *op);
typedef void (*SalOnCallRinging)(SalOp *op);
typedef void (*SalOnCallAccepted)(SalOp *op);
typedef void (*SalOnCallAck)(SalOp *op);
typedef void (*SalOnCallUpdated)(SalOp *op);
typedef void (*SalOnCallTerminated)(SalOp *op);
typedef void (*SalOnCallFailure)(SalOp *op, SalError error, const char *details);
typedef void (*SalOnCallFailure)(SalOp *op, SalError error, SalReason reason, const char *details);
typedef void (*SalOnAuthRequested)(SalOp *op, const char *realm, const char *username);
typedef void (*SalOnAuthSuccess)(SalOp *op, const char *realm, const char *username);
typedef void (*SalOnRegisterSuccess)(SalOp *op, bool_t registered);
typedef void (*SalOnRegisterFailure)(SalOp *op, SalError error, SalReason reason, const char *details);
typedef void (*SalOnVfuRequest)(SalOp *op);
typedef void (*SalOnDtmfReceived)(SalOp *op, char dtmf);
typedef void (*SalOnRefer)(Sal *sal, SalOp *op, const char *referto);
typedef void (*SalOnTextReceived)(Sal *sal, const char *from, const char *msg);
typedef void (*SalOnPresenceChanged)(Sal *sal, const char *from, SalPresenceStatus status);
typedef void (*SalOnInternalMsg)(Sal *sal, const char *msg);
typedef struct SalCallbacks{
SalOnCallReceived call_received;
SalOnCallRinging call_ringing;
SalOnCallAccepted call_accepted;
SalOnCallAck call_ack;
SalOnCallUpdated call_updated;
SalOnCallTerminated call_terminated;
SalOnCallFailure call_failure;
SalOnAuthRequested auth_requested;
SalOnAuthSuccess auth_success;
SalOnRegisterSuccess register_success;
SalOnRegisterFailure register_failure;
SalOnVfuRequest vfu_request;
SalOnDtmfReceived dtmf_received;
SalOnRefer refer_received;
SalOnTextReceived text_received;
SalOnPresenceChanged presence_changed;
SalOnInternalMsg internal_message;
}SalCallbacks;
typedef struct SalAuthInfo{
char *username;
char *userid;
char *password;
char *realm;
}SalAuthInfo;
void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs);
int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure);
void sal_set_user_agent(Sal *ctx, const char *user_agent);
@ -127,15 +205,21 @@ void sal_op_set_route(SalOp *op, const char *route);
void sal_op_set_from(SalOp *op, const char *from);
void sal_op_set_to(SalOp *op, const char *to);
void sal_op_release(SalOp *h);
void sal_op_authenticate(SalOp *h, const SalAuthInfo *info);
const char *sal_op_get_from(const SalOp *op);
const char *sal_op_get_to(const SalOp *op);
const char *sal_op_get_contact(const SalOp *op);
/*Call API*/
int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc);
int sal_call(SalOp *h, const char *from, const char *to);
int sal_call_accept(SalOp*h);
int sal_call_decline(SalOp *h, SalReason reason, const char *redirection /*optional*/);
const SalMediaDescription * sal_call_get_final_media_description(SalOp *h);
int sal_call_terminate(SalOp *h);
int sal_register(SalOp *op, const char *from, const char *contact, int expires);
int sal_register(SalOp *op, const char *proxy, const char *from, int expires);
#define payload_type_set_number(pt,n) (pt)->user_data=(void*)((long)n);

File diff suppressed because it is too large Load diff

View file

@ -165,15 +165,14 @@ static void add_line(sdp_message_t *msg, int lineno, const SalStreamDescription
}
}
char *media_description_to_sdp(const SalMediaDescription *desc){
sdp_message_t *media_description_to_sdp(const SalMediaDescription *desc){
int i;
char *tmp;
sdp_message_t *msg=create_generic_sdp(desc);
for(i=0;i<desc->nstreams;++i){
add_line(msg,i,&desc->streams[i]);
}
sdp_message_to_str(msg,&tmp);
return tmp;
return msg;
}
static int payload_type_fill_from_rtpmap(PayloadType *pt, const char *rtpmap){
@ -207,17 +206,11 @@ static int payload_type_fill_from_rtpmap(PayloadType *pt, const char *rtpmap){
return 0;
}
int sdp_to_media_description(const char *sdp, SalMediaDescription *desc){
int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){
int i,j;
const char *mtype,*proto,*port,*addr,*number;
sdp_message_t *msg;
sdp_bandwidth_t *sbw=NULL;
sdp_message_init(&msg);
if (sdp_message_parse(msg,sdp)!=0){
ms_error("Fail to parse sdp message !");
sdp_message_free(msg);
return -1;
}
addr=sdp_message_c_addr_get (msg, -1, 0);
if (addr)
strncpy(desc->addr,addr,sizeof(desc->addr));