Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4.  
  5. namespace Tera.PacketLog
  6. {
  7. public class PacketLogReader
  8. {
  9. private readonly Stream _stream;
  10.  
  11. private DateTime _time;
  12.  
  13. internal PacketLogReader(Stream stream)
  14. {
  15. _stream = stream;
  16. Header = new LogHeader();
  17. ReadHeader();
  18. }
  19.  
  20. public LogHeader Header { get; }
  21.  
  22. private void ReadHeader()
  23. {
  24. BlockType blockType;
  25. byte[] data;
  26.  
  27. {
  28. // magic bytes
  29. BlockHelper.ReadBlock(_stream, out blockType, out data);
  30. if (blockType != BlockType.MagicBytes)
  31. throw new FormatException("First block must be a MagicBytes block");
  32. if (!data.SequenceEqual(LogHelper.Encoding.GetBytes(LogHelper.MagicBytes)))
  33. throw new FormatException("Incorrect magic bytes");
  34. }
  35.  
  36. do
  37. {
  38. BlockHelper.ReadBlock(_stream, out blockType, out data);
  39. switch (blockType)
  40. {
  41. case BlockType.Start:
  42. break;
  43. case BlockType.Region:
  44. Header.Region = LogHelper.Encoding.GetString(data);
  45. break;
  46. case BlockType.MagicBytes:
  47. case BlockType.Timestamp:
  48. case BlockType.Server:
  49. case BlockType.Client:
  50. throw new FormatException($"Unexpected block type in header '{blockType}'");
  51. }
  52. } while (blockType != BlockType.Start);
  53. }
  54.  
  55. public Message ReadMessage()
  56. {
  57. while (_stream.Position != _stream.Length)
  58. {
  59. BlockType blockType;
  60. byte[] data;
  61. BlockHelper.ReadBlock(_stream, out blockType, out data);
  62. MessageDirection direction;
  63. switch (blockType)
  64. {
  65. case BlockType.Timestamp:
  66. _time = LogHelper.BytesToTimeSpan(data);
  67. break;
  68. case BlockType.Client:
  69. direction = MessageDirection.ClientToServer;
  70. return new Message(_time, direction, new ArraySegment<byte>(data));
  71. case BlockType.Server:
  72. direction = MessageDirection.ServerToClient;
  73. return new Message(_time, direction, new ArraySegment<byte>(data));
  74. default:
  75. throw new FormatException($"Unexpected blocktype {blockType}");
  76. }
  77. }
  78. return null;
  79. }
  80. }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement