From c413a81e39547c2a3e0705e1072bb50a54dd7050 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 13 Sep 2013 16:10:34 +0200 Subject: [PATCH] bugfixes in Event api when refreshing subscribes fix test suite --- coreapi/bellesip_sal/sal_impl.h | 1 + coreapi/bellesip_sal/sal_op_events.c | 50 ++++++++++------------------ coreapi/bellesip_sal/sal_op_impl.c | 1 + coreapi/callbacks.c | 3 +- tester/eventapi_tester.c | 4 +-- 5 files changed, 24 insertions(+), 35 deletions(-) diff --git a/coreapi/bellesip_sal/sal_impl.h b/coreapi/bellesip_sal/sal_impl.h index d99235c4f..befbb3fda 100644 --- a/coreapi/bellesip_sal/sal_impl.h +++ b/coreapi/bellesip_sal/sal_impl.h @@ -92,6 +92,7 @@ struct SalOp{ int ref; SalOpType type; SalPrivacyMask privacy; + belle_sip_header_t *event; /*used by SalOpSubscribe kinds*/ bool_t auto_answer_asked; bool_t sdp_offering; bool_t call_released; diff --git a/coreapi/bellesip_sal/sal_op_events.c b/coreapi/bellesip_sal/sal_op_events.c index cf67c992d..b43e3d579 100644 --- a/coreapi/bellesip_sal/sal_op_events.c +++ b/coreapi/bellesip_sal/sal_op_events.c @@ -147,15 +147,19 @@ static void subscribe_process_request_event(void *op_base, const belle_sip_reque op->pending_server_trans=server_transaction; event_header=belle_sip_message_get_header((belle_sip_message_t*)req,"Event"); - eventname=belle_sip_header_get_unparsed_value(event_header); sal_op_get_body(op,(belle_sip_message_t*)req,&body); - if (eventname==NULL){ + if (event_header==NULL){ ms_warning("No event header in incoming SUBSCRIBE."); resp=sal_op_create_response_from_request(op,req,400); belle_sip_server_transaction_send_response(server_transaction,resp); return; } + if (op->event==NULL) { + op->event=event_header; + belle_sip_object_ref(op->event); + } + eventname=belle_sip_header_get_unparsed_value(event_header); if (!op->dialog) { if (strcmp(method,"SUBSCRIBE")==0){ @@ -210,26 +214,6 @@ void sal_op_subscribe_fill_cbs(SalOp*op) { op->type=SalOpSubscribe; } -static int set_event_name(SalOp *op, belle_sip_message_t *msg){ - belle_sip_transaction_t *last_transaction; - belle_sip_request_t *req; - belle_sip_header_t *event; - - if (!op->dialog) return -1; - - last_transaction=belle_sip_dialog_get_last_transaction(op->dialog); - - if (!last_transaction) return -1; - - req=belle_sip_transaction_get_request(last_transaction); - event=belle_sip_message_get_header((belle_sip_message_t*)req,"Event"); - if (!event){ - ms_error("No event header in last request."); - return -1; - } - belle_sip_message_add_header(msg,event); - return 0; -} int sal_subscribe(SalOp *op, const char *from, const char *to, const char *eventname, int expires, const SalBody *body){ belle_sip_request_t *req=NULL; @@ -243,20 +227,25 @@ int sal_subscribe(SalOp *op, const char *from, const char *to, const char *event sal_op_subscribe_fill_cbs(op); /*???sal_exosip_fix_route(op); make sure to ha ;lr*/ req=sal_op_build_request(op,"SUBSCRIBE"); - belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),belle_sip_header_create("Event",eventname)); + if (eventname){ + if (op->event) belle_sip_object_unref(op->event); + op->event=belle_sip_header_create("Event",eventname); + belle_sip_object_ref(op->event); + } + belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),op->event); }else{ - belle_sip_transaction_t *last=belle_sip_dialog_get_last_transaction(op->dialog); - belle_sip_message_t *msg=BELLE_SIP_MESSAGE(belle_sip_transaction_get_request(last)); req=belle_sip_dialog_create_request(op->dialog,"SUBSCRIBE"); if (!req) { ms_error("Cannot create subscribe refresh."); return -1; } if (expires==-1){ + belle_sip_transaction_t *last=(belle_sip_transaction_t*)op->pending_client_trans; + belle_sip_message_t *msg=BELLE_SIP_MESSAGE(belle_sip_transaction_get_request(last)); belle_sip_header_expires_t *eh=belle_sip_message_get_header_by_type(msg,belle_sip_header_expires_t); expires=belle_sip_header_expires_get_expires(eh); } - set_event_name(op,(belle_sip_message_t*)req); + belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),op->event); } belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_HEADER(belle_sip_header_expires_create(expires))); sal_op_add_body(op,(belle_sip_message_t*)req,body); @@ -271,7 +260,7 @@ int sal_unsubscribe(SalOp *op){ } if (op->refresher) belle_sip_refresher_stop(op->refresher); - set_event_name(op,(belle_sip_message_t*)req); + belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),op->event); belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_HEADER(belle_sip_header_expires_create(0))); return sal_op_send_request(op,req); } @@ -299,10 +288,7 @@ int sal_notify(SalOp *op, const SalBody *body){ if (!(notify=belle_sip_dialog_create_queued_request(op->dialog,"NOTIFY"))) return -1; - if (set_event_name(op,(belle_sip_message_t*)notify)==-1){ - belle_sip_object_unref(notify); - return -1; - } + if (op->event) belle_sip_message_add_header(BELLE_SIP_MESSAGE(notify),op->event); belle_sip_message_add_header(BELLE_SIP_MESSAGE(notify) ,BELLE_SIP_HEADER(belle_sip_header_subscription_state_create(BELLE_SIP_SUBSCRIPTION_STATE_ACTIVE,600))); @@ -315,7 +301,7 @@ int sal_notify_close(SalOp *op){ belle_sip_request_t* notify; if (!op->dialog) return -1; if (!(notify=belle_sip_dialog_create_queued_request(op->dialog,"NOTIFY"))) return -1; - set_event_name(op,(belle_sip_message_t*)notify); + if (op->event) belle_sip_message_add_header(BELLE_SIP_MESSAGE(notify),op->event); belle_sip_message_add_header(BELLE_SIP_MESSAGE(notify) ,BELLE_SIP_HEADER(belle_sip_header_subscription_state_create(BELLE_SIP_SUBSCRIPTION_STATE_TERMINATED,-1))); return sal_op_send_request(op,notify); diff --git a/coreapi/bellesip_sal/sal_op_impl.c b/coreapi/bellesip_sal/sal_op_impl.c index b3e6dc12e..e31ec7a4d 100644 --- a/coreapi/bellesip_sal/sal_op_impl.c +++ b/coreapi/bellesip_sal/sal_op_impl.c @@ -59,6 +59,7 @@ void sal_op_release_impl(SalOp *op){ if (op->pending_client_trans) belle_sip_object_unref(op->pending_client_trans); if (op->pending_server_trans) belle_sip_object_unref(op->pending_server_trans); + if (op->event) belle_sip_object_unref(op->event); __sal_op_free(op); return ; } diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 6d0083ea0..e6f194532 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -1059,7 +1059,8 @@ static void notify(SalOp *op, SalSubscribeStatus st, const char *eventname, cons lev=linphone_event_new_with_op(lc,op,LinphoneSubscriptionOutgoing,eventname); } if (lc->vtable.notify_received){ - lc->vtable.notify_received(lc,lev,eventname,linphone_content_from_sal_body(&content,body)); + const LinphoneContent *ct=linphone_content_from_sal_body(&content,body); + if (ct) lc->vtable.notify_received(lc,lev,eventname,ct); } if (st!=SalSubscribeNone){ linphone_event_set_state(lev,linphone_subscription_state_from_sal(st)); diff --git a/tester/eventapi_tester.c b/tester/eventapi_tester.c index cc7a6905b..563f856a4 100644 --- a/tester/eventapi_tester.c +++ b/tester/eventapi_tester.c @@ -126,8 +126,8 @@ static void subscribe_test_with_args(bool_t terminated_by_subscriber) { CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,1,1000)); CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionActive,1,1000)); - /*make sure marie receives first notification before terminating - CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000));*/ + /*make sure marie receives first notification before terminating*/ + CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,1000)); if (terminated_by_subscriber){ linphone_event_terminate(lev);