protected Boolean SenRequest(TSIP_Request request) { TSIP_Transac transact = this.Stack.LayerTransac.CreateTransac(true, request, this); switch (transact.Type) { case TSIP_Transac.tsip_transac_type_t.ICT: case TSIP_Transac.tsip_transac_type_t.NICT: { /* Start the newly create IC/NIC transaction */ return(transact.Start(request)); } } return(false); }
// this function is only called if no transaction match // for responses, the transaction will always match internal Boolean HandleIncomingMessage(TSIP_Message message) { TSIP_Dialog dialog = null; TSIP_Transac transac = null; Boolean cid_matched; Boolean ret = false; dialog = this.FindDialog(message.CallId.Value, message.IsResponse ? message.To.Tag : message.From.Tag, message.IsResponse ? message.From.Tag : message.To.Tag, message.IsRequest ? (message as TSIP_Request).RequestType : TSIP_Message.tsip_request_type_t.NONE, out cid_matched); if (dialog != null) { if (message.IsCANCEL || message.IsACK) { ret = dialog.RaiseCallback(TSIP_Dialog.tsip_dialog_event_type_t.I_MSG, message); goto bail; } else { transac = mStack.LayerTransac.CreateTransac(false, message, dialog); } } else { if (message.IsRequest) { TSIP_Dialog newdialog = null; switch ((message as TSIP_Request).RequestType) { case TSIP_Message.tsip_request_type_t.REGISTER: { /* incoming REGISTER */ TSIP_SessionRegister session = new TSIP_SessionRegister(mStack, message); newdialog = new TSIP_DialogRegister(session, message.CallId == null ? null : message.CallId.Value); break; } } // for new dialog, create a new transac and start it later if (newdialog != null) { transac = mStack.LayerTransac.CreateTransac(false, message, newdialog); this.AddDialog(newdialog); } } } if (transac != null) { ret = transac.Start((message as TSIP_Request)); } else if (message.IsRequest) /* No transaction match for the SIP request */ { TSIP_Response response = null; if (cid_matched) /* We are receiving our own message. */ { response = new TSIP_Response(482, "Loop Detected (Check your iFCs)", (message as TSIP_Request)); if (String.IsNullOrEmpty(response.To.Tag))/* Early dialog? */ { response.To.Tag = "doubango"; } } else { switch ((message as TSIP_Request).RequestType) { case TSIP_Message.tsip_request_type_t.OPTIONS: // Hacked to work on Tiscali IMS networks case TSIP_Message.tsip_request_type_t.INFO: { response = new TSIP_Response(405, "Method Not Allowed", (message as TSIP_Request)); break; } default: { response = new TSIP_Response(481, "Dialog/Transaction Does Not Exist", (message as TSIP_Request)); break; } } } if (response != null) { // send the response ret = mStack.LayerTransport.SendMessage(response.FirstVia != null ? response.FirstVia.Branch : "no-branch", response); } } bail: return(ret); }