abstract address and uris directly in liblinphone api.

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@769 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
This commit is contained in:
smorlat 2009-11-26 11:11:24 +00:00
parent d82234aaae
commit 71db928001
17 changed files with 394 additions and 333 deletions

View file

@ -1249,12 +1249,13 @@ linphonec_proxy_use(LinphoneCore *lc, int index)
static void
linphonec_friend_display(LinphoneFriend *fr)
{
char *name = linphone_friend_get_name(fr);
char *addr = linphone_friend_get_addr(fr);
//char *url = linphone_friend_get_url(fr);
linphonec_out("name: %s\n", name);
linphonec_out("address: %s\n", addr);
LinphoneUri *uri=linphone_uri_clone(linphone_friend_get_uri(fr));
char *str;
linphonec_out("name: %s\n", linphone_uri_get_display_name(uri));
linphone_uri_set_display_name(uri,NULL);
str=linphone_uri_as_string(uri);
linphonec_out("address: %s\n", str);
}
static int
@ -1272,8 +1273,9 @@ linphonec_friend_list(LinphoneCore *lc, char *pat)
for(n=0; friend!=NULL; friend=ms_list_next(friend), ++n )
{
if ( pat ) {
char *name = linphone_friend_get_name(friend->data);
if ( ! strstr(name, pat) ) continue;
const char *name = linphone_uri_get_display_name(
linphone_friend_get_uri((LinphoneFriend*)friend->data));
if (name && ! strstr(name, pat) ) continue;
}
linphonec_out("****** Friend %i *******\n",n);
linphonec_friend_display((LinphoneFriend*)friend->data);
@ -1293,8 +1295,11 @@ linphonec_friend_call(LinphoneCore *lc, unsigned int num)
{
if ( n == num )
{
addr = linphone_friend_get_addr(friend->data);
return lpc_cmd_call(lc, addr);
int ret;
addr = linphone_uri_as_string(linphone_friend_get_uri((LinphoneFriend*)friend->data));
ret=lpc_cmd_call(lc, addr);
ms_free(addr);
return ret;
}
}
linphonec_out("No such friend %u\n", num);

View file

@ -27,13 +27,12 @@
#include <eXosip2/eXosip.h>
LinphoneChatRoom * linphone_core_create_chat_room(LinphoneCore *lc, const char *to){
char *real_url=NULL;
osip_from_t *parsed_url=NULL;
LinphoneUri *parsed_url=NULL;
char *route;
if (linphone_core_interpret_url(lc,to,&real_url,&parsed_url,&route)){
if (linphone_core_interpret_url(lc,to,&parsed_url,&route)){
LinphoneChatRoom *cr=ms_new0(LinphoneChatRoom,1);
cr->lc=lc;
cr->peer=real_url;
cr->peer=linphone_uri_as_string(parsed_url);
cr->peer_url=parsed_url;
cr->route=route;
lc->chatrooms=ms_list_append(lc->chatrooms,(void *)cr);
@ -46,7 +45,7 @@
void linphone_chat_room_destroy(LinphoneChatRoom *cr){
LinphoneCore *lc=cr->lc;
lc->chatrooms=ms_list_remove(lc->chatrooms,(void *) cr);
osip_from_free(cr->peer_url);
linphone_uri_destroy(cr->peer_url);
ms_free(cr->peer);
ms_free(cr->route);
}
@ -60,9 +59,9 @@ void linphone_chat_room_send_message(LinphoneChatRoom *cr, const char *msg){
eXosip_message_send_request(sip);
}
bool_t linphone_chat_room_matches(LinphoneChatRoom *cr, osip_from_t *from){
if (cr->peer_url->url->username && from->url->username &&
strcmp(cr->peer_url->url->username,from->url->username)==0) return TRUE;
bool_t linphone_chat_room_matches(LinphoneChatRoom *cr, const LinphoneUri *from){
if (linphone_uri_get_username(cr->peer_url) && linphone_uri_get_username(from) &&
strcmp(linphone_uri_get_username(cr->peer_url),linphone_uri_get_username(from))==0) return TRUE;
return FALSE;
}
@ -74,9 +73,10 @@ void linphone_core_text_received(LinphoneCore *lc, eXosip_event_t *ev){
MSList *elem;
const char *msg;
LinphoneChatRoom *cr=NULL;
char *cleanfrom;
char *from;
osip_from_t *from_url=ev->request->from;
osip_body_t *body=NULL;
LinphoneUri *uri;
osip_message_get_body(ev->request,0,&body);
if (body==NULL){
@ -84,20 +84,25 @@ void linphone_core_text_received(LinphoneCore *lc, eXosip_event_t *ev){
return;
}
msg=body->body;
from_2char_without_params(from_url,&cleanfrom);
osip_from_to_str(from_url,&from);
uri=linphone_uri_new(from);
osip_free(from);
linphone_uri_clean(uri);
for(elem=lc->chatrooms;elem!=NULL;elem=ms_list_next(elem)){
cr=(LinphoneChatRoom*)elem->data;
if (linphone_chat_room_matches(cr,from_url)){
if (linphone_chat_room_matches(cr,uri)){
break;
}
cr=NULL;
}
from=linphone_uri_as_string(uri);
if (cr==NULL){
/* create a new chat room */
cr=linphone_core_create_chat_room(lc,cleanfrom);
cr=linphone_core_create_chat_room(lc,from);
}
linphone_chat_room_text_received(cr,lc,cleanfrom,msg);
osip_free(cleanfrom);
linphone_uri_destroy(uri);
linphone_chat_room_text_received(cr,lc,from,msg);
ms_free(from);
}

View file

@ -321,7 +321,7 @@ int linphone_inc_new_call(LinphoneCore *lc, eXosip_event_t *ev)
eXosip_unlock();
goto end;
}
lc->call=linphone_call_new_incoming(lc,from,to,ev);
lc->call=linphone_call_new_incoming(lc,linphone_uri_new(from),linphone_uri_new(to),ev);
sdp=eXosip_get_sdp_info(ev->request);
if (sdp==NULL){

View file

@ -77,19 +77,19 @@ const char *linphone_online_status_to_string(LinphoneOnlineStatus ss){
}
static int friend_data_compare(const void * a, const void * b, void * data){
osip_from_t *fa=((LinphoneFriend*)a)->url;
osip_from_t *fb=((LinphoneFriend*)b)->url;
char *ua,*ub;
ua=fa->url->username;
ub=fb->url->username;
LinphoneUri *fa=((LinphoneFriend*)a)->uri;
LinphoneUri *fb=((LinphoneFriend*)b)->uri;
const char *ua,*ub;
ua=linphone_uri_get_username(fa);
ub=linphone_uri_get_username(fb);
if (ua!=NULL && ub!=NULL) {
//printf("Comparing usernames %s,%s\n",ua,ub);
return strcasecmp(ua,ub);
}
else {
/* compare hosts*/
ua=fa->url->host;
ub=fb->url->host;
ua=linphone_uri_get_domain(fa);
ub=linphone_uri_get_domain(fb);
if (ua!=NULL && ub!=NULL){
int ret=strcasecmp(ua,ub);
//printf("Comparing hostnames %s,%s,res=%i\n",ua,ub,ret);
@ -104,11 +104,11 @@ static int friend_compare(const void * a, const void * b){
}
MSList *find_friend(MSList *fl, const osip_from_t *friend, LinphoneFriend **lf){
MSList *linphone_find_friend(MSList *fl, const LinphoneUri *friend, LinphoneFriend **lf){
MSList *res=NULL;
LinphoneFriend dummy;
if (lf!=NULL) *lf=NULL;
dummy.url=(osip_from_t*)friend;
dummy.uri=(LinphoneUri*)friend;
res=ms_list_find_custom(fl,friend_compare,&dummy);
if (lf!=NULL && res!=NULL) *lf=(LinphoneFriend*)res->data;
return res;
@ -137,7 +137,7 @@ void __linphone_friend_do_subscribe(LinphoneFriend *fr){
const char *route=NULL;
const char *from=NULL;
osip_message_t *msg=NULL;
osip_from_to_str(fr->url,&friend);
friend=linphone_uri_as_string(fr->uri);
if (fr->proxy!=NULL){
route=fr->proxy->reg_route;
from=fr->proxy->reg_identity;
@ -150,7 +150,7 @@ void __linphone_friend_do_subscribe(LinphoneFriend *fr){
eXosip_subscribe_build_initial_request(&msg,friend,from,route,"presence",600);
eXosip_subscribe_send_initial_request(msg);
eXosip_unlock();
osip_free(friend);
ms_free(friend);
}
@ -176,63 +176,56 @@ LinphoneFriend *linphone_friend_new_with_addr(const char *addr){
}
void linphone_core_interpret_friend_uri(LinphoneCore *lc, const char *uri, char **result){
int err;
osip_from_t *fr=NULL;
osip_from_init(&fr);
err=osip_from_parse(fr,uri);
if (err<0){
LinphoneUri *fr=NULL;
*result=NULL;
fr=linphone_uri_new(uri);
if (fr==NULL){
char *tmp=NULL;
if (strchr(uri,'@')!=NULL){
LinphoneUri *u;
/*try adding sip:*/
tmp=ms_strdup_printf("sip:%s",uri);
u=linphone_uri_new(tmp);
if (u!=NULL){
*result=tmp;
}
}else if (lc->default_proxy!=NULL){
/*try adding domain part from default current proxy*/
osip_from_t *id=NULL;
osip_from_init(&id);
if (osip_from_parse(id,linphone_core_get_identity(lc))==0){
if (id->url->port!=NULL && strlen(id->url->port)>0)
tmp=ms_strdup_printf("sip:%s@%s:%s",uri,id->url->host,id->url->port);
else tmp=ms_strdup_printf("sip:%s@%s",uri,id->url->host);
LinphoneUri * id=linphone_uri_new(linphone_core_get_identity(lc));
if (id!=NULL){
linphone_uri_set_username(id,uri);
*result=linphone_uri_as_string(id);
linphone_uri_destroy(id);
}
osip_from_free(id);
}
if (osip_from_parse(fr,tmp)==0){
if (*result){
/*looks good */
ms_message("%s interpreted as %s",uri,tmp);
*result=tmp;
}else *result=NULL;
}else *result=ms_strdup(uri);
osip_from_free(fr);
ms_message("%s interpreted as %s",uri,*result);
}else{
ms_warning("Fail to interpret friend uri %s",uri);
}
}else *result=linphone_uri_as_string(fr);
linphone_uri_destroy(fr);
}
int linphone_friend_set_sip_addr(LinphoneFriend *lf, const char *addr){
int err;
osip_from_t *fr=NULL;
osip_from_init(&fr);
err=osip_from_parse(fr,addr);
if (err<0) {
LinphoneUri *fr=linphone_uri_new(addr);
if (fr==NULL) {
ms_warning("Invalid friend sip uri: %s",addr);
osip_from_free(fr);
return -1;
}
if (lf->url!=NULL) osip_from_free(lf->url);
lf->url=fr;
if (lf->uri!=NULL) linphone_uri_destroy(lf->uri);
lf->uri=fr;
return 0;
}
int linphone_friend_set_name(LinphoneFriend *lf, const char *name){
osip_from_t *fr=lf->url;
LinphoneUri *fr=lf->uri;
if (fr==NULL){
ms_error("linphone_friend_set_sip_addr() must be called before linphone_friend_set_name().");
return -1;
}
if (fr->displayname!=NULL){
osip_free(fr->displayname);
fr->displayname=NULL;
}
if (name && name[0]!='\0'){
fr->displayname=osip_strdup(name);
}
linphone_uri_set_display_name(fr,name);
return 0;
}
@ -560,7 +553,7 @@ static void linphone_friend_unsubscribe(LinphoneFriend *lf){
void linphone_friend_destroy(LinphoneFriend *lf){
linphone_friend_notify(lf,EXOSIP_SUBCRSTATE_TERMINATED,LINPHONE_STATUS_CLOSED);
linphone_friend_unsubscribe(lf);
if (lf->url!=NULL) osip_from_free(lf->url);
if (lf->uri!=NULL) linphone_uri_destroy(lf->uri);
if (lf->info!=NULL) buddy_info_free(lf->info);
ms_free(lf);
}
@ -571,29 +564,10 @@ void linphone_friend_check_for_removed_proxy(LinphoneFriend *lf, LinphoneProxyCo
}
}
char *linphone_friend_get_addr(LinphoneFriend *lf){
char *ret,*tmp;
if (lf->url==NULL) return NULL;
osip_uri_to_str(lf->url->url,&tmp);
ret=ms_strdup(tmp);
osip_free(tmp);
return ret;
const LinphoneUri *linphone_friend_get_uri(const LinphoneFriend *lf){
return lf->uri;
}
char *linphone_friend_get_name(LinphoneFriend *lf){
if (lf->url==NULL) return NULL;
if (lf->url->displayname==NULL) return NULL;
return ms_strdup(lf->url->displayname);
}
char * linphone_friend_get_url(LinphoneFriend *lf){
char *tmp,*ret;
if (lf->url==NULL) return NULL;
osip_from_to_str(lf->url,&tmp);
ret=ms_strdup(tmp);
ms_free(tmp);
return ret;
}
bool_t linphone_friend_get_send_subscribe(const LinphoneFriend *lf){
return lf->subscribe;
@ -612,7 +586,7 @@ BuddyInfo * linphone_friend_get_info(const LinphoneFriend *lf){
}
void linphone_friend_apply(LinphoneFriend *fr, LinphoneCore *lc){
if (fr->url==NULL) {
if (fr->uri==NULL) {
ms_warning("No sip url defined.");
return;
}
@ -657,7 +631,7 @@ void linphone_friend_done(LinphoneFriend *fr){
void linphone_core_add_friend(LinphoneCore *lc, LinphoneFriend *lf)
{
ms_return_if_fail(lf->lc==NULL);
ms_return_if_fail(lf->url!=NULL);
ms_return_if_fail(lf->uri!=NULL);
lc->friends=ms_list_append(lc->friends,lf);
linphone_friend_apply(lf,lc);
return ;
@ -679,22 +653,26 @@ static bool_t username_match(const char *u1, const char *u2){
}
LinphoneFriend *linphone_core_get_friend_by_uri(const LinphoneCore *lc, const char *uri){
osip_from_t *from;
osip_from_init(&from);
LinphoneUri *puri=linphone_uri_new(uri);
const MSList *elem;
if (osip_from_parse(from,uri)!=0){
osip_from_free(from);
const char *username=linphone_uri_get_username(puri);
const char *domain=linphone_uri_get_domain(puri);
LinphoneFriend *lf=NULL;
if (puri==NULL){
return NULL;
}
for(elem=lc->friends;elem!=NULL;elem=ms_list_next(elem)){
LinphoneFriend *lf=(LinphoneFriend*)elem->data;
const char *it_username=lf->url->url->username;
const char *it_host=lf->url->url->host;
if (strcasecmp(from->url->host,it_host)==0 && username_match(from->url->username,it_username)){
return lf;
lf=(LinphoneFriend*)elem->data;
const char *it_username=linphone_uri_get_username(lf->uri);
const char *it_host=linphone_uri_get_domain(lf->uri);;
if (strcasecmp(domain,it_host)==0 && username_match(username,it_username)){
break;
}
lf=NULL;
}
return NULL;
linphone_uri_destroy(puri);
return lf;
}
#define key_compare(key, word) strncasecmp((key),(word),strlen(key))
@ -781,8 +759,8 @@ void linphone_friend_write_to_config_file(LpConfig *config, LinphoneFriend *lf,
lp_config_clean_section(config,key);
return;
}
if (lf->url!=NULL){
osip_from_to_str(lf->url,&tmp);
if (lf->uri!=NULL){
tmp=linphone_uri_as_string(lf->uri);
if (tmp==NULL) {
return;
}

View file

@ -73,7 +73,7 @@ int lc_callback_obj_invoke(LCCallbackObj *obj, LinphoneCore *lc){
return 0;
}
static void linphone_call_init_common(LinphoneCall *call, char *from, char *to){
static void linphone_call_init_common(LinphoneCall *call, LinphoneUri *from, LinphoneUri *to){
call->state=LCStateInit;
call->start_time=time(NULL);
call->media_start_time=0;
@ -102,32 +102,28 @@ static void discover_mtu(LinphoneCore *lc, const char *remote){
}
}
LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, const osip_from_t *from, const osip_to_t *to)
LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneUri *from, LinphoneUri *to)
{
LinphoneCall *call=ms_new0(LinphoneCall,1);
char *fromstr=NULL,*tostr=NULL;
call->dir=LinphoneCallOutgoing;
call->cid=-1;
call->did=-1;
call->tid=-1;
call->core=lc;
linphone_core_get_local_ip(lc,to->url->host,call->localip);
osip_from_to_str(from,&fromstr);
osip_to_to_str(to,&tostr);
linphone_call_init_common(call,fromstr,tostr);
linphone_core_get_local_ip(lc,linphone_uri_get_domain(to),call->localip);
linphone_call_init_common(call,from,to);
call->sdpctx=sdp_handler_create_context(&linphone_sdphandler,
call->audio_params.natd_port>0 ? call->audio_params.natd_addr : call->localip,
from->url->username,NULL);
linphone_uri_get_username (from),NULL);
sdp_context_set_user_pointer(call->sdpctx,(void*)call);
discover_mtu(lc,to->url->host);
discover_mtu(lc,linphone_uri_get_domain (to));
return call;
}
LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, const char *from, const char *to, eXosip_event_t *ev){
LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneUri *from, LinphoneUri *to, eXosip_event_t *ev){
LinphoneCall *call=ms_new0(LinphoneCall,1);
osip_from_t *me= linphone_core_get_primary_contact_parsed(lc);
osip_from_t *from_url=NULL;
LinphoneUri *me=linphone_core_get_primary_contact_parsed(lc);
osip_header_t *h=NULL;
call->dir=LinphoneCallIncoming;
@ -135,17 +131,17 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, const char *from, co
call->did=ev->did;
call->tid=ev->tid;
call->core=lc;
osip_from_init(&from_url);
osip_from_parse(from_url, from);
linphone_core_get_local_ip(lc,from_url->url->host,call->localip);
linphone_call_init_common(call, osip_strdup(from), osip_strdup(to));
linphone_uri_clean(from);
linphone_core_get_local_ip(lc,linphone_uri_get_domain(from),call->localip);
linphone_call_init_common(call, from, to);
call->sdpctx=sdp_handler_create_context(&linphone_sdphandler,
call->audio_params.natd_port>0 ? call->audio_params.natd_addr : call->localip,
me->url->username,NULL);
linphone_uri_get_username (me),NULL);
sdp_context_set_user_pointer(call->sdpctx,(void*)call);
discover_mtu(lc,from_url->url->host);
osip_from_free(me);
osip_from_free(from_url);
discover_mtu(lc,linphone_uri_get_domain(from));
linphone_uri_destroy(me);
osip_message_header_get_byname(ev->request,"Session-expires",0,&h);
if (h) call->supports_session_timers=TRUE;
return call;
@ -166,7 +162,7 @@ static size_t my_strftime(char *s, size_t max, const char *fmt, const struct t
return strftime(s, max, fmt, tm);
}
LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, char *from, char *to){
LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneUri *from, LinphoneUri *to){
LinphoneCallLog *cl=ms_new0(LinphoneCallLog,1);
struct tm loctime;
cl->dir=call->dir;
@ -218,6 +214,9 @@ void linphone_call_log_completed(LinphoneCallLog *calllog, LinphoneCall *call){
char * linphone_call_log_to_str(LinphoneCallLog *cl){
char *status;
char *tmp;
char *from=linphone_uri_as_string (cl->from);
char *to=linphone_uri_as_string (cl->to);
switch(cl->status){
case LinphoneCallAborted:
status=_("aborted");
@ -231,14 +230,17 @@ char * linphone_call_log_to_str(LinphoneCallLog *cl){
default:
status="unknown";
}
return ortp_strdup_printf(_("%s at %s\nFrom: %s\nTo: %s\nStatus: %s\nDuration: %i mn %i sec\n"),
tmp=ortp_strdup_printf(_("%s at %s\nFrom: %s\nTo: %s\nStatus: %s\nDuration: %i mn %i sec\n"),
(cl->dir==LinphoneCallIncoming) ? _("Incoming call") : _("Outgoing call"),
cl->start_date,
cl->from,
cl->to,
from,
to,
status,
cl->duration/60,
cl->duration%60);
ms_free(from);
ms_free(to);
return tmp;
}
void linphone_call_log_destroy(LinphoneCallLog *cl){
@ -254,7 +256,7 @@ int linphone_core_get_current_call_duration(const LinphoneCore *lc){
return time(NULL)-call->media_start_time;
}
const char *linphone_core_get_remote_uri(LinphoneCore *lc){
const LinphoneUri *linphone_core_get_remote_uri(LinphoneCore *lc){
LinphoneCall *call=lc->call;
if (call==NULL) return 0;
return call->dir==LinphoneCallIncoming ? call->log->from : call->log->to;
@ -857,16 +859,8 @@ bool_t linphone_core_get_guess_hostname(LinphoneCore *lc){
return lc->sip_conf.guess_hostname;
}
osip_from_t *linphone_core_get_primary_contact_parsed(LinphoneCore *lc){
int err;
osip_from_t *contact;
osip_from_init(&contact);
err=osip_from_parse(contact,linphone_core_get_primary_contact(lc));
if (err<0) {
osip_from_free(contact);
return NULL;
}
return contact;
LinphoneUri *linphone_core_get_primary_contact_parsed(LinphoneCore *lc){
return linphone_uri_new(linphone_core_get_primary_contact(lc));
}
int linphone_core_set_audio_codecs(LinphoneCore *lc, MSList *codecs)
@ -1091,20 +1085,18 @@ static void linphone_core_grab_buddy_infos(LinphoneCore *lc, LinphoneProxyConfig
for(elem=linphone_core_get_friend_list(lc);elem!=NULL;elem=elem->next){
LinphoneFriend *lf=(LinphoneFriend*)elem->data;
if (lf->info==NULL){
char *url=linphone_friend_get_url(lf);
if (linphone_core_lookup_known_proxy(lc,url)==cfg){
if (lf->url->url->username!=NULL && lf->url->url->username[0]!='\0'){
if (linphone_core_lookup_known_proxy(lc,lf->uri)==cfg){
if (linphone_uri_get_username(lf->uri)!=NULL){
BuddyLookupRequest *req;
char tmp[255];
snprintf(tmp,sizeof(tmp),"sip:%s@%s",lf->url->url->username,lf->url->url->host);
char *tmp=linphone_uri_as_string_without_display_name(lf->uri);
req=sip_setup_context_create_buddy_lookup_request(ctx);
buddy_lookup_request_set_key(req,tmp);
buddy_lookup_request_set_max_results(req,1);
sip_setup_context_buddy_lookup_submit(ctx,req);
lc->bl_reqs=ms_list_append(lc->bl_reqs,req);
ms_free(tmp);
}
}
ms_free(url);
}
}
}
@ -1210,16 +1202,6 @@ bool_t linphone_core_is_in_main_thread(LinphoneCore *lc){
return TRUE;
}
static osip_to_t *osip_to_create(const char *to){
osip_to_t *ret;
osip_to_init(&ret);
if (osip_to_parse(ret,to)<0){
osip_to_free(ret);
return NULL;
}
return ret;
}
static char *guess_route_if_any(LinphoneCore *lc, osip_to_t *parsed_url){
const MSList *elem=linphone_core_get_proxy_config_list(lc);
for(;elem!=NULL;elem=elem->next){
@ -1247,14 +1229,13 @@ static char *guess_route_if_any(LinphoneCore *lc, osip_to_t *parsed_url){
return NULL;
}
bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, char **real_url, osip_to_t **real_parsed_url, char **route){
bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, LinphoneUri **real_parsed_url, char **route){
enum_lookup_res_t *enumres=NULL;
osip_to_t *parsed_url=NULL;
char *enum_domain=NULL;
LinphoneProxyConfig *proxy;
char *tmpurl;
const char *tmproute;
if (real_url!=NULL) *real_url=NULL;
if (real_parsed_url!=NULL) *real_parsed_url=NULL;
*route=NULL;
tmproute=linphone_core_get_route(lc);
@ -1268,8 +1249,7 @@ bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, char **rea
}
ms_free(enum_domain);
tmpurl=enumres->sip_address[0];
if (real_url!=NULL) *real_url=ms_strdup(tmpurl);
if (real_parsed_url!=NULL) *real_parsed_url=osip_to_create(tmpurl);
if (real_parsed_url!=NULL) *real_parsed_url=linphone_uri_new(tmpurl);
enum_lookup_res_free(enumres);
if (tmproute) *route=ms_strdup(tmproute);
return TRUE;
@ -1280,22 +1260,14 @@ bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, char **rea
proxy=lc->default_proxy;
if (proxy!=NULL){
/* append the proxy domain suffix */
osip_from_t *uri;
char *sipaddr;
LinphoneUri *uri;
const char *identity=linphone_proxy_config_get_identity(proxy);
osip_from_init(&uri);
if (osip_from_parse(uri,identity)<0){
osip_from_free(uri);
uri=linphone_uri_new(identity);
if (uri==NULL){
return FALSE;
}
if (uri->url->port!=NULL && uri->url->port[0]!='\0')
sipaddr=ortp_strdup_printf("sip:%s@%s:%s",url,uri->url->host,uri->url->port);
else
sipaddr=ortp_strdup_printf("sip:%s@%s",url,uri->url->host);
osip_from_free(uri);
if (real_parsed_url!=NULL) *real_parsed_url=osip_to_create(sipaddr);
if (real_url!=NULL) *real_url=sipaddr;
else ms_free(sipaddr);
linphone_uri_set_username(uri,url);
if (real_parsed_url!=NULL) *real_parsed_url=uri;
#if 0
/*if the prompted uri was auto-suffixed with proxy domain,
then automatically set a route so that the request goes
@ -1320,11 +1292,10 @@ bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, char **rea
return TRUE;
}
}
parsed_url=osip_to_create(url);
parsed_url=linphone_uri_new(url);
if (parsed_url!=NULL){
if (real_url!=NULL) *real_url=ms_strdup(url);
if (real_parsed_url!=NULL) *real_parsed_url=parsed_url;
else osip_to_free(parsed_url);
else linphone_uri_destroy(parsed_url);
if (tmproute) *route=ms_strdup(tmproute);
else *route=guess_route_if_any(lc,*real_parsed_url);
return TRUE;
@ -1365,21 +1336,17 @@ void linphone_set_sdp(osip_message_t *sip, const char *sdpmesg){
osip_message_set_content_length(sip,clen);
}
LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const char *uri){
LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const LinphoneUri *uri){
const MSList *elem;
LinphoneProxyConfig *found_cfg=NULL;
osip_from_t *parsed_uri;
osip_from_init(&parsed_uri);
osip_from_parse(parsed_uri,uri);
for (elem=linphone_core_get_proxy_config_list(lc);elem!=NULL;elem=elem->next){
LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)elem->data;
const char *domain=linphone_proxy_config_get_domain(cfg);
if (domain!=NULL && strcmp(domain,parsed_uri->url->host)==0){
if (domain!=NULL && strcmp(domain,linphone_uri_get_domain(uri))==0){
found_cfg=cfg;
break;
}
}
osip_from_free(parsed_uri);
return found_cfg;
}
@ -1426,8 +1393,8 @@ int linphone_core_invite(LinphoneCore *lc, const char *url)
osip_message_t *invite=NULL;
sdp_context_t *ctx=NULL;
LinphoneProxyConfig *proxy=NULL;
osip_from_t *parsed_url2=NULL;
osip_to_t *real_parsed_url=NULL;
LinphoneUri *parsed_url2=NULL;
LinphoneUri *real_parsed_url=NULL;
char *real_url=NULL;
LinphoneProxyConfig *dest_proxy=NULL;
@ -1438,12 +1405,13 @@ int linphone_core_invite(LinphoneCore *lc, const char *url)
gstate_new_state(lc, GSTATE_CALL_OUT_INVITE, url);
linphone_core_get_default_proxy(lc,&proxy);
if (!linphone_core_interpret_url(lc,url,&real_url,&real_parsed_url,&route)){
if (!linphone_core_interpret_url(lc,url,&real_parsed_url,&route)){
/* bad url */
gstate_new_state(lc, GSTATE_CALL_ERROR, NULL);
return -1;
}
dest_proxy=linphone_core_lookup_known_proxy(lc,real_url);
real_url=linphone_uri_as_string(real_parsed_url);
dest_proxy=linphone_core_lookup_known_proxy(lc,real_parsed_url);
if (proxy!=dest_proxy && dest_proxy!=NULL) {
ms_message("Overriding default proxy setting for this call:");
@ -1470,8 +1438,7 @@ int linphone_core_invite(LinphoneCore *lc, const char *url)
}
/* make sdp message */
osip_from_init(&parsed_url2);
osip_from_parse(parsed_url2,from);
parsed_url2=linphone_uri_new(from);
lc->call=linphone_call_new_outgoing(lc,parsed_url2,real_parsed_url);
/*try to be best-effort in giving real local or routable contact address,
@ -1503,8 +1470,6 @@ int linphone_core_invite(LinphoneCore *lc, const char *url)
goto end;
end:
if (real_url!=NULL) ms_free(real_url);
if (real_parsed_url!=NULL) osip_to_free(real_parsed_url);
if (parsed_url2!=NULL) osip_from_free(parsed_url2);
if (err<0)
gstate_new_state(lc, GSTATE_CALL_ERROR, NULL);
if (route!=NULL) ms_free(route);
@ -1514,11 +1479,11 @@ int linphone_core_invite(LinphoneCore *lc, const char *url)
int linphone_core_refer(LinphoneCore *lc, const char *url)
{
char *real_url=NULL;
osip_to_t *real_parsed_url=NULL;
LinphoneUri *real_parsed_url=NULL;
LinphoneCall *call;
osip_message_t *msg=NULL;
char *route;
if (!linphone_core_interpret_url(lc,url,&real_url,&real_parsed_url, &route)){
if (!linphone_core_interpret_url(lc,url,&real_parsed_url, &route)){
/* bad url */
return -1;
}
@ -1529,7 +1494,9 @@ int linphone_core_refer(LinphoneCore *lc, const char *url)
return -1;
}
lc->call=NULL;
real_url=linphone_uri_as_string (real_parsed_url);
eXosip_call_build_refer(call->did, real_url, &msg);
ms_free(real_url);
eXosip_lock();
eXosip_call_send_request(call->did, msg);
eXosip_unlock();
@ -1723,14 +1690,14 @@ static void post_configure_audio_streams(LinphoneCore *lc){
}
void linphone_core_start_media_streams(LinphoneCore *lc, LinphoneCall *call){
osip_from_t *me=linphone_core_get_primary_contact_parsed(lc);
LinphoneUri *me=linphone_core_get_primary_contact_parsed(lc);
const char *tool="linphone-" LINPHONE_VERSION;
/* adjust rtp jitter compensation. It must be at least the latency of the sound card */
int jitt_comp=MAX(lc->sound_conf.latency,lc->rtp_conf.audio_jitt_comp);
if (call->media_start_time==0) call->media_start_time=time(NULL);
char *cname=ortp_strdup_printf("%s@%s",me->url->username,me->url->host);
char *cname=ortp_strdup_printf("%s@%s",linphone_uri_get_username(me),linphone_uri_get_domain(me));
{
StreamParams *audio_params=&call->audio_params;
if (!lc->use_files){
@ -1809,7 +1776,7 @@ void linphone_core_start_media_streams(LinphoneCore *lc, LinphoneCall *call){
goto end;
end:
ms_free(cname);
osip_from_free(me);
linphone_uri_destroy(me);
lc->call->state=LCStateAVRunning;
}
@ -2809,3 +2776,108 @@ void linphone_core_destroy(LinphoneCore *lc){
linphone_core_uninit(lc);
ms_free(lc);
}
LinphoneUri * linphone_uri_new(const char *uri){
osip_from_t *from;
osip_from_init(&from);
if (osip_from_parse(from,uri)!=0){
osip_from_free(from);
return NULL;
}
return from;
}
LinphoneUri * linphone_uri_clone(const LinphoneUri *uri){
osip_from_t *ret=NULL;
osip_from_clone(uri,&ret);
return ret;
}
#define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL )
const char *linphone_uri_get_scheme(const LinphoneUri *u){
return null_if_empty(u->url->scheme);
}
const char *linphone_uri_get_display_name(const LinphoneUri* u){
return null_if_empty(u->displayname);
}
const char *linphone_uri_get_username(const LinphoneUri *u){
return null_if_empty(u->url->username);
}
const char *linphone_uri_get_domain(const LinphoneUri *u){
return null_if_empty(u->url->host);
}
void linphone_uri_set_display_name(LinphoneUri *u, const char *display_name){
if (u->displayname!=NULL){
osip_free(u->displayname);
u->displayname=NULL;
}
if (display_name!=NULL)
u->displayname=osip_strdup(display_name);
}
void linphone_uri_set_username(LinphoneUri *uri, const char *username){
if (uri->url->username!=NULL){
osip_free(uri->url->username);
uri->url->username=NULL;
}
if (username)
uri->url->username=osip_strdup(username);
}
void linphone_uri_set_domain(LinphoneUri *uri, const char *host){
if (uri->url->host!=NULL){
osip_free(uri->url->host);
uri->url->host=NULL;
}
if (host)
uri->url->host=osip_strdup(host);
}
void linphone_uri_set_port(LinphoneUri *uri, const char *port){
if (uri->url->port!=NULL){
osip_free(uri->url->port);
uri->url->port=NULL;
}
if (port)
uri->url->port=osip_strdup(port);
}
void linphone_uri_set_port_int(LinphoneUri *uri, int port){
char tmp[12];
if (port==5060){
/*this is the default, special case to leave the port field blank*/
linphone_uri_set_port(uri,NULL);
return;
}
snprintf(tmp,sizeof(tmp),"%i",port);
linphone_uri_set_port(uri,tmp);
}
void linphone_uri_clean(LinphoneUri *uri){
osip_generic_param_freelist(&uri->gen_params);
}
char *linphone_uri_as_string(const LinphoneUri *u){
char *tmp,*ret;
osip_from_to_str(u,&tmp);
ret=ms_strdup(tmp);
osip_free(tmp);
return ret;
}
char *linphone_uri_as_string_without_display_name(const LinphoneUri *u){
char *tmp=NULL,*ret;
osip_uri_to_str(u->url,&tmp);
ret=ms_strdup(tmp);
osip_free(tmp);
return ret;
}
void linphone_uri_destroy(LinphoneUri *u){
osip_from_free(u);
}

View file

@ -19,8 +19,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef LINPHONECORE_H
#define LINPHONECORE_H
#include <osipparser2/osip_message.h>
#include "ortp/ortp.h"
#include "ortp/payloadtype.h"
#include "mediastreamer2/mscommon.h"
@ -147,6 +145,26 @@ typedef struct autoreplier_config
const char *message; /* the path of the file to be played */
}autoreplier_config_t;
struct osip_from;
typedef struct osip_from LinphoneUri;
LinphoneUri * linphone_uri_new(const char *uri);
LinphoneUri * linphone_uri_clone(const LinphoneUri *uri);
const char *linphone_uri_get_scheme(const LinphoneUri *u);
const char *linphone_uri_get_display_name(const LinphoneUri* u);
const char *linphone_uri_get_username(const LinphoneUri *u);
const char *linphone_uri_get_domain(const LinphoneUri *u);
void linphone_uri_set_display_name(LinphoneUri *u, const char *display_name);
void linphone_uri_set_username(LinphoneUri *uri, const char *username);
void linphone_uri_set_domain(LinphoneUri *uri, const char *host);
void linphone_uri_set_port(LinphoneUri *uri, const char *port);
void linphone_uri_set_port_int(LinphoneUri *uri, int port);
/*remove tags, params etc... so that it is displayable to the user*/
void linphone_uri_clean(LinphoneUri *uri);
char *linphone_uri_as_string(const LinphoneUri *u);
char *linphone_uri_as_string_without_display_name(const LinphoneUri *u);
void linphone_uri_destroy(LinphoneUri *u);
struct _LinphoneCore;
struct _sdp_context;
@ -166,11 +184,10 @@ typedef enum _LinphoneCallStatus {
typedef struct _LinphoneCallLog{
LinphoneCallDir dir;
LinphoneCallStatus status;
char *from;
char *to;
LinphoneUri *from;
LinphoneUri *to;
char start_date[128];
int duration;
} LinphoneCallLog;
@ -204,7 +221,7 @@ typedef enum _LinphoneOnlineStatus{
const char *linphone_online_status_to_string(LinphoneOnlineStatus ss);
typedef struct _LinphoneFriend{
osip_from_t *url;
LinphoneUri *uri;
int in_did;
int out_did;
int sid;
@ -228,10 +245,7 @@ int linphone_friend_set_proxy(LinphoneFriend *fr, struct _LinphoneProxyConfig *c
void linphone_friend_edit(LinphoneFriend *fr);
void linphone_friend_done(LinphoneFriend *fr);
void linphone_friend_destroy(LinphoneFriend *lf);
/* memory returned by those 3 functions must be freed */
char *linphone_friend_get_name(LinphoneFriend *lf);
char *linphone_friend_get_addr(LinphoneFriend *lf);
char *linphone_friend_get_url(LinphoneFriend *lf); /* name <sip address> */
const LinphoneUri *linphone_friend_get_uri(const LinphoneFriend *lf);
bool_t linphone_friend_get_send_subscribe(const LinphoneFriend *lf);
LinphoneSubscribePolicy linphone_friend_get_inc_subscribe_policy(const LinphoneFriend *lf);
LinphoneOnlineStatus linphone_friend_get_status(const LinphoneFriend *lf);
@ -336,7 +350,7 @@ struct _LinphoneChatRoom{
struct _LinphoneCore *lc;
char *peer;
char *route;
osip_from_t *peer_url;
LinphoneUri *peer_url;
void * user_data;
};
typedef struct _LinphoneChatRoom LinphoneChatRoom;
@ -560,7 +574,7 @@ bool_t linphone_core_get_guess_hostname(LinphoneCore *lc);
bool_t linphone_core_ipv6_enabled(LinphoneCore *lc);
void linphone_core_enable_ipv6(LinphoneCore *lc, bool_t val);
osip_from_t *linphone_core_get_primary_contact_parsed(LinphoneCore *lc);
LinphoneUri *linphone_core_get_primary_contact_parsed(LinphoneCore *lc);
/*0= no bandwidth limit*/
void linphone_core_set_download_bandwidth(LinphoneCore *lc, int bw);
@ -749,7 +763,7 @@ void linphone_core_set_record_file(LinphoneCore *lc, const char *file);
gstate_t linphone_core_get_state(const LinphoneCore *lc, gstate_group_t group);
int linphone_core_get_current_call_duration(const LinphoneCore *lc);
const char *linphone_core_get_remote_uri(LinphoneCore *lc);
const LinphoneUri *linphone_core_get_remote_uri(LinphoneCore *lc);
int linphone_core_get_mtu(const LinphoneCore *lc);
void linphone_core_set_mtu(LinphoneCore *lc, int mtu);
@ -791,7 +805,7 @@ void linphone_core_start_media_streams(LinphoneCore *lc, struct _LinphoneCall *c
void linphone_core_stop_media_streams(LinphoneCore *lc);
const char * linphone_core_get_identity(LinphoneCore *lc);
const char * linphone_core_get_route(LinphoneCore *lc);
bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, char **real_url, osip_to_t **real_parsed_url, char **route);
bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, LinphoneUri **real_parsed_url, char **route);
void linphone_core_start_waiting(LinphoneCore *lc, const char *purpose);
void linphone_core_update_progress(LinphoneCore *lc, const char *purpose, float progresses);
void linphone_core_stop_waiting(LinphoneCore *lc);

View file

@ -35,10 +35,9 @@ void linphone_core_add_subscriber(LinphoneCore *lc, const char *subscriber, int
fl->inc_subscribe_pending=TRUE;
lc->subscribers=ms_list_append(lc->subscribers,(void *)fl);
if (lc->vtable.new_unknown_subscriber!=NULL) {
char *clean_subscriber; /* we need to remove tags...*/
from_2char_without_params(fl->url,&clean_subscriber);
lc->vtable.new_unknown_subscriber(lc,fl,clean_subscriber);
ms_free(clean_subscriber);
char *subscriber=linphone_uri_as_string(fl->uri);
lc->vtable.new_unknown_subscriber(lc,fl,subscriber);
ms_free(subscriber);
}
}
@ -75,12 +74,12 @@ void linphone_subscription_new(LinphoneCore *lc, eXosip_event_t *ev){
osip_from_t *from=ev->request->from;
char *tmp;
osip_message_t *msg=NULL;
LinphoneUri *uri;
osip_from_to_str(ev->request->from,&tmp);
uri=linphone_uri_new(tmp);
ms_message("Receiving new subscription from %s.",tmp);
/* check if we answer to this subscription */
if (find_friend(lc->friends,from,&lf)!=NULL){
if (linphone_find_friend(lc->friends,uri,&lf)!=NULL){
lf->in_did=ev->did;
linphone_friend_set_nid(lf,ev->nid);
eXosip_insubscription_build_answer(ev->tid,202,&msg);
@ -89,7 +88,7 @@ void linphone_subscription_new(LinphoneCore *lc, eXosip_event_t *ev){
linphone_friend_done(lf); /*this will do all necessary actions */
}else{
/* check if this subscriber is in our black list */
if (find_friend(lc->subscribers,from,&lf)){
if (linphone_find_friend(lc->subscribers,uri,&lf)){
if (lf->pol==LinphoneSPDeny){
ms_message("Rejecting %s because we already rejected it once.",from);
eXosip_insubscription_send_answer(ev->tid,401,NULL);
@ -113,7 +112,7 @@ void linphone_notify_recv(LinphoneCore *lc, eXosip_event_t *ev)
const char *img="sip-closed.png";
char *tmp;
LinphoneFriend *lf;
osip_from_t *friend=NULL;
LinphoneUri *friend=NULL;
osip_from_t *from=NULL;
osip_body_t *body=NULL;
LinphoneOnlineStatus estatus=LINPHONE_STATUS_UNKNOWN;
@ -169,8 +168,8 @@ void linphone_notify_recv(LinphoneCore *lc, eXosip_event_t *ev)
}
lf=linphone_find_friend_by_sid(lc->friends,ev->sid);
if (lf!=NULL){
friend=lf->url;
from_2char_without_params(friend,&tmp);
friend=lf->uri;
tmp=linphone_uri_as_string(friend);
lf->status=estatus;
lc->vtable.notify_recv(lc,(LinphoneFriend*)lf,tmp,status,img);
ms_free(tmp);
@ -187,13 +186,17 @@ void linphone_notify_recv(LinphoneCore *lc, eXosip_event_t *ev)
void linphone_subscription_answered(LinphoneCore *lc, eXosip_event_t *ev){
LinphoneFriend *lf;
osip_from_t *from=ev->response->to;
find_friend(lc->friends,from,&lf);
char *tmp;
osip_from_to_str(from,&tmp);
LinphoneUri *uri=linphone_uri_new(tmp);
linphone_find_friend(lc->friends,uri,&lf);
if (lf!=NULL){
lf->out_did=ev->did;
linphone_friend_set_sid(lf,ev->sid);
}else{
ms_warning("Receiving answer for unknown subscribe sip:%s@%s", from->url->username,from->url->host);
}
ms_free(tmp);
}
void linphone_subscription_closed(LinphoneCore *lc,eXosip_event_t *ev){
LinphoneFriend *lf;

View file

@ -100,13 +100,13 @@ typedef struct _LinphoneCall
bool_t supports_session_timers;
} LinphoneCall;
LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, const osip_from_t *from, const osip_to_t *to);
LinphoneCall * linphone_call_new_incoming(struct _LinphoneCore *lc, const char *from, const char *to, eXosip_event_t *ev);
LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneUri *from, LinphoneUri *to);
LinphoneCall * linphone_call_new_incoming(struct _LinphoneCore *lc, LinphoneUri *from, LinphoneUri *to, eXosip_event_t *ev);
#define linphone_call_set_state(lcall,st) (lcall)->state=(st)
void linphone_call_destroy(struct _LinphoneCall *obj);
/* private: */
LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, char *local, char * remote);
LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneUri *local, LinphoneUri * remote);
void linphone_call_log_completed(LinphoneCallLog *calllog, LinphoneCall *call);
void linphone_call_log_destroy(LinphoneCallLog *cl);
@ -176,7 +176,7 @@ void linphone_call_init_media_params(LinphoneCall *call);
void linphone_set_sdp(osip_message_t *sip, const char *sdp);
MSList *find_friend(MSList *fl, const osip_from_t *friend, LinphoneFriend **lf);
MSList *linphone_find_friend(MSList *fl, const LinphoneUri *fri, LinphoneFriend **lf);
LinphoneFriend *linphone_find_friend_by_nid(MSList *l, int nid);
LinphoneFriend *linphone_find_friend_by_sid(MSList *l, int sid);
@ -187,7 +187,7 @@ void linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call);
void linphone_core_write_friends_config(LinphoneCore* lc);
void linphone_proxy_config_update(LinphoneProxyConfig *cfg);
void linphone_proxy_config_get_contact(LinphoneProxyConfig *cfg, const char **ip, int *port);
LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const char *uri);
LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const LinphoneUri *uri);
int linphone_core_get_local_ip_for(const char *dest, char *result);
#endif /* _PRIVATE_H */

View file

@ -30,13 +30,13 @@ static void sip_login_init_instance(SipSetupContext *ctx){
linphone_proxy_config_enable_register(cfg,FALSE);
}
static void guess_display_name(osip_from_t *from){
char *dn=(char*)osip_malloc(strlen(from->url->username)+3);
char *it=from->url->username;
static void guess_display_name(LinphoneUri *from){
char *dn=(char*)ms_malloc(strlen(linphone_uri_get_username(from))+3);
const char *it;
char *wptr=dn;
bool_t begin=TRUE;
bool_t surname=0;
for(it=from->url->username;*it!='\0';++it){
for(it=linphone_uri_get_username(from);*it!='\0';++it){
if (begin){
*wptr=toupper(*it);
begin=FALSE;
@ -48,35 +48,34 @@ static void guess_display_name(osip_from_t *from){
}else *wptr=*it;
wptr++;
}
if (from->displayname!=NULL) osip_free(from->displayname);
from->displayname=dn;
linphone_uri_set_display_name(from,dn);
ms_free(dn);
}
static int sip_login_do_login(SipSetupContext * ctx, const char *uri, const char *passwd){
LinphoneProxyConfig *cfg=sip_setup_context_get_proxy_config(ctx);
LinphoneCore *lc=linphone_proxy_config_get_core(cfg);
LinphoneAuthInfo *auth;
osip_from_t *parsed_uri;
LinphoneUri *parsed_uri;
char *tmp;
osip_from_init(&parsed_uri);
if (osip_from_parse(parsed_uri,uri)==-1){
osip_from_free(parsed_uri);
parsed_uri=linphone_uri_new(uri);
if (parsed_uri==NULL){
return -1;
}
if (parsed_uri->displayname==NULL || strlen(parsed_uri->displayname)==0){
if (linphone_uri_get_display_name(parsed_uri)!=NULL){
guess_display_name(parsed_uri);
}
osip_from_to_str(parsed_uri,&tmp);
tmp=linphone_uri_as_string(parsed_uri);
linphone_proxy_config_set_identity(cfg,tmp);
if (passwd ) {
auth=linphone_auth_info_new(parsed_uri->url->username,NULL,passwd,NULL,NULL);
auth=linphone_auth_info_new(linphone_uri_get_username(parsed_uri),NULL,passwd,NULL,NULL);
linphone_core_add_auth_info(lc,auth);
}
linphone_proxy_config_enable_register(cfg,TRUE);
linphone_proxy_config_done(cfg);
osip_free(tmp);
osip_from_free(parsed_uri);
ms_free(tmp);
linphone_uri_destroy(parsed_uri);
ms_message("SipLogin: done");
return 0;
}

View file

@ -136,12 +136,14 @@ int sip_setup_context_account_exists(SipSetupContext *ctx, const char *uri){
}
int sip_setup_context_login_account(SipSetupContext * ctx, const char *uri, const char *passwd){
osip_from_t *from;
osip_from_init(&from);
osip_from_parse(from,uri);
strncpy(ctx->domain,from->url->host,sizeof(ctx->domain));
strncpy(ctx->username,from->url->username,sizeof(ctx->username));
osip_from_free(from);
LinphoneUri *from=linphone_uri_new(uri);
if (from==NULL) {
ms_warning("Fail to parse %s",uri);
return -1;
}
strncpy(ctx->domain,linphone_uri_get_domain(from),sizeof(ctx->domain));
strncpy(ctx->username,linphone_uri_get_username(from),sizeof(ctx->username));
linphone_uri_destroy(from);
if (ctx->funcs->login_account)
return ctx->funcs->login_account(ctx,uri,passwd);
return -1;

View file

@ -104,7 +104,7 @@ static void linphone_gtk_set_selection_to_uri_bar(GtkTreeView *treeview){
if (gtk_tree_selection_get_selected (select, &model, &iter))
{
gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1);
friend=linphone_friend_get_url(lf);
friend=linphone_uri_as_string(linphone_friend_get_uri(lf));
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar")),friend);
ms_free(friend);
}
@ -309,22 +309,20 @@ void linphone_gtk_show_friends(void){
for(itf=linphone_core_get_friend_list(core);itf!=NULL;itf=ms_list_next(itf)){
LinphoneFriend *lf=(LinphoneFriend*)itf->data;
char *uri=linphone_friend_get_url(lf);
char *name=linphone_friend_get_name(lf);
char *addr=linphone_friend_get_addr(lf);
char *display=name;
const LinphoneUri *f_uri=linphone_friend_get_uri(lf);
char *uri=linphone_uri_as_string(f_uri);
const char *name=linphone_uri_get_display_name(f_uri);
const char *display=name;
char *escaped=NULL;
if (lookup){
if (strstr(uri,search)==NULL){
ms_free(uri);
if (name) ms_free(name);
if (addr) ms_free(addr);
continue;
}
}
if (!online_only || (linphone_friend_get_status(lf)!=LINPHONE_STATUS_OFFLINE)){
BuddyInfo *bi;
if (name==NULL || name[0]=='\0') display=addr;
if (name==NULL || name[0]=='\0') display=uri;
gtk_list_store_append(store,&iter);
gtk_list_store_set(store,&iter,FRIEND_NAME, display,
FRIEND_PRESENCE_STATUS, linphone_online_status_to_string(linphone_friend_get_status(lf)),
@ -346,8 +344,6 @@ void linphone_gtk_show_friends(void){
}
}
ms_free(uri);
if (name) ms_free(name);
if (addr) ms_free(addr);
}
}
@ -378,16 +374,17 @@ void linphone_gtk_remove_contact(GtkWidget *button){
void linphone_gtk_show_contact(LinphoneFriend *lf){
GtkWidget *w=linphone_gtk_create_window("contact");
char *uri,*name;
uri=linphone_friend_get_addr(lf);
name=linphone_friend_get_name(lf);
char *uri;
const char *name;
const LinphoneUri *f_uri=linphone_friend_get_uri(lf);
uri=linphone_uri_as_string_without_display_name(f_uri);
name=linphone_uri_get_display_name(f_uri);
if (uri) {
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"sip_address")),uri);
ms_free(uri);
}
if (name){
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"name")),name);
ms_free(name);
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"show_presence")),
linphone_friend_get_send_subscribe(lf));
@ -422,7 +419,7 @@ void linphone_gtk_chat_selected(GtkWidget *item){
{
char *uri;
gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1);
uri=linphone_friend_get_url(lf);
uri=linphone_uri_as_string(linphone_friend_get_uri(lf));
linphone_gtk_create_chatroom(uri);
ms_free(uri);
}

View file

@ -53,8 +53,9 @@ void linphone_gtk_show_idle_view(void){
}
void display_peer_name_in_label(GtkWidget *label, const char *uri){
osip_from_t *from;
char *displayname=NULL,*id=NULL;
LinphoneUri *from;
const char *displayname=NULL;
char *id=NULL;
char *uri_label;
if (uri==NULL) {
@ -62,31 +63,25 @@ void display_peer_name_in_label(GtkWidget *label, const char *uri){
return;
}
osip_from_init(&from);
if (osip_from_parse(from,uri)==0){
from=linphone_uri_new(uri);
if (from!=NULL){
if (from->displayname!=NULL && strlen(from->displayname)>0)
displayname=osip_strdup(from->displayname);
if (from->displayname!=NULL){
osip_free(from->displayname);
from->displayname=NULL;
}
osip_uri_param_freelist(&from->url->url_params);
osip_uri_header_freelist(&from->url->url_params);
osip_generic_param_freelist(&from->gen_params);
osip_from_to_str(from,&id);
if (linphone_uri_get_display_name(from))
displayname=linphone_uri_get_display_name(from);
id=linphone_uri_as_string_without_display_name(from);
}else id=ms_strdup(uri);
}else id=osip_strdup(uri);
osip_from_free(from);
if (displayname!=NULL)
uri_label=g_markup_printf_escaped("<span size=\"large\">%s</span>\n<i>%s</i>",
displayname,id);
else
uri_label=g_markup_printf_escaped("<span size=\"large\"><i>%s</i></span>\n",id);
gtk_label_set_markup(GTK_LABEL(label),uri_label);
if (displayname!=NULL) osip_free(displayname);
osip_free(id);
ms_free(id);
g_free(uri_label);
if (from!=NULL) linphone_uri_destroy(from);
}
void linphone_gtk_in_call_view_set_calling(const char *uri){
@ -118,9 +113,10 @@ void linphone_gtk_in_call_view_set_in_call(){
GtkWidget *animation=linphone_gtk_get_widget(main_window,"in_call_animation");
GdkPixbufAnimation *pbuf=create_pixbuf_animation("incall_anim.gif");
GtkWidget *terminate_button=linphone_gtk_get_widget(main_window,"in_call_terminate");
const char *uri=linphone_core_get_remote_uri(lc);
display_peer_name_in_label(callee,uri);
const LinphoneUri *uri=linphone_core_get_remote_uri(lc);
char *tmp=linphone_uri_as_string(uri);
display_peer_name_in_label(callee,tmp);
ms_free(tmp);
gtk_widget_set_sensitive(terminate_button,TRUE);
gtk_label_set_markup(GTK_LABEL(status),_("<b>In call with</b>"));

View file

@ -79,7 +79,6 @@ SipSetupContext* linphone_gtk_get_default_sip_setup_context(void);
GtkWidget * linphone_gtk_show_buddy_lookup_window(SipSetupContext *ctx);
void linphone_gtk_buddy_lookup_set_keyword(GtkWidget *w, const char *kw);
void * linphone_gtk_wait(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, const char *purpose, float progress);
gchar *linphone_gtk_get_display_name(const char *sip_uri);
void linphone_gtk_show_directory_search(void);

View file

@ -57,7 +57,7 @@ void linphone_gtk_show_login_frame(LinphoneProxyConfig *cfg){
GtkWidget *label=linphone_gtk_get_widget(mw,"login_label");
LinphoneAuthInfo *ai;
gchar *str;
osip_from_t *from;
LinphoneUri *from;
LinphoneCore *lc=linphone_gtk_get_core();
int nettype;
@ -84,18 +84,17 @@ void linphone_gtk_show_login_frame(LinphoneProxyConfig *cfg){
g_object_set_data(G_OBJECT(mw),"login_proxy_config",cfg);
g_free(str);
osip_from_init(&from);
osip_from_parse(from,linphone_proxy_config_get_identity(cfg));
from=linphone_uri_new(linphone_proxy_config_get_identity(cfg));
ai=linphone_core_find_auth_info(lc,linphone_proxy_config_get_domain(cfg),from->url->username);
ai=linphone_core_find_auth_info(lc,linphone_proxy_config_get_domain(cfg),linphone_uri_get_username(from));
/*display the last entered username, if not '?????'*/
if (from->url->username[0]!='?')
if (linphone_uri_get_username(from)[0]!='?')
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(mw,"login_username")),
from->url->username);
linphone_uri_get_username(from));
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(mw,"login_password")),
ai!=NULL ? ai->passwd : "");
osip_from_free(from);
linphone_uri_destroy(from);
}
void linphone_gtk_exit_login_frame(void){
@ -130,7 +129,7 @@ void linphone_gtk_login_frame_connect_clicked(GtkWidget *button){
char *identity;
gboolean autologin;
LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)g_object_get_data(G_OBJECT(mw),"login_proxy_config");
osip_from_t *from;
LinphoneUri *from;
SipSetupContext *ssctx=linphone_proxy_config_get_sip_setup_context(cfg);
username=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(mw,"login_username")));
@ -142,12 +141,9 @@ void linphone_gtk_login_frame_connect_clicked(GtkWidget *button){
autologin=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(mw,"automatic_login")));
linphone_gtk_set_ui_config_int("automatic_login",autologin);
osip_from_init(&from);
osip_from_parse(from,linphone_proxy_config_get_identity(cfg));
osip_free(from->url->username);
from->url->username=osip_strdup(username);
osip_from_to_str(from,&identity);
osip_from_free(from);
from=linphone_uri_new(linphone_proxy_config_get_identity(cfg));
linphone_uri_set_username(from,username);
identity=linphone_uri_as_string(from);
do_login(ssctx,identity,password);
/*we need to refresh the identities since the proxy config may have changed.*/
linphone_gtk_load_identities();

View file

@ -371,10 +371,15 @@ static void set_video_window_decorations(GdkWindow *w){
if (!linphone_core_in_call(linphone_gtk_get_core())){
snprintf(video_title,sizeof(video_title),"%s video",title);
}else{
const char *uri=linphone_core_get_remote_uri(linphone_gtk_get_core());
gchar *display_name=linphone_gtk_get_display_name(uri);
snprintf(video_title,sizeof(video_title),"Call with %s",display_name);
g_free(display_name);
const LinphoneUri *uri=linphone_core_get_remote_uri(linphone_gtk_get_core());
char *display_name;
if (linphone_uri_get_display_name(uri)!=NULL)
display_name=ms_strdup(linphone_uri_get_display_name(uri));
else{
display_name=linphone_uri_as_string(uri);
}
snprintf(video_title,sizeof(video_title),_("Call with %s"),display_name);
ms_free(display_name);
}
gdk_window_set_title(w,video_title);
/*gdk_window_set_urgency_hint(w,TRUE);*/
@ -861,14 +866,17 @@ static void icon_popup_menu(GtkStatusIcon *status_icon, guint button, guint acti
void linphone_gtk_open_browser(const char *url){
/*in gtk 2.16, gtk_show_uri does not work...*/
/*gtk_show_uri(NULL,url,GDK_CURRENT_TIME,NULL);*/
#ifdef WIN32
ShellExecute(0,"open",url,NULL,NULL,1);
#ifndef WIN32
#if GTK_CHECK_VERSION(2,18,3)
gtk_show_uri(NULL,url,GDK_CURRENT_TIME,NULL);
#else
char cl[255];
snprintf(cl,sizeof(cl),"/usr/bin/x-www-browser %s",url);
g_spawn_command_line_async(cl,NULL);
#endif
#else /*WIN32*/
ShellExecute(0,"open",url,NULL,NULL,1);
#endif
}
void linphone_gtk_link_to_website(GtkWidget *item){

View file

@ -71,17 +71,19 @@ void linphone_gtk_update_my_contact(GtkWidget *w){
const char *username=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"username")));
const char *displayname=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"displayname")));
int port=linphone_core_get_sip_port(linphone_gtk_get_core());
osip_from_t *parsed=linphone_core_get_primary_contact_parsed(linphone_gtk_get_core());
LinphoneUri *parsed=linphone_core_get_primary_contact_parsed(linphone_gtk_get_core());
char *contact;
g_return_if_fail(parsed!=NULL);
if (username[0]=='\0') return;
if (port!=5060)
contact=g_strdup_printf("%s <sip:%s@%s:%i>",displayname,username,parsed->url->host,port);
else
contact=g_strdup_printf("%s <sip:%s@%s>",displayname,username,parsed->url->host);
linphone_uri_set_display_name(parsed,displayname);
linphone_uri_set_username(parsed,username);
linphone_uri_set_port_int(parsed,port);
contact=linphone_uri_as_string(parsed);
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"sip_address")),contact);
linphone_core_set_primary_contact(linphone_gtk_get_core(),contact);
g_free(contact);
ms_free(contact);
linphone_uri_destroy(parsed);
linphone_gtk_load_identities();
}
@ -703,7 +705,7 @@ void linphone_gtk_show_parameters(void){
LinphoneCore *lc=linphone_gtk_get_core();
const char **sound_devices=linphone_core_get_sound_devices(lc);
const char *tmp;
osip_from_t *contact;
LinphoneUri *contact;
LinphoneFirewallPolicy pol;
GtkWidget *codec_list=linphone_gtk_get_widget(pb,"codec_list");
int mtu;
@ -762,11 +764,12 @@ void linphone_gtk_show_parameters(void){
/* SIP CONFIG */
contact=linphone_core_get_primary_contact_parsed(lc);
if (contact){
if (contact->displayname)
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"displayname")),contact->displayname);
if (contact->url->username)
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"username")),contact->url->username);
if (linphone_uri_get_display_name(contact))
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"displayname")),linphone_uri_get_display_name(contact));
if (linphone_uri_get_username(contact))
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"username")),linphone_uri_get_username(contact));
}
linphone_uri_destroy(contact);
linphone_gtk_show_sip_accounts(pb);
/* CODECS CONFIG */
linphone_gtk_init_codec_list(GTK_TREE_VIEW(codec_list));

View file

@ -76,22 +76,6 @@ void *linphone_gtk_wait(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, co
return NULL;
}
gchar *linphone_gtk_get_display_name(const char *sip_uri){
osip_from_t *from;
gchar *ret=NULL;
if (strchr(sip_uri,'@')){
osip_from_init(&from);
if (osip_from_parse(from,sip_uri)==0){
if (from->displayname!=NULL && strlen(from->displayname)>0){
ret=g_strdup(from->displayname);
}
}
osip_from_free(from);
}
if (ret==NULL) ret=g_strdup(sip_uri);
return ret;
}
GdkPixbuf *_gdk_pixbuf_new_from_memory_at_scale(const void *data, gint len, gint w, gint h, gboolean preserve_ratio){
GInputStream *stream=g_memory_input_stream_new_from_data (data,len,NULL);
GError *error=NULL;