Exemple #1
0
        public bool TrySend(ref Frame frame)
        {
            if (State != SendState.Ready)
            {
                return(false);
            }

            int payloadIndex;

            byte[] data;

            if (frame.Size <= 255)
            {
                data    = new byte[2 + frame.Size];
                data[0] = 0; // More is not supported
                data[1] = (byte)frame.Size;

                payloadIndex = 2;
            }
            else
            {
                data    = new byte[9 + frame.Size];
                data[0] = 2; // More is not supported

                NetworkOrderBitsConverter.PutInt64((long)frame.Size, data, 1);
                payloadIndex = 9;
            }

            frame.CopyTo(data, payloadIndex);
            frame.Close();
            frame.Init();

            State = SendState.Sending;

            SendData(data);

            return(true);
        }
Exemple #2
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();
            });
        }