return str;
}
-static int friend_data_compare(const void * a, const void * b, void * data){
+static int friend_compare(const void * a, const void * b){
LinphoneAddress *fa=((LinphoneFriend*)a)->uri;
LinphoneAddress *fb=((LinphoneFriend*)b)->uri;
- const char *ua,*ub;
- ua=linphone_address_get_username(fa);
- ub=linphone_address_get_username(fb);
- if (ua!=NULL && ub!=NULL) {
- //printf("Comparing usernames %s,%s\n",ua,ub);
- return strcasecmp(ua,ub);
- }
- else {
- /* compare hosts*/
- ua=linphone_address_get_domain(fa);
- ub=linphone_address_get_domain(fb);
- if (ua!=NULL && ub!=NULL){
- int ret=strcasecmp(ua,ub);
- //printf("Comparing hostnames %s,%s,res=%i\n",ua,ub,ret);
- return ret;
- }
- else return -1;
- }
-}
-
-static int friend_compare(const void * a, const void * b){
- return friend_data_compare(a,b,NULL);
+ if (linphone_address_weak_equal (fa,fb)) return 0;
+ return 1;
}
}
LinphoneFriend *linphone_friend_new_with_addr(const char *addr){
+ LinphoneAddress* linphone_address = linphone_address_new(addr);
+ if (linphone_address == NULL) {
+ ms_error("Cannot create friend for address [%s]",addr?addr:"null");
+ return NULL;
+ }
LinphoneFriend *fr=linphone_friend_new();
- if (linphone_friend_set_sip_addr(fr,addr)<0){
+ if (linphone_friend_set_addr(fr,linphone_address)<0){
linphone_friend_destroy(fr);
return NULL;
}
/*try adding domain part from default current proxy*/
LinphoneAddress * id=linphone_address_new(linphone_core_get_identity(lc));
if (id!=NULL){
+ linphone_address_set_display_name(id,NULL);
linphone_address_set_username(id,uri);
*result=linphone_address_as_string(id);
linphone_address_destroy(id);
linphone_address_destroy(fr);
}
-int linphone_friend_set_sip_addr(LinphoneFriend *lf, const char *addr){
- LinphoneAddress *fr=linphone_address_new(addr);
- if (fr==NULL) {
- ms_warning("Invalid friend sip uri: %s",addr);
- return -1;
- }
+int linphone_friend_set_addr(LinphoneFriend *lf, const LinphoneAddress *addr){
+ LinphoneAddress *fr=linphone_address_clone(addr);
linphone_address_clean(fr);
if (lf->uri!=NULL) linphone_address_destroy(lf->uri);
lf->uri=fr;
}
void linphone_friend_notify(LinphoneFriend *lf, LinphoneOnlineStatus os){
- //printf("Wish to notify %p, lf->nid=%i\n",lf,lf->nid);
+ char *addr=linphone_address_as_string(linphone_friend_get_address(lf));
+ ms_message("Want to notify %s, insub=%p",addr,lf->insub);
+ ms_free(addr);
if (lf->insub!=NULL){
sal_notify_presence(lf->insub,linphone_online_status_to_sal(os),NULL);
}
static void linphone_friend_unsubscribe(LinphoneFriend *lf){
if (lf->outsub!=NULL) {
sal_unsubscribe(lf->outsub);
- sal_op_release(lf->outsub);
- lf->outsub=NULL;
lf->subscribe_active=FALSE;
}
}
linphone_friend_unsubscribe(lf);
if (lf->insub){
sal_notify_close(lf->insub);
- sal_op_release(lf->insub);
- lf->insub=NULL;
+
}
}
void linphone_friend_destroy(LinphoneFriend *lf){
-
+ if (lf->insub) {
+ sal_op_release(lf->insub);
+ lf->insub=NULL;
+ }
+ if (lf->outsub){
+ sal_op_release(lf->outsub);
+ lf->outsub=NULL;
+ }
if (lf->uri!=NULL) linphone_address_destroy(lf->uri);
if (lf->info!=NULL) buddy_info_free(lf->info);
ms_free(lf);
void linphone_core_remove_friend(LinphoneCore *lc, LinphoneFriend* fl){
MSList *el=ms_list_find(lc->friends,(void *)fl);
if (el!=NULL){
- lc->friends=ms_list_remove_link(lc->friends,el);
linphone_friend_destroy((LinphoneFriend*)el->data);
+ lc->friends=ms_list_remove_link(lc->friends,el);
linphone_core_write_friends_config(lc);
}
}
LinphoneFriend *linphone_core_get_friend_by_address(const LinphoneCore *lc, const char *uri){
LinphoneAddress *puri=linphone_address_new(uri);
const MSList *elem;
- const char *username=linphone_address_get_username(puri);
- const char *domain=linphone_address_get_domain(puri);
+ const char *username;
+ const char *domain;
LinphoneFriend *lf=NULL;
if (puri==NULL){
return NULL;
}
+ username=linphone_address_get_username(puri);
+ domain=linphone_address_get_domain(puri);
+ if (domain==NULL) {
+ linphone_address_destroy(puri);
+ return NULL;
+ }
for(elem=lc->friends;elem!=NULL;elem=ms_list_next(elem)){
lf=(LinphoneFriend*)elem->data;
const char *it_username=linphone_address_get_username(lf->uri);