internal TSIP_DialogRegister(TSIP_SessionRegister session, String callId) : base(tsip_dialog_type_t.REGISTER, callId, session) { /* Initialize the state machine. */ mFSM = new TSK_StateMachine((Int32)FSMState.Started, (Int32)FSMState.Terminated, OnTerminated, this); mFSM.IsDebugEnabled = true; // Initialize client side InitClientFSM(); // initialize server side InitServerFSM(); // initialize common transitions side /*======================= * === Any === */ // Any -> (hangup) -> InProgress mFSM.AddEntry(TSK_StateMachine.STATE_ANY, (Int32)FSMAction.Hangup, IsNotSilentHangup, (Int32)FSMState.InProgress, Any_2_InProgress_X_hangup, "REGISTER_Any_2_InProgress_X_hangup") // Any -> (silenthangup) -> Terminated .AddEntry(TSK_StateMachine.STATE_ANY, (Int32)FSMAction.Hangup, IsSilentHangup, (Int32)FSMState.Terminated, null, "REGISTER_Any_2_InProgress_X_silenthangup") // Any -> (shutdown) -> InProgress .AddEntry(TSK_StateMachine.STATE_ANY, (Int32)FSMAction.Shutdown, IsNotSilentHangup, (Int32)FSMState.InProgress, Any_2_InProgress_X_shutdown, "REGISTER_Any_2_InProgress_X_shutdown") // Any -> (silentshutdown) -> Terminated .AddEntry(TSK_StateMachine.STATE_ANY, (Int32)FSMAction.Shutdown, IsSilentHangup, (Int32)FSMState.Terminated, null, "REGISTER_Any_2_InProgress_X_silentshutdow") // Any -> (shutdown timedout) -> Terminated .AddAlwaysEntry(TSK_StateMachine.STATE_ANY, (Int32)FSMAction.ShutdownTimedout, (Int32)FSMState.Terminated, null, "REGISTER_shutdown_timedout") // Any -> (transport error) -> Terminated .AddAlwaysEntry(TSK_StateMachine.STATE_ANY, (Int32)FSMAction.TransportError, (Int32)FSMState.Terminated, Any_2_Terminated_X_transportError, "REGISTER_Any_2_Terminated_X_transportError") // Any -> (error) -> Terminated .AddAlwaysEntry(TSK_StateMachine.STATE_ANY, (Int32)FSMAction.Error, (Int32)FSMState.Terminated, Any_2_Terminated_X_Error, "REGISTER_Any_2_Terminated_X_Error"); // hook callback base.Callback = this.OnCallbackEvent; }
// Constructor public MainPage() { InitializeComponent(); String mm = "SIP/2.0 200 OK\r\n" + "Via: SIP/2.0/UDP 192.168.0.13:5060;branch=z9hG4bK_56ef1cda-aef6-4d76-ab7e-d148af3b18ac;rport=51049\r\n" + "Record-Route: <sip:192.168.0.10:5060;lr;transport=udp>\r\n" + "To: <sip:[email protected]>\r\n" + "From: <sip:[email protected]>;tag=9bff9c34-35e3-4fa8-8de4-290ce275c981\r\n" + "Call-ID: 272b67b9-08b2-4fce-8f6e-6ccaf5e5ec9a\r\n" + "CSeq: 1990525622 REGISTER\r\n" + "Server: mjsip stack 1.6\r\n" + "Contact: <sip:[email protected]:5060>;expires=10\r\n" + "Content-Length: 0\r\n" + "\r\n"; /*TSIP_Message message = TSIP_ParserMessage.Parse(UTF8Encoding.UTF8.GetBytes(mm), true); * if (message != null) * { * }*/ TSIP_Stack sipStack = new TSIP_Stack( TSIP_Uri.Create("sip:doubango.org"), "004", TSIP_Uri.Create("sip:[email protected]"), "192.168.0.10", 5060 ); // sipStack.Headers.Add(new TSK_Param("User-Agent", "wp-ngn-stack")); sipStack.AoRIP = "192.168.0.13"; sipStack.AoRPort = 5060; sipStack.Callback = delegate(TSIP_Event @event) { switch (@event.Type) { case TSIP_Event.tsip_event_type_t.DIALOG: { TSIP_EventDialog eventDialog = (@event as TSIP_EventDialog); break; } case TSIP_Event.tsip_event_type_t.REGISTER: { TSIP_EventRegister eventDialog = (@event as TSIP_EventRegister); break; } default: { return(false); } } return(true); }; if (sipStack.Start()) { TSIP_SessionRegister register = new TSIP_SessionRegister(sipStack); register.Register(); } }
static void Main(string[] args) { //Test_FSM.DefaultTest(); //TSIP_TransportUDP transportUdp = new TSIP_TransportUDP("192.168.0.13", TNET_Socket.TNET_SOCKET_PORT_ANY, false, "Sip Tansport using UDP"); //IPEndPoint remoteEP = TNET_Socket.CreateEndPoint("192.168.0.10", 5060); // Int32 count = transportUdp.SendTo(remoteEP, Encoding.UTF8.GetBytes("test")); //Test_UriParser.TestUriParser(); //Test_UriParser.TestMessageParser(); /*List<TSIP_HeaderVia> headers = TSIP_HeaderVia.Parse("Via: SIP/2.0/tcp 127.0.0.1:5082;branch=z9hG4bKc16be5aee32df400d01015675ab911ba,SIP/2.0/udp 127.0.0.1:5082;branch=z9hG4bKeec53b25db240bec92ea250964b8c1fa;received_port_ext=5081;received=192.168.0.13,SIP/2.0/UDP 192.168.0.12:57121;rport=57121;branch=z9hG4bK1274980921982;received_port_ext=5081;received=192.168.0.12\r\n"); * foreach (TSIP_HeaderVia h in headers) * { * Console.WriteLine(h.ToString(true, true, true)); * }*/ //TSIP_HeaderTo header = TSIP_HeaderTo.Parse("t: <sip:[email protected]>;tag= 12345\r\n"); //if (header != null) //{ // Console.WriteLine(header.ToString(true, true, true)); //} TSIP_Stack sipStack = new TSIP_Stack( TSIP_Uri.Create("sip:doubango.org"), "004", TSIP_Uri.Create("sip:[email protected]"), "192.168.0.10", 5060 ); sipStack.LocalIP = "192.168.0.13";//FIXME sipStack.Callback = delegate(TSIP_Event @event) { switch (@event.Type) { case TSIP_Event.tsip_event_type_t.DIALOG: { TSIP_EventDialog eventDialog = (@event as TSIP_EventDialog); break; } case TSIP_Event.tsip_event_type_t.REGISTER: { TSIP_EventRegister eventDialog = (@event as TSIP_EventRegister); break; } default: { return(false); } } return(true); }; if (sipStack.Start()) { TSIP_SessionRegister register = new TSIP_SessionRegister(sipStack); register.Register(); } Console.ReadLine(); }
internal TSIP_DialogRegister(TSIP_SessionRegister session) : this(session, null) { }
// 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); }