]> sjero.net Git - linphone/commitdiff
take in account closed incoming subscriptions
authorSimon Morlat <simon.morlat@linphone.org>
Tue, 16 Mar 2010 14:49:58 +0000 (15:49 +0100)
committerSimon Morlat <simon.morlat@linphone.org>
Tue, 16 Mar 2010 14:49:58 +0000 (15:49 +0100)
coreapi/friend.c
coreapi/presence.c
coreapi/private.h
coreapi/sal_eXosip2.c
coreapi/sal_eXosip2.h
coreapi/sal_eXosip2_presence.c

index 68f43e65946af9057bca02f6bec4c95ff8b42e06..047749e322d02ef35f136fcba5070131dabc8d69 100644 (file)
@@ -296,6 +296,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,7 +363,7 @@ 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){
                
                __linphone_friend_do_subscribe(fr);
        }
index 0ff498ff7a830d7a2f28fab754a80d0e8fb86039..aa3c17bd20f158524464a7bc5d923f3aea02b827 100644 (file)
@@ -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;
+               }
        }
 }
 
index 4125936ffe4e1da5cf0eb34c696182e70cdf74d1..fcaddfb677a88bc9de2044627f6eb79d9d9c7952 100644 (file)
@@ -236,6 +236,7 @@ struct _LinphoneFriend{
        BuddyInfo *info;
        char *refkey;
        bool_t subscribe;
+       bool_t subscribe_active;
        bool_t inc_subscribe_pending;
 };     
 
index 5f337b3fa0b468dcb3d0d25a7d92e2cfc7dc235a..17eb3c0042a6ac12bc558ebdcdef407a8370ee35 100644 (file)
@@ -1308,6 +1308,10 @@ static bool_t process_event(Sal *sal, eXosip_event_t *ev){
                        ms_message("CALL_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;
index 6539dcae895684106a4c1571d8f48baaf92c4766..93def2d6f3748c7d039af6d481ac4dba68384d8e 100644 (file)
@@ -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);
 
 
index 760d8fd8d41609ba4d08d5d2e3a6e6ce48417f2f..03aef7821d767620f5e9b2314ce455f9a7b6f5f2 100644 (file)
@@ -661,15 +661,33 @@ void sal_exosip_subscription_answered(Sal *sal,eXosip_event_t *ev){
        op->did=ev->did;
 }
 
-void sal_exosip_subscription_closed(Sal *sal,eXosip_event_t *ev){
-       SalOp *op=sal_find_in_subscribe(sal,ev->sid);
+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("Subscription closed but no associated op !");
+               ms_error("Incoming subscription closed but no associated op !");
                return;
        }
+       if (ev->request){
+               osip_from_to_str(ev->request->from,&tmp);
+               sal->callbacks.subscribe_closed(op,tmp);
+               osip_free(tmp);
+       }
+       
        sal_remove_in_subscribe(sal,op);
        op->nid=-1;
        op->did=-1;
 }
 
+void sal_exosip_subscription_closed(Sal *sal,eXosip_event_t *ev){
+       SalOp *op=sal_find_out_subscribe(sal,ev->sid);
+       if (op==NULL){
+               ms_error("Subscription closed but no associated op !");
+               return;
+       }
+       sal_remove_out_subscribe(sal,op);
+       op->sid=-1;
+       op->did=-1;
+}
+