예제 #1
0
        private void HandshakeCompleted(object sender, EventArgs e)
        {
            m_receiveStateMachine.Start(m_streamSocket);
            m_sendStateMachine.Start(m_streamSocket);

            m_context.PulseAll();
        }
예제 #2
0
        public SendStateMachine(Context context) : base(context, SendState.Idle)
        {
            On(SendState.Idle, Action.Start, () =>
            {
                State = SendState.Ready;
            });

            On(SendState.Sending, Action.Sent, () =>
            {
                Context.PulseAll();
                State = SendState.Ready;
            });
        }
예제 #3
0
        public ReceiveStateMachine(Context context) : base(context, ReceiveState.Idle)
        {
            On(ReceiveState.Idle, ReceiveAction.Start, () =>
            {
                State = ReceiveState.Flag;
                ReceiveData(1);
            });

            On(ReceiveState.MessageReady, ReceiveAction.Fetched, () =>
            {
                State = ReceiveState.Flag;
                ReceiveData(1);
            });

            On <IBuffer>(ReceiveState.Flag, ReceiveAction.Received, buffer =>
            {
                byte[] data = buffer.ToArray();
                int flag    = data[0];

                // TODO: more bit is not supported at the moment
                // m_receivingMessage.More = (flag & 1) != 0;
                Debug.Assert((flag & 1) == 0);

                bool eightSize = (flag & 2) != 0;

                if (eightSize)
                {
                    State = ReceiveState.EightByte;
                    ReceiveData(8);
                }
                else
                {
                    State = ReceiveState.OneByte;
                    ReceiveData(1);
                }
            });

            On <IBuffer>(ReceiveState.OneByte, ReceiveAction.Received, buffer =>
            {
                byte[] data = buffer.ToArray();
                m_size      = data[0];

                if (m_size > 0)
                {
                    State = ReceiveState.Message;
                    ReceiveData(m_size);
                }
                else
                {
                    m_data = new byte[0];

                    State = ReceiveState.MessageReady;

                    Context.PulseAll();
                }
            });

            On <IBuffer>(ReceiveState.EightByte, ReceiveAction.Received, buffer =>
            {
                byte[] data = buffer.ToArray();
                m_size      = (int)NetworkOrderBitsConverter.ToInt64(data);

                State = ReceiveState.Message;
                ReceiveData(m_size);
            });

            On <IBuffer>(ReceiveState.Message, ReceiveAction.Received, buffer =>
            {
                m_data = buffer.ToArray();

                State = ReceiveState.MessageReady;

                // let threads now that state has changed
                Context.PulseAll();
            });
        }