SftpVersionResponseBuilder.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System.Collections.Generic;
  2. using System.Text;
  3. using Renci.SshNet.Common;
  4. using Renci.SshNet.Sftp;
  5. namespace Renci.SshNet.Tests.Classes.Sftp
  6. {
  7. public class SftpVersionResponseBuilder
  8. {
  9. private readonly uint _version;
  10. private readonly IDictionary<string, string> _extensions;
  11. private SftpVersionResponseBuilder(uint version)
  12. {
  13. _version = version;
  14. _extensions = new Dictionary<string, string>();
  15. }
  16. public static SftpVersionResponseBuilder Create(uint version)
  17. {
  18. return new SftpVersionResponseBuilder(version);
  19. }
  20. public SftpVersionResponseBuilder AddExtension(string name, string data)
  21. {
  22. _extensions.Add(name, data);
  23. return this;
  24. }
  25. public byte[] Build()
  26. {
  27. var extensions = BuildExtensions();
  28. var sshDataStream = new SshDataStream(4 + 1 + 4 + extensions.Length);
  29. sshDataStream.Write((uint)sshDataStream.Capacity - 4);
  30. sshDataStream.WriteByte((byte)SftpMessageTypes.Version);
  31. sshDataStream.Write(_version);
  32. sshDataStream.Write(extensions, 0, extensions.Length);
  33. return sshDataStream.ToArray();
  34. }
  35. private byte[] BuildExtensions()
  36. {
  37. var sshDataStream = new SshDataStream(0);
  38. foreach (var extensionPair in _extensions)
  39. {
  40. sshDataStream.Write(extensionPair.Key, Encoding.ASCII);
  41. sshDataStream.Write(extensionPair.Value, Encoding.ASCII);
  42. }
  43. return sshDataStream.ToArray();
  44. }
  45. }
  46. }