using System.IO;
using System.Net.Sockets;
using System.Runtime.Remoting.Messaging;
-using System.Threading;\r
+using System.Threading;
using System.Net;
-#if NET_2_0
-
namespace System.Net
{
class FtpDataStream : Stream, IDisposable
{
FtpWebRequest request;
- NetworkStream networkStream;
+ Stream networkStream;
bool disposed;
bool isRead;
int totalRead;
- int contentLength;
-
- ManualResetEvent closewh;
- internal FtpDataStream (FtpWebRequest request, Socket socket, bool isRead)
+ internal FtpDataStream (FtpWebRequest request, Stream stream, bool isRead)
{
if (request == null)
throw new ArgumentNullException ("request");
- if (socket == null)
- throw new ArgumentNullException ("socket");
- if (!socket.Connected)
- throw new ArgumentException ("socket");
this.request = request;
- this.contentLength = socket.Available;
- this.networkStream = new NetworkStream (socket, true);
- this.isRead = isRead;\r
-\r
- if (request.EnableSsl) {\r
- FtpWebRequest.ChangeToSSLSocket (ref networkStream);\r
- }
-
- closewh = new ManualResetEvent (false);
+ this.networkStream = stream;
+ this.isRead = isRead;
}
public override bool CanRead {
}
}
- internal NetworkStream NetworkStream {
+ internal Stream NetworkStream {
get {
CheckDisposed ();
return networkStream;
}
public override void Close ()
- {\r
- if (!disposed) {\r
- networkStream.Close ();\r
- request.SetTransferCompleted ();\r
- ((IDisposable) this).Dispose ();\r
- }
+ {
+ Dispose (true);
}
public override void Flush ()
int ReadInternal (byte [] buffer, int offset, int size)
{
- int nbytes;\r
-\r
+ int nbytes = 0;
request.CheckIfAborted ();
try {
// Probably it would be better to have the socket here
- nbytes = networkStream.Read (buffer, offset, size);\r
+ nbytes = networkStream.Read (buffer, offset, size);
} catch (IOException) {
throw new ProtocolViolationException ("Server commited a protocol violation");
}
- totalRead += nbytes;\r
- if (nbytes == 0) {\r
- contentLength = totalRead;\r
- request.SetTransferCompleted ();\r
- networkStream.Close ();\r
+ totalRead += nbytes;
+ if (nbytes == 0) {
+ networkStream = null;
+ request.CloseDataConnection ();
+ request.SetTransferCompleted ();
}
-
+
return nbytes;
}
}
public override int Read (byte [] buffer, int offset, int size)
- {\r
- request.CheckIfAborted ();\r
+ {
+ request.CheckIfAborted ();
IAsyncResult ar = BeginRead (buffer, offset, size, null, null);
if (!ar.IsCompleted && !ar.AsyncWaitHandle.WaitOne (request.ReadWriteTimeout, false))
throw new WebException ("Read timed out.", WebExceptionStatus.Timeout);
-
return EndRead (ar);
}
delegate void WriteDelegate (byte [] buffer, int offset, int size);
void WriteInternal (byte [] buffer, int offset, int size)
- {\r
- request.CheckIfAborted ();\r
+ {
+ request.CheckIfAborted ();
try {
networkStream.Write (buffer, offset, size);
}
public override void Write (byte [] buffer, int offset, int size)
- {\r
- request.CheckIfAborted ();\r
+ {
+ request.CheckIfAborted ();
IAsyncResult ar = BeginWrite (buffer, offset, size, null, null);
if (!ar.IsCompleted && !ar.AsyncWaitHandle.WaitOne (request.ReadWriteTimeout, false))
throw new WebException ("Read timed out.", WebExceptionStatus.Timeout);
return;
disposed = true;
-
- networkStream.Close ();
- networkStream = null;
-
- closewh.Set ();
+ if (networkStream != null) {
+ request.CloseDataConnection ();
+ request.SetTransferCompleted ();
+ request = null;
+ networkStream = 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;
- }
- }
}
}
-#endif