Merge pull request #439 from mono-soc-2012/garyb/iconfix
[mono.git] / mcs / class / System / System.Net / FtpWebResponse.cs
index 59fc10da1f79044017505e857d0fc7ef4de2b827..68f067744355ccedd7da79d0a65ee5c73b97b814 100644 (file)
 using System;
 using System.IO;
 using System.Runtime.Serialization;
-
-#if NET_2_0
+using System.Net;
 
 namespace System.Net
 {
        public class FtpWebResponse : WebResponse
        {
-               Stream stream = Stream.Null;
+               Stream stream;
                Uri uri;
                FtpStatusCode statusCode;
                DateTime lastModified = DateTime.MinValue;
@@ -28,14 +27,30 @@ namespace System.Net
                string method;
                //bool keepAlive;
                bool disposed;
+               FtpWebRequest request;
                internal long contentLength = -1;
                
-               internal FtpWebResponse (Uri uri, string method, bool keepAlive)
+               internal FtpWebResponse (FtpWebRequest request, Uri uri, string method, bool keepAlive)
                {
+                       this.request = request;
                        this.uri = uri;
                        this.method = method;
                        //this.keepAlive = keepAlive;
                }
+
+               internal FtpWebResponse (FtpWebRequest request, Uri uri, string method, FtpStatusCode statusCode, string statusDescription)
+               {
+                       this.request = request;
+                       this.uri = uri;
+                       this.method = method;
+                       this.statusCode = statusCode;
+                       this.statusDescription = statusDescription;
+               }
+
+               internal FtpWebResponse (FtpWebRequest request, Uri uri, string method, FtpStatus status) :
+                       this (request, uri, method, status.StatusCode, status.StatusDescription)
+               {
+               }
                
                public override long ContentLength {
                        get {
@@ -45,7 +60,7 @@ namespace System.Net
 
                public override WebHeaderCollection Headers {
                        get {
-                               return new WebHeaderCollection (true);
+                               return new WebHeaderCollection ();
                        }
                }
 
@@ -115,12 +130,19 @@ namespace System.Net
                                return;
                        
                        disposed = true;
-                       stream.Close ();
+                       if (stream != null) {
+                               stream.Close ();
+                               if (stream == Stream.Null)
+                                       request.OperationCompleted ();
+                       }
                        stream = null;
                }
 
                public override Stream GetResponseStream ()
                {
+                       if (stream == null)
+                               return Stream.Null; // After a STOR we get this
+                       
                        if (method != WebRequestMethods.Ftp.DownloadFile &&
                                        method != WebRequestMethods.Ftp.ListDirectory)
                                CheckDisposed ();
@@ -132,17 +154,13 @@ namespace System.Net
                        set {
                                stream = value;
                        }
-               }
 
-               internal void UpdateStatus (FtpStatusCode code, string desc)
-               {
-                       statusCode = code;
-                       statusDescription = desc;
+                       get { return stream; }
                }
 
-               ~FtpWebResponse ()
-               {
-                       ((IDisposable) this).Dispose ();
+               internal void UpdateStatus (FtpStatus status) {
+                       statusCode = status.StatusCode;
+                       statusDescription = status.StatusDescription;
                }
 
                void CheckDisposed ()
@@ -150,8 +168,11 @@ namespace System.Net
                        if (disposed)
                                throw new ObjectDisposedException (GetType ().FullName);
                }
+
+               internal bool IsFinal () {
+                       return ((int) statusCode >= 200);
+               }
        }
 }
 
-#endif