public void Append(Message message) { if (_stream == null) { throw new ObjectDisposedException("LogWriter"); } if (message.Time != _time) { BlockHelper.WriteBlock(_stream, BlockType.Timestamp, new ArraySegment <byte>(LogHelper.DateTimeToBytes(message.Time))); _time = message.Time; } var blockType = message.Direction == MessageDirection.ClientToServer ? BlockType.Client : BlockType.Server; BlockHelper.WriteBlock(_stream, blockType, message.Data); _stream.Flush(); }
private void ReadHeader() { BlockType blockType; byte[] data; { // magic bytes BlockHelper.ReadBlock(_stream, out blockType, out data); if (blockType != BlockType.MagicBytes) { throw new FormatException("First block must be a MagicBytes block"); } if (!data.SequenceEqual(LogHelper.Encoding.GetBytes(LogHelper.MagicBytes))) { throw new FormatException("Incorrect magic bytes"); } } do { BlockHelper.ReadBlock(_stream, out blockType, out data); switch (blockType) { case BlockType.Start: break; case BlockType.Region: Header.Region = LogHelper.Encoding.GetString(data); break; case BlockType.MagicBytes: case BlockType.Timestamp: case BlockType.Server: case BlockType.Client: throw new FormatException($"Unexpected block type in header '{blockType}'"); } } while (blockType != BlockType.Start); }