static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
SalOp *op;
int code=0;
+ char* computedReason=NULL;
const char *reason=NULL;
SalError error=SalErrorUnknown;
SalReason sr=SalReasonUnknown;
+
op=(SalOp*)find_op(sal,ev);
if (op==NULL) {
if (ev->response){
code=osip_message_get_status_code(ev->response);
reason=osip_message_get_reason_phrase(ev->response);
+ osip_header_t *h=NULL;
+ if (!osip_message_header_get_byname( ev->response
+ ,"Reason"
+ ,0
+ ,&h)) {
+ computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h));
+ reason = computedReason;
+
+ }
}
switch(code)
{
}else error=SalErrorNoResponse;
}
sal->callbacks.call_failure(op,error,sr,reason,code);
+ if (computedReason != NULL){
+ ms_free(computedReason);
+ }
return TRUE;
}
return 0;
}
-static void sal_address_quote_displayname(SalAddress *addr){
- osip_from_t *u=(osip_from_t*)addr;
- if (u->displayname!=NULL && u->displayname[0]!='\0'
- && u->displayname[0]!='"'){
- int len=strlen(u->displayname)+1+2;
- char *quoted=osip_malloc(len);
- snprintf(quoted,len,"\"%s\"",u->displayname);
- osip_free(u->displayname);
- u->displayname=quoted;
- }
-}
-
SalAddress * sal_address_new(const char *uri){
osip_from_t *from;
osip_from_init(&from);
osip_from_free(from);
return NULL;
}
- sal_address_quote_displayname ((SalAddress*)from);
+ if (from->displayname!=NULL && from->displayname[0]=='"'){
+ char *unquoted=osip_strdup_without_quote(from->displayname);
+ osip_free(from->displayname);
+ from->displayname=unquoted;
+ }
return (SalAddress*)from;
}
return null_if_empty(u->displayname);
}
-char *sal_address_get_display_name_unquoted(const SalAddress *addr){
- const osip_from_t *u=(const osip_from_t*)addr;
- const char *dn=null_if_empty(u->displayname);
- char *ret=NULL;
- if (dn!=NULL) {
- char *tmp=osip_strdup_without_quote(dn);
- ret=ms_strdup(tmp);
- osip_free(tmp);
- }
- return ret;
-}
-
const char *sal_address_get_username(const SalAddress *addr){
const osip_from_t *u=(const osip_from_t*)addr;
return null_if_empty(u->url->username);
}
if (display_name!=NULL && display_name[0]!='\0'){
u->displayname=osip_strdup(display_name);
- sal_address_quote_displayname(addr);
}
}
char *sal_address_as_string(const SalAddress *u){
char *tmp,*ret;
- osip_from_to_str((osip_from_t*)u,&tmp);
+ osip_from_t *from=(osip_from_t *)u;
+ char *old_displayname=NULL;
+ /* hack to force use of quotes around the displayname*/
+ if (from->displayname!=NULL
+ && from->displayname[0]!='"'){
+ old_displayname=from->displayname;
+ from->displayname=osip_enquote(from->displayname);
+ }
+ osip_from_to_str(from,&tmp);
+ if (old_displayname!=NULL){
+ ms_free(from->displayname);
+ from->displayname=old_displayname;
+ }
ret=ms_strdup(tmp);
osip_free(tmp);
return ret;
void sal_address_destroy(SalAddress *u){
osip_from_free((osip_from_t*)u);
}
+
void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
}