|
|
@@ -1,5 +1,4 @@
|
|
|
using System.IO;
|
|
|
-using System.Linq;
|
|
|
using Renci.SshNet.Common;
|
|
|
using System.Globalization;
|
|
|
using Renci.SshNet.Abstractions;
|
|
|
@@ -31,13 +30,22 @@ namespace Renci.SshNet.Messages
|
|
|
/// </summary>
|
|
|
protected override void WriteBytes(SshDataStream stream)
|
|
|
{
|
|
|
- var messageAttribute = GetType().GetCustomAttributes<MessageAttribute>(true).FirstOrDefault();
|
|
|
-
|
|
|
- if (messageAttribute == null)
|
|
|
- throw new SshException(string.Format(CultureInfo.CurrentCulture, "Type '{0}' is not a valid message type.", GetType().AssemblyQualifiedName));
|
|
|
+ var enumerator = GetType().GetCustomAttributes<MessageAttribute>(true).GetEnumerator();
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (!enumerator.MoveNext())
|
|
|
+ {
|
|
|
+ throw new SshException(string.Format(CultureInfo.CurrentCulture, "Type '{0}' is not a valid message type.", GetType().AssemblyQualifiedName));
|
|
|
+ }
|
|
|
|
|
|
- stream.WriteByte(messageAttribute.Number);
|
|
|
- base.WriteBytes(stream);
|
|
|
+ var messageAttribute = enumerator.Current;
|
|
|
+ stream.WriteByte(messageAttribute.Number);
|
|
|
+ base.WriteBytes(stream);
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ enumerator.Dispose();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
internal byte[] GetPacket(byte paddingMultiplier, Compressor compressor)
|
|
|
@@ -155,12 +163,20 @@ namespace Renci.SshNet.Messages
|
|
|
/// </returns>
|
|
|
public override string ToString()
|
|
|
{
|
|
|
- var messageAttribute = GetType().GetCustomAttributes<MessageAttribute>(true).SingleOrDefault();
|
|
|
-
|
|
|
- if (messageAttribute == null)
|
|
|
- return string.Format(CultureInfo.CurrentCulture, "'{0}' without Message attribute.", GetType().FullName);
|
|
|
+ var enumerator = GetType().GetCustomAttributes<MessageAttribute>(true).GetEnumerator();
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (!enumerator.MoveNext())
|
|
|
+ {
|
|
|
+ return string.Format(CultureInfo.CurrentCulture, "'{0}' without Message attribute.", GetType().FullName);
|
|
|
+ }
|
|
|
|
|
|
- return messageAttribute.Name;
|
|
|
+ return enumerator.Current.Name;
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ enumerator.Dispose();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|