int publish_handle_event(const tsip_event_t *_event) { const tsip_publish_event_t* pub_event = TSIP_PUBLISH_EVENT(_event); const session_t* session; tsip_ssession_id_t sid; /* Find associated session */ sid = tsip_ssession_get_id(_event->ss); if(!(session = session_get_by_sid(ctx->sessions, sid))){ TSK_DEBUG_WARN("Failed to match session event."); return -1; } switch(pub_event->type){ case tsip_ao_publish: /* Answer to outgoing PUBLISH */ { if(_event->sipmessage){ if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ TSK_DEBUG_INFO("Event: Answer to outgoing PUBLISH. Code=%d and phrase=%s", _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); } else{ // request } } break; } case tsip_ao_unpublish: /* Answer to outgoing unPUBLISH */ { if(_event->sipmessage){ if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ TSK_DEBUG_INFO("Event: Answer to outgoing UNPUBLISH. Code=%d and phrase=%s", _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); } else{ // request } } break; } /* Server events (For whose dev. Server Side IMS Services) */ case tsip_i_publish: /* Incoming PUBLISH */ case tsip_i_unpublish: /* Incoming unPUBLISH */ { TSK_DEBUG_WARN("Event not support by Client Framework."); break; } default: { /* Any other event */ TSK_DEBUG_WARN("%d not a valid SIP Subscription event.", pub_event->type); break; } } return 0; }
int options_handle_event(const tsip_event_t *_event) { const tsip_options_event_t* opt_event = TSIP_OPTIONS_EVENT(_event); const session_t* session; tsip_ssession_id_t sid; /* Find associated session */ sid = tsip_ssession_get_id(_event->ss); if(!(session = session_get_by_sid(ctx->sessions, sid))){ TSK_DEBUG_WARN("Failed to match session event."); return -1; } switch(opt_event->type){ case tsip_i_options: /* incoming OPTIONS */ break; case tsip_ao_options: /* answer to outgoing OPTIONS */ #if HACK_AOR if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)){ options_hack_aor(_event->sipmessage); } #endif break; } return 0; }
/** * Callback function called to alert the dialog for new events from the transaction/transport layers. * * @param [in,out] self A reference to the dialog. * @param type The event type. * @param [in,out] msg The incoming SIP/IMS message. * * @return Zero if succeed and non-zero error code otherwise. **/ int tsip_dialog_subscribe_event_callback(const tsip_dialog_subscribe_t *self, tsip_dialog_event_type_t type, const tsip_message_t *msg) { int ret = -1; switch(type) { case tsip_dialog_i_msg: { if(msg && TSIP_MESSAGE_IS_RESPONSE(msg)){ // // RESPONSE // const tsip_action_t* action = tsip_dialog_keep_action(TSIP_DIALOG(self), msg) ? TSIP_DIALOG(self)->curr_action : tsk_null; if(TSIP_RESPONSE_IS_1XX(msg)){ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_1xx, msg, action); } else if(TSIP_RESPONSE_IS_2XX(msg)){ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_2xx, msg, action); } else if(TSIP_RESPONSE_IS(msg,401) || TSIP_RESPONSE_IS(msg,407) || TSIP_RESPONSE_IS(msg,421) || TSIP_RESPONSE_IS(msg,494)){ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_401_407_421_494, msg, action); } else if(TSIP_RESPONSE_IS(msg,423)){ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_423, msg, action); } else{ // Alert User ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_error, msg, action); /* TSK_DEBUG_WARN("Not supported status code: %d", TSIP_RESPONSE_CODE(msg)); */ } } else{ // // REQUEST // if(TSIP_REQUEST_IS_NOTIFY(msg)){ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_notify, msg, tsk_null); } } break; } case tsip_dialog_canceled: { ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_cancel, msg, tsk_null); break; } case tsip_dialog_terminated: case tsip_dialog_timedout: case tsip_dialog_error: case tsip_dialog_transport_error: { ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_transporterror, msg, tsk_null); break; } } return ret; }
static int tsip_dialog_message_event_callback(const tsip_dialog_message_t *self, tsip_dialog_event_type_t type, const tsip_message_t *msg) { int ret = -1; switch(type) { case tsip_dialog_i_msg: { if(msg){ if(TSIP_MESSAGE_IS_RESPONSE(msg)){ const tsip_action_t* action = tsip_dialog_keep_action(TSIP_DIALOG(self), msg) ? TSIP_DIALOG(self)->curr_action : tsk_null; if(TSIP_RESPONSE_IS_1XX(msg)){ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_1xx, msg, action); } else if(TSIP_RESPONSE_IS_2XX(msg)){ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_2xx, msg, action); } else if(TSIP_RESPONSE_CODE(msg) == 401 || TSIP_RESPONSE_CODE(msg) == 407 || TSIP_RESPONSE_CODE(msg) == 421 || TSIP_RESPONSE_CODE(msg) == 494){ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_401_407_421_494, msg, action); } else if(TSIP_RESPONSE_IS_3456(msg)){ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_300_to_699, msg, action); } else{ /* Should never happen */ ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_error, msg, action); } } else if (TSIP_REQUEST_IS_MESSAGE(msg)){ /* have been checked by dialog layer...but */ // REQUEST ==> Incoming MESSAGE ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_receiveMESSAGE, msg, tsk_null); } } break; } case tsip_dialog_canceled: { ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_cancel, msg, tsk_null); break; } case tsip_dialog_terminated: case tsip_dialog_timedout: case tsip_dialog_error: case tsip_dialog_transport_error: { ret = tsip_dialog_fsm_act(TSIP_DIALOG(self), _fsm_action_transporterror, msg, tsk_null); break; } } return ret; }
/** * Callback function called by the transport layer to alert the transaction for incoming messages * or errors (e.g. transport error). * * @param [in,out] self A pointer to the NIC transaction. * @param type The event type. * @param [in,out] msg The incoming message. * * @return Zero if succeed and no-zero error code otherwise. **/ int tsip_transac_nict_event_callback(const tsip_transac_nict_t *self, tsip_transac_event_type_t type, const tsip_message_t *msg) { int ret = 0; switch(type) { case tsip_transac_incoming_msg: { if(msg && TSIP_MESSAGE_IS_RESPONSE(msg)){ if(TSIP_RESPONSE_IS_1XX(msg)){ ret = tsip_transac_fsm_act(TSIP_TRANSAC(self), _fsm_action_1xx, msg); } else if(TSIP_RESPONSE_IS_23456(msg)){ ret = tsip_transac_fsm_act(TSIP_TRANSAC(self), _fsm_action_200_to_699, msg); } else{ TSK_DEBUG_WARN("Not supported status code: %d", TSIP_RESPONSE_CODE(msg)); } } break; } case tsip_transac_canceled: case tsip_transac_terminated: case tsip_transac_timedout: break; case tsip_transac_error: { ret = tsip_transac_fsm_act(TSIP_TRANSAC(self), _fsm_action_error, msg); break; } case tsip_transac_transport_error: { ret = tsip_transac_fsm_act(TSIP_TRANSAC(self), _fsm_action_transporterror, msg); break; } default: break; } return ret; }
int tsip_transac_nist_event_callback(const tsip_transac_nist_t *self, tsip_transac_event_type_t type, const tsip_message_t *msg) { int ret = -1; switch(type) { case tsip_transac_incoming_msg: { /* From Transport Layer to Transaction Layer */ if(msg && TSIP_MESSAGE_IS_REQUEST(msg)) { ret = tsip_transac_fsm_act(TSIP_TRANSAC(self), _fsm_action_request, msg); } break; } case tsip_transac_outgoing_msg: { /* From TU to Transport Layer */ if(msg && TSIP_MESSAGE_IS_RESPONSE(msg)) { if(TSIP_RESPONSE_IS_1XX(msg)) { ret = tsip_transac_fsm_act(TSIP_TRANSAC(self), _fsm_action_send_1xx, msg); } else if(TSIP_RESPONSE_IS_23456(msg)) { ret = tsip_transac_fsm_act(TSIP_TRANSAC(self), _fsm_action_send_200_to_699, msg); } } break; } case tsip_transac_canceled: case tsip_transac_terminated: case tsip_transac_timedout: break; case tsip_transac_error: { ret = tsip_transac_fsm_act(TSIP_TRANSAC(self), _fsm_action_error, msg); break; } case tsip_transac_transport_error: { ret = tsip_transac_fsm_act(TSIP_TRANSAC(self), _fsm_action_transporterror, msg); break; } } return ret; }
int subscribe_handle_event(const tsip_event_t *_event) { const tsip_subscribe_event_t* sub_event = TSIP_SUBSCRIBE_EVENT(_event); const session_t* session; tsip_ssession_id_t sid; /* Find associated session */ sid = tsip_ssession_get_id(_event->ss); if(!(session = session_get_by_sid(ctx->sessions, sid))) { TSK_DEBUG_WARN("Failed to match session event."); return -1; } switch(sub_event->type) { case tsip_ao_subscribe: { /* Answer to outgoing SUBSCRIBE */ if(_event->sipmessage) { if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)) { TSK_DEBUG_INFO("Event: Answer to outgoing SUBSCRIBE. Code=%d and phrase=%s", _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); } else { // request } } break; } case tsip_ao_unsubscribe: { /* Answer to outgoing unSUBSCRIBE */ if(_event->sipmessage) { if(TSIP_MESSAGE_IS_RESPONSE(_event->sipmessage)) { TSK_DEBUG_INFO("Event: Answer to outgoing unSUBSCRIBE. Code=%d and phrase=%s", _event->sipmessage->line.response.status_code, _event->sipmessage->line.response.reason_phrase); } else { // request } } break; } case tsip_i_notify: { /* Incoming NOTIFY */ TSK_DEBUG_INFO("Event: Incoming NOTIFY."); if(TSIP_MESSAGE_HAS_CONTENT(_event->sipmessage)) { const tsk_buffer_t* content = TSIP_MESSAGE_CONTENT(_event->sipmessage); TSK_DEBUG_INFO("NOTIFY Content-Type: %s", TSIP_MESSAGE_CONTENT_TYPE(_event->sipmessage)); TSK_DEBUG_INFO("NOTIFY Content: %s", content->data); } break; } /* Server events (For whose dev. Server Side IMS Services) */ case tsip_i_subscribe: /* Incoming SUBSCRIBE */ case tsip_i_unsubscribe: { /* Incoming unSUBSCRIBE */ TSK_DEBUG_WARN("Event not support by Client Framework."); break; } default: { /* Any other event */ TSK_DEBUG_WARN("%d not a valid SIP Subscription event.", sub_event->type); break; } } return 0; }