static int tsip_transac_dst_deliver(struct tsip_transac_dst_s* self, tsip_dialog_event_type_t event_type, const tsip_message_t *msg) { if(!self){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } switch(self->type){ case tsip_transac_dst_type_dialog: { return self->dialog.dlg->callback( self->dialog.dlg, event_type, msg ); } case tsip_transac_dst_type_net: { if(!msg){ TSK_DEBUG_ERROR("Message is null"); return -1; } // all messages coming from WebSocket transport have to be updated (AoR, Via...) before network delivering // all other messages MUST not unless specified from the dialog layer TSIP_MESSAGE(msg)->update |= (TNET_SOCKET_TYPE_IS_WS(msg->src_net_type) || TNET_SOCKET_TYPE_IS_WSS(msg->src_net_type)); return tsip_transport_layer_send( self->stack->layer_transport, msg->firstVia ? msg->firstVia->branch : tsk_null, TSIP_MESSAGE(msg) ); } default: { TSK_DEBUG_ERROR("Unexpected code called"); return -2; } } }
//-------------------------------------------------------- // == STATE MACHINE BEGIN == //-------------------------------------------------------- /* Started -> (send) -> Trying */ int tsip_transac_nict_Started_2_Trying_X_send(va_list *app) { tsip_transac_nict_t *self = va_arg(*app, tsip_transac_nict_t *); //const tsip_message_t *message = va_arg(*app, const tsip_message_t *); //== Send the request tsip_transac_send(TSIP_TRANSAC(self), TSIP_TRANSAC(self)->branch, TSIP_MESSAGE(self->request)); /* RFC 3261 - 17.1.2.2 The "Trying" state is entered when the TU initiates a new client transaction with a request. When entering this state, the client transaction SHOULD set timer F to fire in 64*T1 seconds. */ TRANSAC_NICT_TIMER_SCHEDULE(F); /* RFC 3261 - 17.1.2.2 If an unreliable transport is in use, the client transaction MUST set timer E to fire in T1 seconds. */ if(!TSIP_TRANSAC(self)->reliable){ TRANSAC_NICT_TIMER_SCHEDULE(E); }
// send the message over the network int tsip_transac_send(tsip_transac_t *self, const char *branch, const tsip_message_t *msg) { if(self && TSIP_TRANSAC_GET_STACK(self)->layer_transport && msg){ return tsip_transport_layer_send(TSIP_TRANSAC_GET_STACK(self)->layer_transport, branch, TSIP_MESSAGE(msg)); } TSK_DEBUG_ERROR("Invalid parameter"); return -1; }