Allow the application to enabel/disable 100rel\nAllow forking/out-of-order NOTIFY requets
This commit is contained in:
parent
c110ed05b4
commit
23ed807ada
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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){
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 ======================== */
|
||||
|
||||
|
|
|
@ -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 ======================== */
|
||||
|
||||
|
|
|
@ -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 ======================== */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 ======================== */
|
||||
|
|
|
@ -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 ======================== */
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue