diff --git a/coreapi/friend.c b/coreapi/friend.c index 68f43e659..d5377952d 100644 --- a/coreapi/friend.c +++ b/coreapi/friend.c @@ -152,6 +152,7 @@ void __linphone_friend_do_subscribe(LinphoneFriend *fr){ fr->outsub=sal_op_new(fr->lc->sal); sal_op_set_route(fr->outsub,route); sal_subscribe_presence(fr->outsub,from,friend); + fr->subscribe_active=TRUE; ms_free(friend); } @@ -296,6 +297,7 @@ static void linphone_friend_unsubscribe(LinphoneFriend *lf){ sal_unsubscribe(lf->outsub); sal_op_release(lf->outsub); lf->outsub=NULL; + lf->subscribe_active=FALSE; } } @@ -362,8 +364,8 @@ void linphone_friend_apply(LinphoneFriend *fr, LinphoneCore *lc){ } fr->inc_subscribe_pending=FALSE; } - if (fr->subscribe && fr->outsub==NULL){ - + if (fr->subscribe && fr->subscribe_active==FALSE){ + ms_message("Sending a new SUBSCRIBE"); __linphone_friend_do_subscribe(fr); } ms_message("linphone_friend_apply() done."); diff --git a/coreapi/presence.c b/coreapi/presence.c index 0ff498ff7..aa3c17bd2 100644 --- a/coreapi/presence.c +++ b/coreapi/presence.c @@ -128,6 +128,7 @@ void linphone_notify_recv(LinphoneCore *lc, SalOp *op, SalSubscribeState ss, Sal friend=lf->uri; tmp=linphone_address_as_string(friend); lf->status=estatus; + lf->subscribe_active=TRUE; lc->vtable.notify_recv(lc,(LinphoneFriend*)lf); ms_free(tmp); }else{ @@ -135,8 +136,10 @@ void linphone_notify_recv(LinphoneCore *lc, SalOp *op, SalSubscribeState ss, Sal } if (ss==SalSubscribeTerminated){ sal_op_release(op); - if (lf) + if (lf){ lf->outsub=NULL; + lf->subscribe_active=FALSE; + } } } diff --git a/coreapi/private.h b/coreapi/private.h index a3f2155f6..133fd1dcc 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -237,6 +237,7 @@ struct _LinphoneFriend{ BuddyInfo *info; char *refkey; bool_t subscribe; + bool_t subscribe_active; bool_t inc_subscribe_pending; }; diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 5f337b3fa..8fa1ec016 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1305,9 +1305,13 @@ static bool_t process_event(Sal *sal, eXosip_event_t *ev){ } break; case EXOSIP_IN_SUBSCRIPTION_NEW: - ms_message("CALL_SUBSCRIPTION_NEW "); + ms_message("CALL_IN_SUBSCRIPTION_NEW "); sal_exosip_subscription_recv(sal,ev); break; + case EXOSIP_IN_SUBSCRIPTION_RELEASED: + ms_message("CALL_SUBSCRIPTION_NEW "); + sal_exosip_in_subscription_closed(sal,ev); + break; case EXOSIP_SUBSCRIPTION_UPDATE: ms_message("CALL_SUBSCRIPTION_UPDATE"); break; @@ -1323,6 +1327,14 @@ static bool_t process_event(Sal *sal, eXosip_event_t *ev){ ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n"); sal_exosip_subscription_closed(sal,ev); break; + case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */ + if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){ + return process_authentication(sal,ev); + } + case EXOSIP_SUBSCRIPTION_SERVERFAILURE: + case EXOSIP_SUBSCRIPTION_GLOBALFAILURE: + sal_exosip_subscription_closed(sal,ev); + break; case EXOSIP_CALL_RELEASED: ms_message("CALL_RELEASED\n"); call_released(sal, ev); @@ -1351,7 +1363,7 @@ static bool_t process_event(Sal *sal, eXosip_event_t *ev){ } break; default: - ms_message("Unhandled exosip event ! %i"); + ms_message("Unhandled exosip event ! %i",ev->type); break; } return TRUE; diff --git a/coreapi/sal_eXosip2.h b/coreapi/sal_eXosip2.h index 6539dcae8..93def2d6f 100644 --- a/coreapi/sal_eXosip2.h +++ b/coreapi/sal_eXosip2.h @@ -67,6 +67,8 @@ void sal_exosip_subscription_answered(Sal *sal,eXosip_event_t *ev); void sal_exosip_notify_recv(Sal *sal,eXosip_event_t *ev); void sal_exosip_subscription_closed(Sal *sal,eXosip_event_t *ev); +void sal_exosip_in_subscription_closed(Sal *sal, eXosip_event_t *ev); + void sal_exosip_fix_route(SalOp *op); diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index 760d8fd8d..8b17dfea6 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -416,7 +416,7 @@ int sal_notify_presence(SalOp *op, SalPresenceStatus status, const char *status_ } int sal_notify_close(SalOp *op){ - osip_message_t *msg; + osip_message_t *msg=NULL; eXosip_lock(); eXosip_insubscription_build_notify(op->did,EXOSIP_SUBCRSTATE_TERMINATED,DEACTIVATED,&msg); if (msg!=NULL){ @@ -424,7 +424,8 @@ int sal_notify_close(SalOp *op){ if (identity==NULL) identity=sal_op_get_to(op); osip_message_set_contact(msg,identity); eXosip_insubscription_send_request(op->did,msg); - }else ms_error("sal_notify_close(): could not create notify for incoming subscription."); + }else ms_error("sal_notify_close(): could not create notify for incoming subscription" + " did=%i, nid=%i",op->did,op->nid); eXosip_unlock(); return 0; } @@ -661,15 +662,35 @@ void sal_exosip_subscription_answered(Sal *sal,eXosip_event_t *ev){ op->did=ev->did; } +void sal_exosip_in_subscription_closed(Sal *sal, eXosip_event_t *ev){ + SalOp *op=sal_find_in_subscribe(sal,ev->nid); + char *tmp; + if (op==NULL){ + ms_error("Incoming subscription closed but no associated op !"); + return; + } + + + sal_remove_in_subscribe(sal,op); + op->nid=-1; + op->did=-1; + if (ev->request){ + osip_from_to_str(ev->request->from,&tmp); + sal->callbacks.subscribe_closed(op,tmp); + osip_free(tmp); + } +} + void sal_exosip_subscription_closed(Sal *sal,eXosip_event_t *ev){ - SalOp *op=sal_find_in_subscribe(sal,ev->sid); + SalOp *op=sal_find_out_subscribe(sal,ev->sid); if (op==NULL){ ms_error("Subscription closed but no associated op !"); return; } - sal_remove_in_subscribe(sal,op); - op->nid=-1; + sal_remove_out_subscribe(sal,op); + op->sid=-1; op->did=-1; + sal->callbacks.notify(op,SalSubscribeTerminated, SalPresenceOffline,NULL); }