private void HandshakeCompleted(object sender, EventArgs e) { m_receiveStateMachine.Start(m_streamSocket); m_sendStateMachine.Start(m_streamSocket); m_context.PulseAll(); }
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; }); }
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(); }); }