浏览代码

Refactor SftpMessage to work with WindowsPhone correctly
Clean up unused code

olegkap_cp 14 年之前
父节点
当前提交
50c8b3c6f2

+ 0 - 19
Renci.SshClient/Renci.SshNet/Messages/Message.cs

@@ -10,25 +10,6 @@ namespace Renci.SshNet.Messages
     /// </summary>
     public abstract class Message : SshData
     {
-        /// <summary>
-        /// Loads the specified data.
-        /// </summary>
-        /// <typeparam name="T">SSH message type</typeparam>
-        /// <param name="data">Message data.</param>
-        /// <returns>SSH message object</returns>
-        internal static T Load<T>(byte[] data) where T : Message, new()
-        {
-            T message = new T();
-
-            message.LoadBytes(data);
-
-            message.ResetReader();
-
-            message.LoadData();
-
-            return message;
-        }
-
         /// <summary>
         /// Gets the index that represents zero in current data type.
         /// </summary>

+ 26 - 27
Renci.SshClient/Renci.SshNet/Sftp/SftpMessage.cs

@@ -9,10 +9,6 @@ namespace Renci.SshNet.Sftp
 {
     internal abstract class SftpMessage : SshData
     {
-        private delegate T LoadFunc<out T>(byte[] data);
-
-        private static IDictionary<SftpMessageTypes, LoadFunc<SftpMessage>> _sftpMessageTypes = new Dictionary<SftpMessageTypes, LoadFunc<SftpMessage>>();
-
         public new static SftpMessage Load(byte[] data)
         {
             var messageType = (SftpMessageTypes)data.FirstOrDefault();
@@ -28,18 +24,6 @@ namespace Renci.SshNet.Sftp
             }
         }
 
-        static SftpMessage()
-        {
-            //  Register only messages that can be received by the client
-            SftpMessage._sftpMessageTypes.Add(SftpMessageTypes.Version, new LoadFunc<SftpMessage>(Load<SftpVersionResponse>));
-            SftpMessage._sftpMessageTypes.Add(SftpMessageTypes.Status, new LoadFunc<SftpMessage>(Load<SftpStatusResponse>));
-            SftpMessage._sftpMessageTypes.Add(SftpMessageTypes.Data, new LoadFunc<SftpMessage>(Load<SftpDataResponse>));
-            SftpMessage._sftpMessageTypes.Add(SftpMessageTypes.Handle, new LoadFunc<SftpMessage>(Load<SftpHandleResponse>));
-            SftpMessage._sftpMessageTypes.Add(SftpMessageTypes.Name, new LoadFunc<SftpMessage>(Load<SftpNameResponse>));
-            SftpMessage._sftpMessageTypes.Add(SftpMessageTypes.Attrs, new LoadFunc<SftpMessage>(Load<SftpAttrsResponse>));
-            SftpMessage._sftpMessageTypes.Add(SftpMessageTypes.Extended, new LoadFunc<SftpMessage>(Load<SftpExtendedReplyResponse>));
-        }
-
         public abstract SftpMessageTypes SftpMessageType { get; }
 
         protected override void LoadData()
@@ -170,19 +154,34 @@ namespace Renci.SshNet.Sftp
 
         private static SftpMessage Load(byte[] data, SftpMessageTypes messageType)
         {
-            if (SftpMessage._sftpMessageTypes.ContainsKey(messageType))
-            {
-                return SftpMessage._sftpMessageTypes[messageType](data);
-            }
-            else
+            SftpMessage message = null;
+
+            switch (messageType)
             {
-                throw new NotSupportedException(string.Format(CultureInfo.CurrentCulture, "Message type '{0}' is not registered.", messageType));
+                case SftpMessageTypes.Version:
+                    message = new SftpVersionResponse();
+                    break;
+                case SftpMessageTypes.Status:
+                    message = new SftpStatusResponse();
+                    break;
+                case SftpMessageTypes.Data:
+                    message = new SftpDataResponse();
+                    break;
+                case SftpMessageTypes.Handle:
+                    message = new SftpHandleResponse();
+                    break;
+                case SftpMessageTypes.Name:
+                    message = new SftpNameResponse();
+                    break;
+                case SftpMessageTypes.Attrs:
+                    message = new SftpAttrsResponse();
+                    break;
+                case SftpMessageTypes.ExtendedReply:
+                    message = new SftpExtendedReplyResponse();
+                    break;
+                default:
+                    throw new NotSupportedException(string.Format(CultureInfo.CurrentCulture, "Message type '{0}' is not supported.", messageType));
             }
-        }
-
-        private static T Load<T>(byte[] data) where T : SftpMessage, new()
-        {
-            T message = new T();
 
             message.LoadBytes(data);
 

+ 9 - 14
Renci.SshClient/Renci.SshNet/Sftp/SftpSession.cs

@@ -39,24 +39,19 @@ namespace Renci.SshNet.Sftp
         {
             get
             {
+#if WINDOWS_PHONE
+                lock (this)
+                {
+                    this._requestId++;
+                }
+
+                return (uint)this._requestId;
+#else
                 return ((uint)Interlocked.Increment(ref this._requestId));
+#endif
             }
         }
 
-        #region SFTP messages
-
-        //internal event EventHandler<MessageEventArgs<StatusMessage>> StatusMessageReceived;
-
-        //internal event EventHandler<MessageEventArgs<DataMessage>> DataMessageReceived;
-
-        //internal event EventHandler<MessageEventArgs<HandleMessage>> HandleMessageReceived;
-
-        //internal event EventHandler<MessageEventArgs<NameMessage>> NameMessageReceived;
-
-        //internal event EventHandler<MessageEventArgs<AttributesMessage>> AttributesMessageReceived;
-
-        #endregion
-
         public SftpSession(Session session, TimeSpan operationTimeout)
             : base(session, "sftp", operationTimeout)
         {