Advertisement
Guest User

Untitled

a guest
Aug 30th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. public class PacketStream : IDisposable
  2. {
  3. public bool Connected { get; private set; } = true;
  4. public IAvailabilityStream Stream { get { return _stream; } }
  5. private readonly PacketStreamReader _reader;
  6. private readonly PacketStreamWriter _writer;
  7. private readonly IAvailabilityStream _stream;
  8. private readonly Dictionary<int, Func<PacketStreamReader, PacketBase>> _readerStrategies = new Dictionary<int, Func<PacketStreamReader, PacketBase>>();
  9. private readonly Dictionary<int, Action<PacketStreamWriter, PacketBase>> _writerStrategies = new Dictionary<int, Action<PacketStreamWriter, PacketBase>>();
  10.  
  11. private readonly PacketBase _emptyPacket = new EmptyPacket();
  12.  
  13. internal PacketStream(IAvailabilityStream stream)
  14. {
  15. _stream = stream;
  16. _reader = new PacketStreamReader(stream, Encoding.UTF8);
  17. _writer = new PacketStreamWriter(stream, Encoding.UTF8);
  18. }
  19.  
  20. public void Write(PacketBase packet)
  21. {
  22. if (!_writerStrategies.ContainsKey(packet.PacketTypeId))
  23. {
  24. throw new InvalidOperationException($"Packet with ID {packet.PacketTypeId} was not found in WriterStrategies.");
  25. }
  26. try
  27. {
  28. _writer.Write(packet.PacketTypeId);
  29. _writerStrategies[packet.PacketTypeId](_writer, packet);
  30. }
  31. catch (Exception e)
  32. {
  33. Connected = false;
  34. }
  35. }
  36.  
  37. public async Task WriteAsyc(PacketBase packet)
  38. {
  39. if (!_writerStrategies.ContainsKey(packet.PacketTypeId))
  40. {
  41. throw new InvalidOperationException($"Packet with ID {packet.PacketTypeId} was not found in WriterStrategies.");
  42. }
  43. await _writer.WriteAsync(packet.PacketTypeId);
  44. _writerStrategies[packet.PacketTypeId](_writer, packet);
  45. }
  46.  
  47. public PacketBase Read()
  48. {
  49. if (!_stream.DataAvailable)
  50. return _emptyPacket;
  51.  
  52. var packetTypeId = _reader.ReadInt32();
  53.  
  54. if (!_readerStrategies.ContainsKey(packetTypeId))
  55. {
  56. throw new InvalidOperationException($"Packet with ID {packetTypeId} was not found in ReaderStrategies.");
  57. }
  58. return _readerStrategies[packetTypeId](_reader);
  59. }
  60.  
  61. public async Task<PacketBase> ReadAsync()
  62. {
  63. if (!_stream.DataAvailable)
  64. return _emptyPacket;
  65.  
  66. var packetTypeId = await _reader.ReadInt32Async();
  67.  
  68. if (!_readerStrategies.ContainsKey(packetTypeId))
  69. {
  70. throw new InvalidOperationException($"Packet with ID {packetTypeId} was not found in ReaderStrategies.");
  71. }
  72. return _readerStrategies[packetTypeId](_reader);
  73. }
  74.  
  75. public void Register<T>(int identifier, Func<PacketStreamReader, T, T> reader, Action<PacketStreamWriter, T> writer) where T : PacketBase, new()
  76. {
  77. if (_readerStrategies.ContainsKey(identifier) || _writerStrategies.ContainsKey(identifier))
  78. {
  79. throw new InvalidOperationException();
  80. }
  81. _readerStrategies.Add(identifier, (binaryReader) => reader(_reader, new T()));
  82. _writerStrategies.Add(identifier, (binaryReader, packetBase) => writer(_writer, (T)packetBase));
  83. }
  84.  
  85. public void Dispose()
  86. {
  87. _reader.Dispose();
  88. _writer.Dispose();
  89. _stream.Dispose();
  90. }
  91. }
  92.  
  93. public class PacketStreamFactory
  94. {
  95. public static PacketStream CreateLoginServerPacketStream(IAvailabilityStream stream)
  96. {
  97. var packetStream = new PacketStream(stream);
  98. packetStream.Register<HeartbeatPacket>((int)PacketType.HEARTBEAT, Read, Write);
  99. packetStream.Register<LoginPacket>((int)PacketType.LOGIN, Read, Write);
  100. packetStream.Register<AuthSuccessPacket>((int)PacketType.AUTH_SUCCESS, Read, Write);
  101. packetStream.Register<AuthFailurePacket>((int)PacketType.AUTH_FAILURE, Read, Write);
  102. return packetStream;
  103. }
  104.  
  105. public static PacketStream CreateLobbyPacketStream(IAvailabilityStream stream)
  106. {
  107. var packetStream = new PacketStream(stream);
  108. packetStream.Register<HeartbeatPacket>((int)PacketType.HEARTBEAT, Read, Write);
  109. packetStream.Register<ChatMessagePacket>((int)PacketType.CHAT_MESSAGE, Read, Write);
  110. packetStream.Register<CreateRoomPacket>((int)PacketType.CREATE_ROOM, Read, Write);
  111. packetStream.Register<CreateRoomResponsePacket>((int)PacketType.CREATE_ROOM_RESPONSE, Read, Write);
  112. packetStream.Register<RoomPresencePacket>((int)PacketType.ROOM_PRESENCE, Read, Write);
  113. packetStream.Register<RosterItemPacket>((int)PacketType.ROSTER_ITEM, Read, Write);
  114. packetStream.Register<PresencePacket>((int)PacketType.PRESENCE, Read, Write);
  115. packetStream.Register<StatusPacket>((int)PacketType.STATUS, Read, Write);
  116. return packetStream;
  117. }
  118.  
  119. #region LOGIN
  120. private static void Write(PacketStreamWriter binaryWriter, LoginPacket loginPacket)
  121. {
  122. binaryWriter.Write(loginPacket.Username);
  123. binaryWriter.Write(loginPacket.Password);
  124. }
  125.  
  126. private static LoginPacket Read(PacketStreamReader binaryReader, LoginPacket loginPacket)
  127. {
  128. loginPacket.Username = binaryReader.ReadString();
  129. loginPacket.Password = binaryReader.ReadString();
  130. return loginPacket;
  131. }
  132. #endregion
  133. }
  134.  
  135. Dictionary<int, object> _readerStrategies;
  136. _readerStrategies.Add((int)PacketType.HEARTBEAT, new object());
  137. _readerStrategies[packet.PacketTypeId];
  138.  
  139. Dictionary<PacketType, object> _readerStrategies;
  140. _readerStrategies.Add(PacketType.HEARTBEAT, new object());
  141. _readerStrategies[(PacketType)packet.PacketTypeId];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement