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); }
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(); }); }