RPCMessage.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.IO;
  3. using InABox.Core;
  4. namespace InABox.Rpc
  5. {
  6. [Serializable]
  7. public partial class RpcMessage : ISerializeBinary, ICoreFormattable
  8. {
  9. public Guid Id { get; set; }
  10. public String Command { get; set; }
  11. public byte[] Payload { get; set; }
  12. public RpcError Error { get; set; }
  13. public override string ToString() => $"{Command} [{Error}]";
  14. public RpcMessage()
  15. {
  16. Id = Guid.NewGuid();
  17. Command = "";
  18. Payload = Array.Empty<byte>();
  19. Error = RpcError.NONE;
  20. }
  21. public RpcMessage(Guid id, string command, byte[] payload) : this()
  22. {
  23. Id = id;
  24. Command = command;
  25. Payload = payload;
  26. Error = RpcError.NONE;
  27. }
  28. public void SerializeBinary(CoreBinaryWriter writer)
  29. {
  30. writer.Write(Id);
  31. writer.Write(Command);
  32. writer.WriteBinaryValue(Payload);
  33. writer.Write(Error.ToString());
  34. }
  35. public void DeserializeBinary(CoreBinaryReader reader)
  36. {
  37. Id = reader.ReadGuid();
  38. Command = reader.ReadString();
  39. Payload = reader.ReadBinaryValue<byte[]>();
  40. if (Enum.TryParse<RpcError>(reader.ReadString(), out var error))
  41. Error = error;
  42. }
  43. public void Write(BinaryWriter writer)
  44. {
  45. writer.Write(Id);
  46. writer.Write(Command);
  47. writer.Write(Payload.Length);
  48. writer.Write(Payload);
  49. writer.Write((Int32)Error);
  50. }
  51. public void Read(BinaryReader reader)
  52. {
  53. Id = reader.ReadGuid();
  54. Command = reader.ReadString();
  55. var _length = reader.ReadInt32();
  56. Payload = reader.ReadBytes(_length);
  57. Error = (RpcError)reader.ReadInt32();
  58. }
  59. }
  60. }