2009-01-26 Gonzalo Paniagua Javier <gonzalo@novell.com>
[mono.git] / mcs / class / System / System.Net / FtpDataStream.cs
index 0638e28ca0b89c46c8658d5e8c9eb9de5bdfa8da..45af275065506f8ac51b8da72dbc2f2a92f30bc9 100644 (file)
@@ -22,12 +22,10 @@ namespace System.Net
        {
                FtpWebRequest request;
                NetworkStream networkStream;
+               Socket socket;
                bool disposed;
                bool isRead;
                int totalRead;
-               int contentLength;
-
-               ManualResetEvent closewh;
 
                internal FtpDataStream (FtpWebRequest request, Socket socket, bool isRead)
                {
@@ -39,15 +37,13 @@ namespace System.Net
                                throw new ArgumentException ("socket");
 
                        this.request = request;
-                       this.contentLength = socket.Available;
+                       this.socket = socket;
                        this.networkStream = new NetworkStream (socket, true);
                        this.isRead = isRead;
 
                        if (request.EnableSsl) {
                                FtpWebRequest.ChangeToSSLSocket (ref networkStream);
                        }
-
-                       closewh = new ManualResetEvent (false);
                }
 
                public override bool CanRead {
@@ -92,11 +88,7 @@ namespace System.Net
 
                public override void Close ()
                {
-                       if (!disposed) {
-                               networkStream.Close ();
-                               request.SetTransferCompleted ();
-                               ((IDisposable) this).Dispose ();
-                       }
+                       Dispose (true);
                }
 
                public override void Flush ()
@@ -129,7 +121,6 @@ namespace System.Net
 
                        totalRead += nbytes;
                        if (nbytes == 0) {
-                               contentLength = totalRead;
                                networkStream.Close ();
                                request.SetTransferCompleted ();
                        }
@@ -253,11 +244,28 @@ namespace System.Net
                                return;
 
                        disposed = true;
-
-                       networkStream.Close ();
-                       networkStream = null;
-
-                       closewh.Set ();
+                       if (socket != null) {
+                               try {
+                                       if (socket.Poll (0, SelectMode.SelectRead)) {
+                                               byte [] bytes = new byte [2048];
+                                               int nbytes;
+                                               do {
+                                                       nbytes = socket.Receive (bytes);
+                                               } while (nbytes > 0 && socket.Poll (0, SelectMode.SelectRead));
+                                       }
+                               } catch {
+                                       // Ignore
+                               }
+
+                               try {
+                                       networkStream.Close ();
+                               } catch {
+                               }
+                               networkStream = null;
+                               socket = null;
+                               request.SetTransferCompleted ();
+                               request = null;
+                       }
                }
 
                void CheckDisposed ()
@@ -267,13 +275,6 @@ namespace System.Net
                }
 
                delegate int ReadDelegate (byte [] buffer, int offset, int size);
-
-               // We need to know whether the stream has been closed
-               internal ManualResetEvent CloseWaitHandle {
-                       get {
-                               return closewh;
-                       }
-               }
        }
 }