Message.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using System.Diagnostics.Contracts;
  3. namespace FxSsh.Messages
  4. {
  5. public abstract class Message
  6. {
  7. public abstract byte MessageType { get; }
  8. protected byte[] RawBytes { get; set; }
  9. public void Load(byte[] bytes)
  10. {
  11. Contract.Requires(bytes != null);
  12. RawBytes = bytes;
  13. using (var worker = new SshDataWorker(bytes))
  14. {
  15. var number = worker.ReadByte();
  16. if (number != MessageType)
  17. throw new ArgumentException(string.Format("Message type {0} is not valid.", number));
  18. OnLoad(worker);
  19. }
  20. }
  21. public byte[] GetPacket()
  22. {
  23. using (var worker = new SshDataWorker())
  24. {
  25. worker.Write(MessageType);
  26. OnGetPacket(worker);
  27. return worker.ToByteArray();
  28. }
  29. }
  30. public static T LoadFrom<T>(Message message) where T : Message, new()
  31. {
  32. Contract.Requires(message != null);
  33. var msg = new T();
  34. msg.Load(message.RawBytes);
  35. return msg;
  36. }
  37. protected virtual void OnLoad(SshDataWorker reader)
  38. {
  39. Contract.Requires(reader != null);
  40. throw new NotSupportedException();
  41. }
  42. protected virtual void OnGetPacket(SshDataWorker writer)
  43. {
  44. Contract.Requires(writer != null);
  45. throw new NotSupportedException();
  46. }
  47. }
  48. }