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;
        }
 internal TSIP_DialogRegister(TSIP_SessionRegister session)
     : this(session, null)
 {
 }
Exemplo n.º 3
0
        // 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;
        }
Exemplo n.º 4
0
        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();
        }
Exemplo n.º 5
0
        // 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();
            }
        }