/// <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;
 }