Allow the application to enabel/disable 100rel\nAllow forking/out-of-order NOTIFY requets

This commit is contained in:
bossiel 2011-06-23 17:13:16 +00:00
parent c110ed05b4
commit 23ed807ada
16 changed files with 182 additions and 125 deletions

View File

@ -216,6 +216,12 @@ int32_t MediaSessionMgr::defaultsGetNoiseSuppLevel()
return tmedia_defaults_get_noise_supp_level();
}
bool MediaSessionMgr::defaultsSet100relEnabled(bool _100rel_enabled){
return tmedia_defaults_set_100rel_enabled(_100rel_enabled ? tsk_true : tsk_false) == 0;
}
bool MediaSessionMgr::defaultsGet100relEnabled(){
return tmedia_defaults_get_100rel_enabled();
}

View File

@ -72,6 +72,8 @@ public:
static bool defaultsGetNoiseSuppEnabled();
static bool defaultsSetNoiseSuppLevel(int32_t noise_supp_level);
static int32_t defaultsGetNoiseSuppLevel();
static bool defaultsSet100relEnabled(bool _100rel_enabled);
static bool defaultsGet100relEnabled();
private:

View File

@ -51,6 +51,8 @@ TINYMEDIA_API int tmedia_defaults_set_noise_supp_enabled(tsk_bool_t noise_supp_e
TINYMEDIA_API tsk_bool_t tmedia_defaults_get_noise_supp_enabled();
TINYMEDIA_API int tmedia_defaults_set_noise_supp_level(int32_t noise_supp_level);
TINYMEDIA_API int32_t tmedia_defaults_get_noise_supp_level();
TINYMEDIA_API int tmedia_defaults_set_100rel_enabled(tsk_bool_t _100rel_enabled);
TINYMEDIA_API tsk_bool_t tmedia_defaults_get_100rel_enabled();
TMEDIA_END_DECLS

View File

@ -51,6 +51,7 @@ static float __agc_level = 8000.0f;
static tsk_bool_t __vad_enabled = tsk_false;
static tsk_bool_t __noise_supp_enabled = tsk_true;
static int32_t __noise_supp_level = -30;
static tsk_bool_t __100rel_enabled = tsk_true;
int tmedia_defaults_set_echo_tail(uint32_t echo_tail)
{
@ -129,5 +130,11 @@ int32_t tmedia_defaults_get_noise_supp_level()
return __noise_supp_level;
}
int tmedia_defaults_set_100rel_enabled(tsk_bool_t _100rel_enabled){
return __100rel_enabled = _100rel_enabled;
}
tsk_bool_t tmedia_defaults_get_100rel_enabled(){
return __100rel_enabled;
}

View File

@ -998,7 +998,7 @@ int tsip_dialog_init(tsip_dialog_t *self, tsip_dialog_type_t type, const char* c
self->challenges = tsk_list_create();
}
/* Sets default expires value. */
/* Sets some defalt values */
self->expires = TSIP_SSESSION_EXPIRES_DEFAULT;
if(call_id){

View File

@ -47,6 +47,8 @@
#include "tinysdp/parsers/tsdp_parser_message.h"
#import "tinymedia/tmedia_defaults.h"
#include "tsk_debug.h"
// http://cdnet.stpi.org.tw/techroom/market/_pdf/2009/eetelecomm_09_009_OneVoiceProfile.pdf
@ -75,14 +77,14 @@
*/
/* ======================== internal functions ======================== */
int send_INVITEorUPDATE(tsip_dialog_invite_t *self, tsk_bool_t is_INVITE, tsk_bool_t force_sdp);
int send_PRACK(tsip_dialog_invite_t *self, const tsip_response_t* r1xx);
int send_ACK(tsip_dialog_invite_t *self, const tsip_response_t* r2xxINVITE);
int send_RESPONSE(tsip_dialog_invite_t *self, const tsip_request_t* request, short code, const char* phrase, tsk_bool_t force_sdp);
int send_ERROR(tsip_dialog_invite_t* self, const tsip_request_t* request, short code, const char* phrase, const char* reason);
int send_BYE(tsip_dialog_invite_t *self);
int send_CANCEL(tsip_dialog_invite_t *self);
int tsip_dialog_invite_OnTerminated(tsip_dialog_invite_t *self);
/*static*/ int send_INVITEorUPDATE(tsip_dialog_invite_t *self, tsk_bool_t is_INVITE, tsk_bool_t force_sdp);
/*static*/ int send_PRACK(tsip_dialog_invite_t *self, const tsip_response_t* r1xx);
/*static*/ int send_ACK(tsip_dialog_invite_t *self, const tsip_response_t* r2xxINVITE);
/*static*/ int send_RESPONSE(tsip_dialog_invite_t *self, const tsip_request_t* request, short code, const char* phrase, tsk_bool_t force_sdp);
/*static*/ int send_ERROR(tsip_dialog_invite_t* self, const tsip_request_t* request, short code, const char* phrase, const char* reason);
/*static*/ int send_BYE(tsip_dialog_invite_t *self);
/*static*/ int send_CANCEL(tsip_dialog_invite_t *self);
static int tsip_dialog_invite_OnTerminated(tsip_dialog_invite_t *self);
/* ======================== external functions ======================== */
extern int tsip_dialog_invite_stimers_cancel(tsip_dialog_invite_t* self);
@ -707,8 +709,9 @@ int x0000_Any_2_Any_X_i1xx(va_list *app)
/* Send Error */
return ret;
}
if((ret = send_PRACK(self, r1xx))){
// don't send PRACK if 100rel is only inside "supported" header
if(tsip_message_required(r1xx, "100rel") && (ret = send_PRACK(self, r1xx))){
return ret;
}
}
@ -1315,6 +1318,10 @@ static tsk_object_t* tsip_dialog_invite_ctor(tsk_object_t * self, va_list * app)
TSIP_DIALOG_GET_FSM(dialog)->debug = DEBUG_STATE_MACHINE;
tsk_fsm_set_callback_terminated(TSIP_DIALOG_GET_FSM(dialog), TSK_FSM_ONTERMINATED_F(tsip_dialog_invite_OnTerminated), (const void*)dialog);
/* default values */
dialog->supported._100rel = tmedia_defaults_get_100rel_enabled();
// ... do the same for preconditions, replaces, ....
/* Initialize the class itself */
tsip_dialog_invite_init(self);
}

View File

@ -51,11 +51,11 @@ extern int tsip_dialog_invite_stimers_handle(tsip_dialog_invite_t* self, const t
extern int x0000_Any_2_Any_X_i1xx(va_list *app);
/* ======================== transitions ======================== */
int c0000_Started_2_Outgoing_X_oINVITE(va_list *app);
int c0000_Outgoing_2_Connected_X_i2xxINVITE(va_list *app);
int c0000_Outgoing_2_Terminated_X_i300_to_i699INVITE(va_list *app);
int c0000_Outgoing_2_Cancelling_X_oCANCEL(va_list *app);
int c0000_Cancelling_2_Terminated_X_i300_to_699(va_list *app); /* 487 INVITE (To have more chances, any 300-699) */
static int c0000_Started_2_Outgoing_X_oINVITE(va_list *app);
static int c0000_Outgoing_2_Connected_X_i2xxINVITE(va_list *app);
static int c0000_Outgoing_2_Terminated_X_i300_to_i699INVITE(va_list *app);
static int c0000_Outgoing_2_Cancelling_X_oCANCEL(va_list *app);
static int c0000_Cancelling_2_Terminated_X_i300_to_699(va_list *app); /* 487 INVITE (To have more chances, any 300-699) */
/* ======================== conds ======================== */
static tsk_bool_t _fsm_cond_is_resp2INVITE(tsip_dialog_invite_t* self, tsip_message_t* message)

View File

@ -55,23 +55,23 @@ extern int send_ERROR(tsip_dialog_invite_t* self, const tsip_request_t* request,
extern int tsip_dialog_invite_timer_callback(const tsip_dialog_invite_t* self, tsk_timer_id_t timer_id);
/* ======================== internal functions ======================== */
int send_UNSUPPORTED(tsip_dialog_invite_t* self, const tsip_request_t* request, const char* option);
static int send_UNSUPPORTED(tsip_dialog_invite_t* self, const tsip_request_t* request, const char* option);
/* ======================== transitions ======================== */
int s0000_Started_2_Terminated_X_iINVITE(va_list *app); // Failure
int s0000_Started_2_Started_X_iINVITE(va_list *app); // Session Interval Too Small
int s0000_Started_2_InProgress_X_iINVITE(va_list *app); // 100rel supported
int s0000_Started_2_Ringing_X_iINVITE(va_list *app); // Neither 100rel nor QoS
int s0000_InProgress_2_InProgress_X_iPRACK(va_list *app); // PRACK for our 18x response (with QoS)
int s0000_InProgress_2_Ringing_X_iPRACK(va_list *app); // PRACK for our 18x response (without QoS)
int s0000_InProgress_2_InProgress_X_iUPDATE(va_list *app); // QoS cannot resume
int s0000_InProgress_2_Ringing_X_iUPDATE(va_list *app); // QoS can resume (do not alert user, wait for PRACK)
int s0000_Inprogress_2_Terminated_X_iCANCEL(va_list *app);
int s0000_Ringing_2_Ringing_X_iPRACK(va_list *app); // Alert user
int s0000_Ringing_2_Connected_X_Accept(va_list *app);
int s0000_Ringing_2_Terminated_X_Reject(va_list *app);
int s0000_Ringing_2_Terminated_X_iCANCEL(va_list *app);
int s0000_Any_2_Any_X_timer100rel(va_list *app);
static int s0000_Started_2_Terminated_X_iINVITE(va_list *app); // Failure
static int s0000_Started_2_Started_X_iINVITE(va_list *app); // Session Interval Too Small
static int s0000_Started_2_InProgress_X_iINVITE(va_list *app); // 100rel supported
static int s0000_Started_2_Ringing_X_iINVITE(va_list *app); // Neither 100rel nor QoS
static int s0000_InProgress_2_InProgress_X_iPRACK(va_list *app); // PRACK for our 18x response (with QoS)
static int s0000_InProgress_2_Ringing_X_iPRACK(va_list *app); // PRACK for our 18x response (without QoS)
static int s0000_InProgress_2_InProgress_X_iUPDATE(va_list *app); // QoS cannot resume
static int s0000_InProgress_2_Ringing_X_iUPDATE(va_list *app); // QoS can resume (do not alert user, wait for PRACK)
static int s0000_Inprogress_2_Terminated_X_iCANCEL(va_list *app);
static int s0000_Ringing_2_Ringing_X_iPRACK(va_list *app); // Alert user
static int s0000_Ringing_2_Connected_X_Accept(va_list *app);
static int s0000_Ringing_2_Terminated_X_Reject(va_list *app);
static int s0000_Ringing_2_Terminated_X_iCANCEL(va_list *app);
static int s0000_Any_2_Any_X_timer100rel(va_list *app);
/* ======================== conds ======================== */
static tsk_bool_t _fsm_cond_bad_extension(tsip_dialog_invite_t* self, tsip_message_t* message)

View File

@ -108,6 +108,7 @@ tsip_dialog_t* tsip_dialog_layer_find(const tsip_dialog_layer_t *self, const cha
if(tsk_strequals(dialog->callid, callid)){
tsk_bool_t is_cancel = (type == tsip_CANCEL); // Incoming CANCEL
tsk_bool_t is_register = (type == tsip_REGISTER); // Incoming REGISTER
tsk_bool_t is_notify = (type == tsip_NOTIFY); // Incoming NOTIFY
*cid_matched = tsk_true;
/* CANCEL Request will have the same local tag than the INVITE request -> do not compare tags */
if((is_cancel || tsk_strequals(dialog->tag_local, from_tag)) && tsk_strequals(dialog->tag_remote, to_tag)){
@ -119,6 +120,17 @@ tsip_dialog_t* tsip_dialog_layer_find(const tsip_dialog_layer_t *self, const cha
ret = tsk_object_ref(dialog);
break;
}
/* NOTIFY could arrive before the 200 SUBSCRIBE => This is why we don't try to match both tags
RFC 3265 - 3.1.4.4. Confirmation of Subscription Creation
Due to the potential for both out-of-order messages and forking, the
subscriber MUST be prepared to receive NOTIFY messages before the
SUBSCRIBE transaction has completed.
*/
if(is_notify /* Do not check tags */){
ret = tsk_object_ref(dialog);
break;
}
}
}
@ -341,6 +353,8 @@ int tsip_dialog_layer_remove(tsip_dialog_layer_t *self, const tsip_dialog_t *dia
return -1;
}
// this function is only called if no transaction match
// for responses, the transaction will always match
int tsip_dialog_layer_handle_incoming_msg(const tsip_dialog_layer_t *self, const tsip_message_t* message)
{
int ret = -1;
@ -352,7 +366,7 @@ int tsip_dialog_layer_handle_incoming_msg(const tsip_dialog_layer_t *self, const
if(!layer_transac){
goto bail;
}
//tsk_safeobj_lock(self);
dialog = tsip_dialog_layer_find(self, message->Call_ID->value,
TSIP_MESSAGE_IS_RESPONSE(message) ? message->To->tag : message->From->tag,
@ -415,6 +429,7 @@ int tsip_dialog_layer_handle_incoming_msg(const tsip_dialog_layer_t *self, const
}
}//switch
// for new dialog, create a new transac and start it later
if(newdialog){
transac = tsip_transac_layer_new(layer_transac, tsk_false, message, newdialog);
tsk_list_push_back_data(self->dialogs, (void**)&newdialog); /* add new dialog to the layer */

View File

@ -46,21 +46,21 @@
tsip_message_event_signal(type, TSIP_DIALOG(self)->ss, code, phrase, message)
/* ======================== internal functions ======================== */
int send_MESSAGE(tsip_dialog_message_t *self);
int tsip_dialog_message_OnTerminated(tsip_dialog_message_t *self);
static int send_MESSAGE(tsip_dialog_message_t *self);
static int tsip_dialog_message_OnTerminated(tsip_dialog_message_t *self);
/* ======================== transitions ======================== */
int tsip_dialog_message_Started_2_Sending_X_sendMESSAGE(va_list *app);
int tsip_dialog_message_Started_2_Receiving_X_recvMESSAGE(va_list *app);
int tsip_dialog_message_Sending_2_Sending_X_1xx(va_list *app);
int tsip_dialog_message_Sending_2_Terminated_X_2xx(va_list *app);
int tsip_dialog_message_Sending_2_Sending_X_401_407_421_494(va_list *app);
int tsip_dialog_message_Sending_2_Terminated_X_300_to_699(va_list *app);
int tsip_dialog_message_Sending_2_Terminated_X_cancel(va_list *app);
int tsip_dialog_message_Receiving_2_Terminated_X_accept(va_list *app);
int tsip_dialog_message_Receiving_2_Terminated_X_reject(va_list *app);
int tsip_dialog_message_Any_2_Terminated_X_transportError(va_list *app);
int tsip_dialog_message_Any_2_Terminated_X_Error(va_list *app);
static int tsip_dialog_message_Started_2_Sending_X_sendMESSAGE(va_list *app);
static int tsip_dialog_message_Started_2_Receiving_X_recvMESSAGE(va_list *app);
static int tsip_dialog_message_Sending_2_Sending_X_1xx(va_list *app);
static int tsip_dialog_message_Sending_2_Terminated_X_2xx(va_list *app);
static int tsip_dialog_message_Sending_2_Sending_X_401_407_421_494(va_list *app);
static int tsip_dialog_message_Sending_2_Terminated_X_300_to_699(va_list *app);
static int tsip_dialog_message_Sending_2_Terminated_X_cancel(va_list *app);
static int tsip_dialog_message_Receiving_2_Terminated_X_accept(va_list *app);
static int tsip_dialog_message_Receiving_2_Terminated_X_reject(va_list *app);
static int tsip_dialog_message_Any_2_Terminated_X_transportError(va_list *app);
static int tsip_dialog_message_Any_2_Terminated_X_Error(va_list *app);
/* ======================== conds ======================== */

View File

@ -46,22 +46,22 @@
tsip_options_event_signal(type, TSIP_DIALOG(self)->ss, code, phrase, options)
/* ======================== internal functions ======================== */
int send_OPTIONS(tsip_dialog_options_t *self);
int send_response(tsip_dialog_options_t *self, short status, const char* phrase, const tsip_request_t *request);
int tsip_dialog_options_OnTerminated(tsip_dialog_options_t *self);
static int send_OPTIONS(tsip_dialog_options_t *self);
static int send_response(tsip_dialog_options_t *self, short status, const char* phrase, const tsip_request_t *request);
static int tsip_dialog_options_OnTerminated(tsip_dialog_options_t *self);
/* ======================== transitions ======================== */
int tsip_dialog_options_Started_2_Sending_X_sendOPTIONS(va_list *app);
int tsip_dialog_options_Started_2_Receiving_X_recvOPTIONS(va_list *app);
int tsip_dialog_options_Sending_2_Sending_X_1xx(va_list *app);
int tsip_dialog_options_Sending_2_Terminated_X_2xx(va_list *app);
int tsip_dialog_options_Sending_2_Sending_X_401_407_421_494(va_list *app);
int tsip_dialog_options_Sending_2_Terminated_X_300_to_699(va_list *app);
int tsip_dialog_options_Sending_2_Terminated_X_cancel(va_list *app);
int tsip_dialog_options_Receiving_2_Terminated_X_accept(va_list *app);
int tsip_dialog_options_Receiving_2_Terminated_X_reject(va_list *app);
int tsip_dialog_options_Any_2_Terminated_X_transportError(va_list *app);
int tsip_dialog_options_Any_2_Terminated_X_Error(va_list *app);
static int tsip_dialog_options_Started_2_Sending_X_sendOPTIONS(va_list *app);
static int tsip_dialog_options_Started_2_Receiving_X_recvOPTIONS(va_list *app);
static int tsip_dialog_options_Sending_2_Sending_X_1xx(va_list *app);
static int tsip_dialog_options_Sending_2_Terminated_X_2xx(va_list *app);
static int tsip_dialog_options_Sending_2_Sending_X_401_407_421_494(va_list *app);
static int tsip_dialog_options_Sending_2_Terminated_X_300_to_699(va_list *app);
static int tsip_dialog_options_Sending_2_Terminated_X_cancel(va_list *app);
static int tsip_dialog_options_Receiving_2_Terminated_X_accept(va_list *app);
static int tsip_dialog_options_Receiving_2_Terminated_X_reject(va_list *app);
static int tsip_dialog_options_Any_2_Terminated_X_transportError(va_list *app);
static int tsip_dialog_options_Any_2_Terminated_X_Error(va_list *app);
/* ======================== conds ======================== */

View File

@ -49,23 +49,23 @@
tsip_publish_event_signal(type, TSIP_DIALOG(self)->ss, code, phrase, message)
/* ======================== internal functions ======================== */
int send_PUBLISH(tsip_dialog_publish_t *self);
int tsip_dialog_publish_OnTerminated(tsip_dialog_publish_t *self);
static int send_PUBLISH(tsip_dialog_publish_t *self);
static int tsip_dialog_publish_OnTerminated(tsip_dialog_publish_t *self);
/* ======================== transitions ======================== */
int tsip_dialog_publish_Started_2_Trying_X_publish(va_list *app);
int tsip_dialog_publish_Trying_2_Trying_X_1xx(va_list *app);
int tsip_dialog_publish_Trying_2_Terminated_X_2xx(va_list *app);
int tsip_dialog_publish_Trying_2_Connected_X_2xx(va_list *app);
int tsip_dialog_publish_Trying_2_Trying_X_401_407_421_494(va_list *app);
int tsip_dialog_publish_Trying_2_Trying_X_423(va_list *app);
int tsip_dialog_publish_Trying_2_Terminated_X_300_to_699(va_list *app);
int tsip_dialog_publish_Trying_2_Terminated_X_cancel(va_list *app);
int tsip_dialog_publish_Connected_2_Trying_X_publish(va_list *app);
int tsip_dialog_publish_Any_2_Trying_X_hangup(va_list *app);
int tsip_dialog_publish_Any_2_Trying_X_shutdown(va_list *app);
int tsip_dialog_publish_Any_2_Terminated_X_transportError(va_list *app);
int tsip_dialog_publish_Any_2_Terminated_X_Error(va_list *app);
static int tsip_dialog_publish_Started_2_Trying_X_publish(va_list *app);
static int tsip_dialog_publish_Trying_2_Trying_X_1xx(va_list *app);
static int tsip_dialog_publish_Trying_2_Terminated_X_2xx(va_list *app);
static int tsip_dialog_publish_Trying_2_Connected_X_2xx(va_list *app);
static int tsip_dialog_publish_Trying_2_Trying_X_401_407_421_494(va_list *app);
static int tsip_dialog_publish_Trying_2_Trying_X_423(va_list *app);
static int tsip_dialog_publish_Trying_2_Terminated_X_300_to_699(va_list *app);
static int tsip_dialog_publish_Trying_2_Terminated_X_cancel(va_list *app);
static int tsip_dialog_publish_Connected_2_Trying_X_publish(va_list *app);
static int tsip_dialog_publish_Any_2_Trying_X_hangup(va_list *app);
static int tsip_dialog_publish_Any_2_Trying_X_shutdown(va_list *app);
static int tsip_dialog_publish_Any_2_Terminated_X_transportError(va_list *app);
static int tsip_dialog_publish_Any_2_Terminated_X_Error(va_list *app);
/* ======================== conds ======================== */

View File

@ -37,15 +37,15 @@
/* ======================== internal functions ======================== */
int tsip_dialog_register_send_REGISTER(tsip_dialog_register_t *self, tsk_bool_t initial);
int tsip_dialog_register_send_RESPONSE(tsip_dialog_register_t *self, const tsip_request_t* request, short code, const char* phrase);
int tsip_dialog_register_OnTerminated(tsip_dialog_register_t *self);
/*static*/ int tsip_dialog_register_send_REGISTER(tsip_dialog_register_t *self, tsk_bool_t initial);
/*static*/ int tsip_dialog_register_send_RESPONSE(tsip_dialog_register_t *self, const tsip_request_t* request, short code, const char* phrase);
/*static*/ int tsip_dialog_register_OnTerminated(tsip_dialog_register_t *self);
/* ======================== transitions ======================== */
int tsip_dialog_register_Any_2_InProgress_X_hangup(va_list *app);
int tsip_dialog_register_Any_2_InProgress_X_shutdown(va_list *app);
int tsip_dialog_register_Any_2_Terminated_X_transportError(va_list *app);
int tsip_dialog_register_Any_2_Terminated_X_Error(va_list *app);
static int tsip_dialog_register_Any_2_InProgress_X_hangup(va_list *app);
static int tsip_dialog_register_Any_2_InProgress_X_shutdown(va_list *app);
static int tsip_dialog_register_Any_2_Terminated_X_transportError(va_list *app);
static int tsip_dialog_register_Any_2_Terminated_X_Error(va_list *app);
/* ======================== conds ======================== */
static tsk_bool_t _fsm_cond_silent_hangup(tsip_dialog_register_t* dialog, tsip_message_t* message)

View File

@ -45,15 +45,15 @@ extern int tsip_dialog_register_timer_callback(const tsip_dialog_register_t* sel
extern int tsip_dialog_register_send_REGISTER(tsip_dialog_register_t *self, tsk_bool_t initial);
/* ======================== transitions ======================== */
int tsip_dialog_register_Started_2_InProgress_X_oRegister(va_list *app);
int tsip_dialog_register_InProgress_2_InProgress_X_1xx(va_list *app);
int tsip_dialog_register_InProgress_2_Terminated_X_2xx(va_list *app);
int tsip_dialog_register_InProgress_2_Connected_X_2xx(va_list *app);
int tsip_dialog_register_InProgress_2_InProgress_X_401_407_421_494(va_list *app);
int tsip_dialog_register_InProgress_2_InProgress_X_423(va_list *app);
int tsip_dialog_register_InProgress_2_Terminated_X_300_to_699(va_list *app);
int tsip_dialog_register_InProgress_2_Terminated_X_cancel(va_list *app);
int tsip_dialog_register_Connected_2_InProgress_X_oRegister(va_list *app);
static int tsip_dialog_register_Started_2_InProgress_X_oRegister(va_list *app);
static int tsip_dialog_register_InProgress_2_InProgress_X_1xx(va_list *app);
static int tsip_dialog_register_InProgress_2_Terminated_X_2xx(va_list *app);
static int tsip_dialog_register_InProgress_2_Connected_X_2xx(va_list *app);
static int tsip_dialog_register_InProgress_2_InProgress_X_401_407_421_494(va_list *app);
static int tsip_dialog_register_InProgress_2_InProgress_X_423(va_list *app);
static int tsip_dialog_register_InProgress_2_Terminated_X_300_to_699(va_list *app);
static int tsip_dialog_register_InProgress_2_Terminated_X_cancel(va_list *app);
static int tsip_dialog_register_Connected_2_InProgress_X_oRegister(va_list *app);
/* ======================== conds ======================== */

View File

@ -27,11 +27,11 @@
extern int tsip_dialog_register_send_RESPONSE(tsip_dialog_register_t *self, const tsip_request_t* request, short code, const char* phrase);
/* ======================== transitions ======================== */
int s0000_Started_2_Terminated_X_iREGISTER(va_list *app);
int s0000_Started_2_Incoming_X_iREGISTER(va_list *app);
int s0000_Incoming_2_Connected_X_Accept(va_list *app);
int s0000_Incoming_2_Terminated_X_Reject(va_list *app);
int s0000_Connected_2_Terminated_X_iREGISTER(va_list *app);
static int s0000_Started_2_Terminated_X_iREGISTER(va_list *app);
static int s0000_Started_2_Incoming_X_iREGISTER(va_list *app);
static int s0000_Incoming_2_Connected_X_Accept(va_list *app);
static int s0000_Incoming_2_Terminated_X_Reject(va_list *app);
static int s0000_Connected_2_Terminated_X_iREGISTER(va_list *app);
/* ======================== conds ======================== */

View File

@ -49,28 +49,29 @@
tsip_subscribe_event_signal(type, TSIP_DIALOG(self)->ss, code, phrase, message)
/* ======================== internal functions ======================== */
int send_SUBSCRIBE(tsip_dialog_subscribe_t *self);
int send_200NOTIFY(tsip_dialog_subscribe_t *self, const tsip_request_t* request);
int tsip_dialog_subscribe_OnTerminated(tsip_dialog_subscribe_t *self);
static int process_i_notify(tsip_dialog_subscribe_t *self, const tsip_request_t* notify);
static int send_SUBSCRIBE(tsip_dialog_subscribe_t *self);
static int send_200NOTIFY(tsip_dialog_subscribe_t *self, const tsip_request_t* request);
static int tsip_dialog_subscribe_OnTerminated(tsip_dialog_subscribe_t *self);
/* ======================== transitions ======================== */
int tsip_dialog_subscribe_Started_2_Trying_X_subscribe(va_list *app);
int tsip_dialog_subscribe_Trying_2_Trying_X_1xx(va_list *app);
int tsip_dialog_subscribe_Trying_2_Terminated_X_2xx(va_list *app);
int tsip_dialog_subscribe_Trying_2_Connected_X_2xx(va_list *app);
int tsip_dialog_subscribe_Trying_2_Trying_X_401_407_421_494(va_list *app);
int tsip_dialog_subscribe_Trying_2_Trying_X_423(va_list *app);
int tsip_dialog_subscribe_Trying_2_Terminated_X_300_to_699(va_list *app);
int tsip_dialog_subscribe_Trying_2_Terminated_X_cancel(va_list *app);
int tsip_dialog_subscribe_Trying_2_Trying_X_NOTIFY(va_list *app);
int tsip_dialog_subscribe_Connected_2_Trying_X_unsubscribe(va_list *app);
int tsip_dialog_subscribe_Connected_2_Trying_X_subscribe(va_list *app);
int tsip_dialog_subscribe_Connected_2_Connected_X_NOTIFY(va_list *app);
int tsip_dialog_subscribe_Connected_2_Terminated_X_NOTIFY(va_list *app);
int tsip_dialog_subscribe_Any_2_Trying_X_hangup(va_list *app);
int tsip_dialog_subscribe_Any_2_Trying_X_shutdown(va_list *app);
int tsip_dialog_subscribe_Any_2_Terminated_X_transportError(va_list *app);
int tsip_dialog_subscribe_Any_2_Terminated_X_Error(va_list *app);
static int tsip_dialog_subscribe_Started_2_Trying_X_subscribe(va_list *app);
static int tsip_dialog_subscribe_Trying_2_Trying_X_1xx(va_list *app);
static int tsip_dialog_subscribe_Trying_2_Terminated_X_2xx(va_list *app);
static int tsip_dialog_subscribe_Trying_2_Connected_X_2xx(va_list *app);
static int tsip_dialog_subscribe_Trying_2_Trying_X_401_407_421_494(va_list *app);
static int tsip_dialog_subscribe_Trying_2_Trying_X_423(va_list *app);
static int tsip_dialog_subscribe_Trying_2_Terminated_X_300_to_699(va_list *app);
static int tsip_dialog_subscribe_Trying_2_Terminated_X_cancel(va_list *app);
static int tsip_dialog_subscribe_Trying_2_Trying_X_NOTIFY(va_list *app);
static int tsip_dialog_subscribe_Connected_2_Trying_X_unsubscribe(va_list *app);
static int tsip_dialog_subscribe_Connected_2_Trying_X_subscribe(va_list *app);
static int tsip_dialog_subscribe_Connected_2_Connected_X_NOTIFY(va_list *app);
static int tsip_dialog_subscribe_Connected_2_Terminated_X_NOTIFY(va_list *app);
static int tsip_dialog_subscribe_Any_2_Trying_X_hangup(va_list *app);
static int tsip_dialog_subscribe_Any_2_Trying_X_shutdown(va_list *app);
static int tsip_dialog_subscribe_Any_2_Terminated_X_transportError(va_list *app);
static int tsip_dialog_subscribe_Any_2_Terminated_X_Error(va_list *app);
/* ======================== conds ======================== */
@ -498,10 +499,15 @@ int tsip_dialog_subscribe_Trying_2_Terminated_X_cancel(va_list *app)
*/
int tsip_dialog_subscribe_Trying_2_Trying_X_NOTIFY(va_list *app)
{
int ret;
tsip_dialog_subscribe_t *self = va_arg(*app, tsip_dialog_subscribe_t *);
const tsip_request_t *request = va_arg(*app, const tsip_request_t *);
return send_200NOTIFY(self, request);
ret = send_200NOTIFY(self, request);
ret = process_i_notify(self, request);
return ret;
}
/* Connected -> (SUBSCRIBE) -> Trying
@ -530,14 +536,7 @@ int tsip_dialog_subscribe_Connected_2_Connected_X_NOTIFY(va_list *app)
int ret;
ret = send_200NOTIFY(self, request);
/* Request timeout for dialog refresh (re-registration). */
self->timerrefresh.timeout = tsip_dialog_get_newdelay(TSIP_DIALOG(self), request);
TSIP_DIALOG_SUBSCRIBE_TIMER_SCHEDULE(refresh);
/* Alert the user */
TSIP_DIALOG_SUBSCRIBE_SIGNAL(self, tsip_i_notify,
tsip_event_code_dialog_request_incoming, "Incoming NOTIFY.", request);
ret = process_i_notify(self, request);
return ret;
}
@ -671,6 +670,25 @@ int send_200NOTIFY(tsip_dialog_subscribe_t *self, const tsip_request_t* request)
return ret;
}
// process incoming notify: refresh delay and alert the user
int process_i_notify(tsip_dialog_subscribe_t *self, const tsip_request_t* notify)
{
if(!self || !notify){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
/* Request timeout for dialog refresh (re-registration). */
self->timerrefresh.timeout = tsip_dialog_get_newdelay(TSIP_DIALOG(self), notify);
TSIP_DIALOG_SUBSCRIBE_TIMER_SCHEDULE(refresh);
/* Alert the user */
TSIP_DIALOG_SUBSCRIBE_SIGNAL(self, tsip_i_notify,
tsip_event_code_dialog_request_incoming, "Incoming NOTIFY.", notify);
return 0;
}
/**
* Callback function called by the state machine manager to signal that the final state has been reached.
*