Пример #1
0
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;
			}
	}
}
Пример #2
0



//--------------------------------------------------------
//				== 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);
	}
Пример #3
0
// 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;
}