{
FtpWebRequest request;
NetworkStream networkStream;
+ Socket socket;
bool disposed;
bool isRead;
int totalRead;
- int contentLength;
-
- ManualResetEvent closewh;
internal FtpDataStream (FtpWebRequest request, Socket socket, bool isRead)
{
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 {
public override void Close ()
{
- if (!disposed) {
- networkStream.Close ();
- request.SetTransferCompleted ();
- ((IDisposable) this).Dispose ();
- }
+ Dispose (true);
}
public override void Flush ()
totalRead += nbytes;
if (nbytes == 0) {
- contentLength = totalRead;
networkStream.Close ();
request.SetTransferCompleted ();
}
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 ()
}
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;
- }
- }
}
}