/// <summary> /// Serializes the data frame. /// </summary> /// <param name="frame">The frame.</param> /// <returns>Binary representation of the frame.</returns> private static byte[] SerializeDataFrame(DataFrame frame) { var data = new byte[8 + frame.Length]; BinaryHelper.Int32ToBytes(frame.StreamId, new ArraySegment<byte>(data, 0, 4)); data[4] = frame.Flags; BinaryHelper.Int32ToBytes(frame.Length, new ArraySegment<byte>(data, 5, 3)); Buffer.BlockCopy(frame.Data, 0, data, 8, frame.Length); return data; }
/// <summary> /// Parses HTTP header of SM data frame. /// </summary> /// <param name="frame">The frame.</param> /// <param name="data">The data.</param> private static void ParseDataFrameHeader(ref DataFrame frame, byte[] data) { frame.StreamId = BinaryHelper.Int32FromBytes(new ArraySegment<byte>(data, 0, 4), 1); frame.Flags = data[4]; frame.Length = BinaryHelper.Int32FromBytes(new ArraySegment<byte>(data, 5, 3)); frame.IsFinal = (frame.Flags & 0x01) != 0; }
/// <summary> /// Process SM Data frame. /// </summary> /// <param name="frame">The data frame.</param> private void ProcessDataFrame(DataFrame frame) { if (this.OnStreamFrame != null) { SMStream stream = this.streamsStore.GetStreamById(frame.StreamId); if (stream == null) { this.SendRST(frame.StreamId, StatusCode.InvalidStream); } else { this.OnStreamFrame(this, new StreamDataEventArgs(stream, new SMData(frame.Data), frame.IsFinal)); } } }
/// <summary> /// Deserialize SM data frame /// </summary> /// <param name="data">The data.</param> /// <returns>Deserialized frame.</returns> private static BaseFrame DeserializeDataFrame(byte[] data) { DataFrame frame = new DataFrame(); ParseDataFrameHeader(ref frame, data); frame.Data = new byte[frame.Length]; Buffer.BlockCopy(data, 8, frame.Data, 0, frame.Length); return frame; }
/// <summary> /// Builds the data frame. /// </summary> /// <param name="streamId">The stream id.</param> /// <param name="data">The data.</param> /// <returns>Returns DataFrame.</returns> public DataFrame BuildDataFrame(int streamId, SMData data) { DataFrame frame = new DataFrame { Data = data.Data, StreamId = streamId, Length = data.Data.Length }; return frame; }