ExitSignalRequestInfo.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. namespace Renci.SshNet.Messages.Connection
  2. {
  3. /// <summary>
  4. /// Represents "exit-signal" type channel request information
  5. /// </summary>
  6. internal class ExitSignalRequestInfo : RequestInfo
  7. {
  8. #if TUNING
  9. private byte[] _signalName;
  10. private byte[] _errorMessage;
  11. private byte[] _language;
  12. #endif
  13. /// <summary>
  14. /// Channel request name
  15. /// </summary>
  16. public const string NAME = "exit-signal";
  17. /// <summary>
  18. /// Gets the name of the request.
  19. /// </summary>
  20. /// <value>
  21. /// The name of the request.
  22. /// </value>
  23. public override string RequestName
  24. {
  25. get { return NAME; }
  26. }
  27. /// <summary>
  28. /// Gets the name of the signal.
  29. /// </summary>
  30. /// <value>
  31. /// The name of the signal.
  32. /// </value>
  33. #if TUNING
  34. public string SignalName
  35. {
  36. get { return Ascii.GetString(_signalName, 0, _signalName.Length); }
  37. private set { _signalName = Ascii.GetBytes(value); }
  38. }
  39. #else
  40. public string SignalName { get; private set; }
  41. #endif
  42. /// <summary>
  43. /// Gets a value indicating whether core is dumped.
  44. /// </summary>
  45. /// <value>
  46. /// <c>true</c> if core is dumped; otherwise, <c>false</c>.
  47. /// </value>
  48. public bool CoreDumped { get; private set; }
  49. /// <summary>
  50. /// Gets the error message.
  51. /// </summary>
  52. #if TUNING
  53. public string ErrorMessage
  54. {
  55. get { return Utf8.GetString(_errorMessage, 0, _errorMessage.Length); }
  56. private set { _errorMessage = Utf8.GetBytes(value); }
  57. }
  58. #else
  59. public string ErrorMessage { get; private set; }
  60. #endif
  61. /// <summary>
  62. /// Gets message language.
  63. /// </summary>
  64. #if TUNING
  65. public string Language
  66. {
  67. get { return Utf8.GetString(_language, 0, _language.Length); }
  68. private set { _language = Utf8.GetBytes(value); }
  69. }
  70. #else
  71. public string Language { get; private set; }
  72. #endif
  73. #if TUNING
  74. protected override int BufferCapacity
  75. {
  76. get
  77. {
  78. var capacity = base.BufferCapacity;
  79. capacity += 4; // SignalName length
  80. capacity += _signalName.Length; // SignalName
  81. capacity += 1; // CoreDumped
  82. capacity += 4; // ErrorMessage length
  83. capacity += _errorMessage.Length; // ErrorMessage
  84. capacity += 4; // Language length
  85. capacity += _language.Length; // Language
  86. return capacity;
  87. }
  88. }
  89. #endif
  90. /// <summary>
  91. /// Initializes a new instance of the <see cref="ExitSignalRequestInfo"/> class.
  92. /// </summary>
  93. public ExitSignalRequestInfo()
  94. {
  95. WantReply = false;
  96. }
  97. /// <summary>
  98. /// Initializes a new instance of the <see cref="ExitSignalRequestInfo"/> class.
  99. /// </summary>
  100. /// <param name="signalName">Name of the signal.</param>
  101. /// <param name="coreDumped">if set to <c>true</c> then core is dumped.</param>
  102. /// <param name="errorMessage">The error message.</param>
  103. /// <param name="language">The language.</param>
  104. public ExitSignalRequestInfo(string signalName, bool coreDumped, string errorMessage, string language)
  105. : this()
  106. {
  107. SignalName = signalName;
  108. CoreDumped = coreDumped;
  109. ErrorMessage = errorMessage;
  110. Language = language;
  111. }
  112. /// <summary>
  113. /// Called when type specific data need to be loaded.
  114. /// </summary>
  115. protected override void LoadData()
  116. {
  117. base.LoadData();
  118. #if TUNING
  119. _signalName = ReadBinary();
  120. #else
  121. SignalName = ReadAsciiString();
  122. #endif
  123. CoreDumped = ReadBoolean();
  124. #if TUNING
  125. _errorMessage = ReadBinary();
  126. _language = ReadBinary();
  127. #else
  128. ErrorMessage = ReadString();
  129. Language = ReadString();
  130. #endif
  131. }
  132. /// <summary>
  133. /// Called when type specific data need to be saved.
  134. /// </summary>
  135. protected override void SaveData()
  136. {
  137. base.SaveData();
  138. #if TUNING
  139. WriteBinaryString(_signalName);
  140. #else
  141. WriteAscii(SignalName);
  142. #endif
  143. Write(CoreDumped);
  144. #if TUNING
  145. Write(_errorMessage);
  146. Write(_language);
  147. #else
  148. Write(ErrorMessage);
  149. Write(Language);
  150. #endif
  151. }
  152. }
  153. }