From 95e3f26dcaa784972338833208cbfee0abf78841 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 13 Dec 2013 10:22:28 +0100 Subject: [PATCH] implement manual mode refresher for generic subscribe --- coreapi/bellesip_sal/sal_op_events.c | 2 ++ coreapi/bellesip_sal/sal_op_impl.c | 6 ++++++ coreapi/callbacks.c | 2 ++ coreapi/event.c | 2 ++ coreapi/event.h | 5 +++-- coreapi/linphonecore.c | 2 ++ coreapi/linphonecore.h | 4 ++-- coreapi/misc.c | 5 +++++ include/sal/sal.h | 3 ++- tester/eventapi_tester.c | 30 ++++++++++++++++++++++------ tester/liblinphone_tester.h | 1 + 11 files changed, 51 insertions(+), 11 deletions(-) diff --git a/coreapi/bellesip_sal/sal_op_events.c b/coreapi/bellesip_sal/sal_op_events.c index 376a88bcd..1972c97f6 100644 --- a/coreapi/bellesip_sal/sal_op_events.c +++ b/coreapi/bellesip_sal/sal_op_events.c @@ -52,6 +52,8 @@ static void subscribe_refresher_listener (belle_sip_refresher_t* refresher if (status_code>=200){ sal_compute_sal_errors_from_code(status_code,&error,&sr); op->base.root->callbacks.subscribe_response(op,sss,error,sr); + }else if (status_code==0){ + op->base.root->callbacks.on_expire(op); } } diff --git a/coreapi/bellesip_sal/sal_op_impl.c b/coreapi/bellesip_sal/sal_op_impl.c index 49fa7c5f8..43e94227b 100644 --- a/coreapi/bellesip_sal/sal_op_impl.c +++ b/coreapi/bellesip_sal/sal_op_impl.c @@ -358,6 +358,9 @@ SalReason sal_reason_to_sip_code(SalReason r){ case SalReasonNotAcceptable: ret=488; break; + case SalReasonNoMatch: + ret=481; + break; } return ret; } @@ -391,6 +394,9 @@ void sal_compute_sal_errors_from_code(int code ,SalError* sal_err,SalReason* sal *sal_err=SalErrorFailure; *sal_reason=SalReasonTemporarilyUnavailable; break; + case 481: + *sal_err=SalErrorFailure; + *sal_reason=SalReasonNoMatch; case 486: *sal_err=SalErrorFailure; *sal_reason=SalReasonBusy; diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index da674aac6..e1a32f56c 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -1108,6 +1108,8 @@ static void on_expire(SalOp *op){ if (linphone_event_get_publish_state(lev)==LinphonePublishOk){ linphone_event_set_publish_state(lev,LinphonePublishExpiring); + }else if (linphone_event_get_subscription_state(lev)==LinphoneSubscriptionActive){ + linphone_event_set_state(lev,LinphoneSubscriptionExpiring); } } diff --git a/coreapi/event.c b/coreapi/event.c index 46de6b779..fe710e677 100644 --- a/coreapi/event.c +++ b/coreapi/event.c @@ -40,6 +40,7 @@ const char *linphone_subscription_state_to_string(LinphoneSubscriptionState stat case LinphoneSubscriptionActive: return "LinphoneSubscriptionActive"; case LinphoneSubscriptionTerminated: return "LinphoneSubscriptionTerminated"; case LinphoneSubscriptionError: return "LinphoneSubscriptionError"; + case LinphoneSubscriptionExpiring: return "LinphoneSubscriptionExpiring"; } return NULL; } @@ -124,6 +125,7 @@ LinphoneEvent *linphone_core_subscribe(LinphoneCore *lc, const LinphoneAddress * LinphoneEvent *lev=linphone_event_new(lc, LinphoneSubscriptionOutgoing, event); SalBody salbody; linphone_configure_op(lc,lev->op,resource,NULL,TRUE); + sal_op_set_manual_refresher_mode(lev->op,lp_config_get_int(lc->config,"sip","refresh_generic_subscribe",1)); lev->resource_addr=linphone_address_clone(resource); lev->from=linphone_address_clone((LinphoneAddress*)sal_op_get_from_address(lev->op)); sal_subscribe(lev->op,NULL,NULL,event,expires,sal_body_from_content(&salbody,body)); diff --git a/coreapi/event.h b/coreapi/event.h index 9acb94b2d..d3f869d68 100644 --- a/coreapi/event.h +++ b/coreapi/event.h @@ -57,7 +57,8 @@ enum _LinphoneSubscriptionState{ LinphoneSubscriptionPending, /**refresh_generic_subscribe property is set to 0.*/ }; /** @@ -72,7 +73,7 @@ LINPHONE_PUBLIC const char *linphone_subscription_state_to_string(LinphoneSubscr **/ enum _LinphonePublishState{ LinphonePublishNone, /**< Initial state, do not use**/ - LinphonePublishProgress, /**refresh_generic_publish property is set to 0.*/ diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 5698d2272..511178c4c 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -5916,6 +5916,8 @@ const char *linphone_reason_to_string(LinphoneReason err){ return "Unauthorized"; case LinphoneReasonNotAcceptable: return "Not acceptable here"; + case LinphoneReasonNoMatch: + return "No match"; } return "unknown error"; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 88e933e32..d083b07c8 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -165,8 +165,8 @@ enum _LinphoneReason{ LinphoneReasonIOError, /**number_of_LinphoneSubscriptionError++; mgr->lev=NULL; break; + case LinphoneSubscriptionExpiring: + counters->number_of_LinphoneSubscriptionExpiring++; + mgr->lev=NULL; + break; } } @@ -119,13 +123,18 @@ static void subscribe_test_declined(void) { linphone_core_manager_destroy(pauline); } +typedef enum RefreshTestType{ + NoRefresh, + AutoRefresh, + ManualRefresh +}RefreshTestType; -static void subscribe_test_with_args(bool_t terminated_by_subscriber, bool_t test_refreshing) { +static void subscribe_test_with_args(bool_t terminated_by_subscriber, RefreshTestType refresh_type) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); LinphoneContent content={0}; LinphoneEvent *lev; - int expires= test_refreshing ? 4 : 600; + int expires= refresh_type!=NoRefresh ? 4 : 600; MSList* lcs=ms_list_append(NULL,marie->lc); @@ -147,9 +156,13 @@ static void subscribe_test_with_args(bool_t terminated_by_subscriber, bool_t tes /*make sure marie receives first notification before terminating*/ CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000)); - if (test_refreshing){ + if (refresh_type==AutoRefresh){ wait_for_list(lcs,NULL,0,6000); CU_ASSERT_TRUE(linphone_event_get_subscription_state(pauline->lev)==LinphoneSubscriptionActive); + }else if (refresh_type==ManualRefresh){ + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionExpiring,1,4000)); + linphone_event_update_subscribe(lev,NULL); + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,1,2000)); } if (terminated_by_subscriber){ @@ -167,18 +180,22 @@ static void subscribe_test_with_args(bool_t terminated_by_subscriber, bool_t tes } static void subscribe_test_terminated_by_subscriber(void){ - subscribe_test_with_args(TRUE,FALSE); + subscribe_test_with_args(TRUE,NoRefresh); } static void subscribe_test_terminated_by_notifier(void){ - subscribe_test_with_args(FALSE,FALSE); + subscribe_test_with_args(FALSE,NoRefresh); } /* Caution: this test does not really check that the subscribe are refreshed, because the core is not managing the expiration of * unrefreshed subscribe dialogs. So it is just checking that it is not crashing. */ static void subscribe_test_refreshed(void){ - subscribe_test_with_args(TRUE,TRUE); + subscribe_test_with_args(TRUE,AutoRefresh); +} + +static void subscribe_test_manually_refreshed(void){ + subscribe_test_with_args(TRUE,ManualRefresh); } static void publish_test_with_args(bool_t refresh){ @@ -234,6 +251,7 @@ test_t event_tests[] = { { "Subscribe declined" , subscribe_test_declined }, { "Subscribe terminated by subscriber", subscribe_test_terminated_by_subscriber }, { "Subscribe refreshed", subscribe_test_refreshed }, + { "Subscribe manually refreshed", subscribe_test_manually_refreshed }, { "Subscribe terminated by notifier", subscribe_test_terminated_by_notifier }, { "Publish", publish_test }, { "Publish without automatic refresh",publish_no_auto_test } diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index ae1fe453d..2a8e33af0 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -163,6 +163,7 @@ typedef struct _stats { int number_of_LinphoneSubscriptionActive; int number_of_LinphoneSubscriptionTerminated; int number_of_LinphoneSubscriptionError; + int number_of_LinphoneSubscriptionExpiring; int number_of_LinphonePublishProgress; int number_of_LinphonePublishOk;