فهرست منبع

Optimize handling response actions.

Gert Driesen 8 سال پیش
والد
کامیت
807e9fc14e

+ 17 - 1
src/Renci.SshNet/Sftp/Requests/ExtendedRequests/FStatVfsRequest.cs

@@ -5,6 +5,8 @@ namespace Renci.SshNet.Sftp.Requests
 {
     internal class FStatVfsRequest : SftpExtendedRequest
     {
+        private readonly Action<SftpExtendedReplyResponse> _extendedReplyAction;
+
         public byte[] Handle { get; private set; }
 
         /// <summary>
@@ -28,7 +30,8 @@ namespace Renci.SshNet.Sftp.Requests
             : base(protocolVersion, requestId, statusAction, "fstatvfs@openssh.com")
         {
             Handle = handle;
-            SetAction(extendedAction);
+
+            _extendedReplyAction = extendedAction;
         }
 
         protected override void SaveData()
@@ -36,5 +39,18 @@ namespace Renci.SshNet.Sftp.Requests
             base.SaveData();
             WriteBinaryString(Handle);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var extendedReplyResponse = response as SftpExtendedReplyResponse;
+            if (extendedReplyResponse != null)
+            {
+                _extendedReplyAction(extendedReplyResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 16 - 1
src/Renci.SshNet/Sftp/Requests/ExtendedRequests/StatVfsRequest.cs

@@ -7,6 +7,7 @@ namespace Renci.SshNet.Sftp.Requests
     internal class StatVfsRequest : SftpExtendedRequest
     {
         private byte[] _path;
+        private readonly Action<SftpExtendedReplyResponse> _extendedReplyAction;
 
         public string Path
         {
@@ -38,7 +39,8 @@ namespace Renci.SshNet.Sftp.Requests
         {
             Encoding = encoding;
             Path = path;
-            SetAction(extendedAction);
+
+            _extendedReplyAction = extendedAction;
         }
 
         protected override void SaveData()
@@ -46,5 +48,18 @@ namespace Renci.SshNet.Sftp.Requests
             base.SaveData();
             WriteBinaryString(_path);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var extendedReplyResponse = response as SftpExtendedReplyResponse;
+            if (extendedReplyResponse != null)
+            {
+                _extendedReplyAction(extendedReplyResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 16 - 1
src/Renci.SshNet/Sftp/Requests/SftpFStatRequest.cs

@@ -5,6 +5,8 @@ namespace Renci.SshNet.Sftp.Requests
 {
     internal class SftpFStatRequest : SftpRequest
     {
+        private readonly Action<SftpAttrsResponse> _attrsAction;
+
         public override SftpMessageTypes SftpMessageType
         {
             get { return SftpMessageTypes.FStat; }
@@ -33,7 +35,7 @@ namespace Renci.SshNet.Sftp.Requests
             : base(protocolVersion, requestId, statusAction)
         {
             Handle = handle;
-            SetAction(attrsAction);
+            _attrsAction = attrsAction;
         }
 
         protected override void LoadData()
@@ -47,5 +49,18 @@ namespace Renci.SshNet.Sftp.Requests
             base.SaveData();
             WriteBinaryString(Handle);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var attrsResponse = response as SftpAttrsResponse;
+            if (attrsResponse != null)
+            {
+                _attrsAction(attrsResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 15 - 1
src/Renci.SshNet/Sftp/Requests/SftpLStatRequest.cs

@@ -7,6 +7,7 @@ namespace Renci.SshNet.Sftp.Requests
     internal class SftpLStatRequest : SftpRequest
     {
         private byte[] _path;
+        private readonly Action<SftpAttrsResponse> _attrsAction;
 
         public override SftpMessageTypes SftpMessageType
         {
@@ -43,7 +44,7 @@ namespace Renci.SshNet.Sftp.Requests
         {
             Encoding = encoding;
             Path = path;
-            SetAction(attrsAction);
+            _attrsAction = attrsAction;
         }
 
         protected override void LoadData()
@@ -57,5 +58,18 @@ namespace Renci.SshNet.Sftp.Requests
             base.SaveData();
             WriteBinaryString(_path);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var attrsResponse = response as SftpAttrsResponse;
+            if (attrsResponse != null)
+            {
+                _attrsAction(attrsResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 16 - 1
src/Renci.SshNet/Sftp/Requests/SftpOpenDirRequest.cs

@@ -7,6 +7,7 @@ namespace Renci.SshNet.Sftp.Requests
     internal class SftpOpenDirRequest : SftpRequest
     {
         private byte[] _path;
+        private readonly Action<SftpHandleResponse> _handleAction;
 
         public override SftpMessageTypes SftpMessageType
         {
@@ -43,7 +44,8 @@ namespace Renci.SshNet.Sftp.Requests
         {
             Encoding = encoding;
             Path = path;
-            SetAction(handleAction);
+
+            _handleAction = handleAction;
         }
 
         protected override void LoadData()
@@ -59,5 +61,18 @@ namespace Renci.SshNet.Sftp.Requests
 
             WriteBinaryString(_path);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var handleResponse = response as SftpHandleResponse;
+            if (handleResponse != null)
+            {
+                _handleAction(handleResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 15 - 1
src/Renci.SshNet/Sftp/Requests/SftpOpenRequest.cs

@@ -8,6 +8,7 @@ namespace Renci.SshNet.Sftp.Requests
     {
         private byte[] _fileName;
         private byte[] _attributes;
+        private readonly Action<SftpHandleResponse> _handleAction;
 
         public override SftpMessageTypes SftpMessageType
         {
@@ -62,7 +63,7 @@ namespace Renci.SshNet.Sftp.Requests
             Flags = flags;
             Attributes = attributes;
 
-            SetAction(handleAction);
+            _handleAction = handleAction;
         }
 
         protected override void LoadData()
@@ -79,5 +80,18 @@ namespace Renci.SshNet.Sftp.Requests
             Write((uint) Flags);
             Write(_attributes);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var handleResponse = response as SftpHandleResponse;
+            if (handleResponse != null)
+            {
+                _handleAction(handleResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 17 - 1
src/Renci.SshNet/Sftp/Requests/SftpReadDirRequest.cs

@@ -5,6 +5,8 @@ namespace Renci.SshNet.Sftp.Requests
 {
     internal class SftpReadDirRequest : SftpRequest
     {
+        private readonly Action<SftpNameResponse> _nameAction;
+
         public override SftpMessageTypes SftpMessageType
         {
             get { return SftpMessageTypes.ReadDir; }
@@ -33,7 +35,8 @@ namespace Renci.SshNet.Sftp.Requests
             : base(protocolVersion, requestId, statusAction)
         {
             Handle = handle;
-            SetAction(nameAction);
+
+            _nameAction = nameAction;
         }
 
         protected override void LoadData()
@@ -47,5 +50,18 @@ namespace Renci.SshNet.Sftp.Requests
             base.SaveData();
             WriteBinaryString(Handle);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var nameResponse = response as SftpNameResponse;
+            if (nameResponse != null)
+            {
+                _nameAction(nameResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 16 - 1
src/Renci.SshNet/Sftp/Requests/SftpReadLinkRequest.cs

@@ -7,6 +7,7 @@ namespace Renci.SshNet.Sftp.Requests
     internal class SftpReadLinkRequest : SftpRequest
     {
         private byte[] _path;
+        private readonly Action<SftpNameResponse> _nameAction;
 
         public override SftpMessageTypes SftpMessageType
         {
@@ -43,7 +44,8 @@ namespace Renci.SshNet.Sftp.Requests
         {
             Encoding = encoding;
             Path = path;
-            SetAction(nameAction);
+
+            _nameAction = nameAction;
         }
 
         protected override void LoadData()
@@ -59,5 +61,18 @@ namespace Renci.SshNet.Sftp.Requests
 
             WriteBinaryString(_path);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var nameResponse = response as SftpNameResponse;
+            if (nameResponse != null)
+            {
+                _nameAction(nameResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 16 - 1
src/Renci.SshNet/Sftp/Requests/SftpReadRequest.cs

@@ -5,6 +5,8 @@ namespace Renci.SshNet.Sftp.Requests
 {
     internal class SftpReadRequest : SftpRequest
     {
+        private readonly Action<SftpDataResponse> _dataAction;
+
         public override SftpMessageTypes SftpMessageType
         {
             get { return SftpMessageTypes.Read; }
@@ -41,7 +43,7 @@ namespace Renci.SshNet.Sftp.Requests
             Handle = handle;
             Offset = offset;
             Length = length;
-            SetAction(dataAction);
+            _dataAction = dataAction;
         }
 
         protected override void LoadData()
@@ -59,5 +61,18 @@ namespace Renci.SshNet.Sftp.Requests
             Write(Offset);
             Write(Length);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var dataResponse = response as SftpDataResponse;
+            if (dataResponse != null)
+            {
+                _dataAction(dataResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 16 - 4
src/Renci.SshNet/Sftp/Requests/SftpRealPathRequest.cs

@@ -7,6 +7,7 @@ namespace Renci.SshNet.Sftp.Requests
     internal class SftpRealPathRequest : SftpRequest
     {
         private byte[] _path;
+        private readonly Action<SftpNameResponse> _nameAction;
 
         public override SftpMessageTypes SftpMessageType
         {
@@ -43,13 +44,11 @@ namespace Renci.SshNet.Sftp.Requests
         {
             if (nameAction == null)
                 throw new ArgumentNullException("nameAction");
-            if (statusAction == null)
-                throw new ArgumentNullException("statusAction");
 
             Encoding = encoding;
             Path = path;
-            SetAction(nameAction);
-            
+
+            _nameAction = nameAction;
         }
 
         protected override void SaveData()
@@ -57,5 +56,18 @@ namespace Renci.SshNet.Sftp.Requests
             base.SaveData();
             WriteBinaryString(_path);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var nameResponse = response as SftpNameResponse;
+            if (nameResponse != null)
+            {
+                _nameAction(nameResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }

+ 4 - 53
src/Renci.SshNet/Sftp/Requests/SftpRequest.cs

@@ -6,11 +6,6 @@ namespace Renci.SshNet.Sftp.Requests
     internal abstract class SftpRequest : SftpMessage
     {
         private readonly Action<SftpStatusResponse> _statusAction;
-        private Action<SftpAttrsResponse> _attrsAction;
-        private Action<SftpDataResponse> _dataAction;
-        private Action<SftpExtendedReplyResponse> _extendedReplyAction;
-        private Action<SftpHandleResponse> _handleAction;
-        private Action<SftpNameResponse> _nameAction;
 
         public uint RequestId { get; private set; }
         
@@ -39,31 +34,12 @@ namespace Renci.SshNet.Sftp.Requests
             _statusAction = statusAction;
         }
 
-        public void Complete(SftpResponse response)
+        public virtual void Complete(SftpResponse response)
         {
-            if (response is SftpStatusResponse)
+            var statusResponse = response as SftpStatusResponse;
+            if (statusResponse != null)
             {
-                _statusAction(response as SftpStatusResponse);
-            }
-            else if (response is SftpAttrsResponse)
-            {
-                _attrsAction(response as SftpAttrsResponse);
-            }
-            else if (response is SftpDataResponse)
-            {
-                _dataAction(response as SftpDataResponse);
-            }
-            else if (response is SftpExtendedReplyResponse)
-            {
-                _extendedReplyAction(response as SftpExtendedReplyResponse);
-            }
-            else if (response is SftpHandleResponse)
-            {
-                _handleAction(response as SftpHandleResponse);
-            }
-            else if (response is SftpNameResponse)
-            {
-                _nameAction(response as SftpNameResponse);
+                _statusAction(statusResponse);
             }
             else
             {
@@ -71,31 +47,6 @@ namespace Renci.SshNet.Sftp.Requests
             }
         }
 
-        protected void SetAction(Action<SftpAttrsResponse> action)
-        {
-            _attrsAction = action;
-        }
-
-        protected void SetAction(Action<SftpDataResponse> action)
-        {
-            _dataAction = action;
-        }
-
-        protected void SetAction(Action<SftpExtendedReplyResponse> action)
-        {
-            _extendedReplyAction = action;
-        }
-
-        protected void SetAction(Action<SftpHandleResponse> action)
-        {
-            _handleAction = action;
-        }
-
-        protected void SetAction(Action<SftpNameResponse> action)
-        {
-            _nameAction = action;
-        }
-
         protected override void LoadData()
         {
             throw new InvalidOperationException("Request cannot be saved.");

+ 15 - 1
src/Renci.SshNet/Sftp/Requests/SftpStatRequest.cs

@@ -7,6 +7,7 @@ namespace Renci.SshNet.Sftp.Requests
     internal class SftpStatRequest : SftpRequest
     {
         private byte[] _path;
+        private readonly Action<SftpAttrsResponse> _attrsAction;
 
         public override SftpMessageTypes SftpMessageType
         {
@@ -43,7 +44,7 @@ namespace Renci.SshNet.Sftp.Requests
         {
             Encoding = encoding;
             Path = path;
-            SetAction(attrsAction);
+            _attrsAction = attrsAction;
         }
 
         protected override void LoadData()
@@ -57,5 +58,18 @@ namespace Renci.SshNet.Sftp.Requests
             base.SaveData();
             WriteBinaryString(_path);
         }
+
+        public override void Complete(SftpResponse response)
+        {
+            var attrsResponse = response as SftpAttrsResponse;
+            if (attrsResponse != null)
+            {
+                _attrsAction(attrsResponse);
+            }
+            else
+            {
+                base.Complete(response);
+            }
+        }
     }
 }