| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- //
- // System.Net.FtpDataStream.cs
- //
- // Authors:
- // Carlos Alberto Cortez ([email protected])
- //
- // (c) Copyright 2006 Novell, Inc. (http://www.novell.com)
- //
- using System;
- using System.IO;
- using System.Net.Sockets;
- using System.Runtime.Remoting.Messaging;
- using System.Threading;
- #if NET_2_0
- namespace System.Net
- {
- class FtpDataStream : Stream, IDisposable
- {
- FtpWebRequest request;
- NetworkStream networkStream;
- bool disposed;
- bool isRead;
- int totalRead;
- int contentLength;
- ManualResetEvent closewh;
- internal FtpDataStream (FtpWebRequest request, Socket socket, 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;
- closewh = new ManualResetEvent (false);
- }
- public override bool CanRead {
- get {
- return isRead;
- }
- }
- public override bool CanWrite {
- get {
- return !isRead;
- }
- }
- public override bool CanSeek {
- get {
- return false;
- }
- }
- public override long Length {
- get {
- throw new NotSupportedException ();
- }
- }
- public override long Position {
- get {
- throw new NotSupportedException ();
- }
- set {
- throw new NotSupportedException ();
- }
- }
- internal NetworkStream NetworkStream {
- get {
- CheckDisposed ();
- return networkStream;
- }
- }
- public override void Close ()
- {
- ((IDisposable) this).Dispose ();
- }
- public override void Flush ()
- {
- // Do nothing.
- }
- public override long Seek (long offset, SeekOrigin origin)
- {
- throw new NotSupportedException ();
- }
- public override void SetLength (long value)
- {
- throw new NotSupportedException ();
- }
- int ReadInternal (byte [] buffer, int offset, int size)
- {
- int nbytes;
- try {
- // Probably it would be better to have the socket here
- nbytes = networkStream.Read (buffer, offset, size);
- } catch (IOException exc) {
- throw new ProtocolViolationException ("Server commited a protocol violation");
- }
- totalRead += nbytes;
- if (nbytes == 0)
- contentLength = totalRead;
- if (totalRead >= contentLength)
- request.SetTransferCompleted ();
-
- return nbytes;
- }
- public override IAsyncResult BeginRead (byte [] buffer, int offset, int size, AsyncCallback cb, object state)
- {
- CheckDisposed ();
- if (!isRead)
- throw new NotSupportedException ();
- if (buffer == null)
- throw new ArgumentNullException ("buffer");
- if (offset < 0 || offset > buffer.Length)
- throw new ArgumentOutOfRangeException ("offset");
- if (size < 0 || size > buffer.Length - offset)
- throw new ArgumentOutOfRangeException ("offset+size");
- ReadDelegate del = ReadInternal;
- return del.BeginInvoke (buffer, offset, size, cb, state);
- }
- public override int EndRead (IAsyncResult asyncResult)
- {
- if (asyncResult == null)
- throw new ArgumentNullException ("asyncResult");
- AsyncResult ar = asyncResult as AsyncResult;
- if (ar == null)
- throw new ArgumentException ("Invalid asyncResult", "asyncResult");
-
- ReadDelegate del = ar.AsyncDelegate as ReadDelegate;
- if (del == null)
- throw new ArgumentException ("Invalid asyncResult", "asyncResult");
- return del.EndInvoke (asyncResult);
- }
- public override int Read (byte [] buffer, int offset, int size)
- {
- 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)
- {
- try {
- networkStream.Write (buffer, offset, size);
- } catch (IOException exc) {
- throw new ProtocolViolationException ();
- }
- }
- public override IAsyncResult BeginWrite (byte [] buffer, int offset, int size, AsyncCallback cb, object state)
- {
- CheckDisposed ();
- if (isRead)
- throw new NotSupportedException ();
- if (buffer == null)
- throw new ArgumentNullException ("buffer");
- if (offset < 0 || offset > buffer.Length)
- throw new ArgumentOutOfRangeException ("offset");
- if (size < 0 || size > buffer.Length - offset)
- throw new ArgumentOutOfRangeException ("offset+size");
- WriteDelegate del = WriteInternal;
- return del.BeginInvoke (buffer, offset, size, cb, state);
- }
- public override void EndWrite (IAsyncResult asyncResult)
- {
- if (asyncResult == null)
- throw new ArgumentNullException ("asyncResult");
- AsyncResult ar = asyncResult as AsyncResult;
- if (ar == null)
- throw new ArgumentException ("Invalid asyncResult.", "asyncResult");
- WriteDelegate del = ar.AsyncDelegate as WriteDelegate;
- if (del == null)
- throw new ArgumentException ("Invalid asyncResult.", "asyncResult");
- del.EndInvoke (asyncResult);
- }
- public override void Write (byte [] buffer, int offset, int size)
- {
- 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);
- EndWrite (ar);
- }
- ~FtpDataStream ()
- {
- Dispose (false);
- }
- void IDisposable.Dispose ()
- {
- Dispose (true);
- GC.SuppressFinalize (this);
- }
- protected override void Dispose (bool disposing)
- {
- if (disposed)
- return;
- disposed = true;
- networkStream.Close ();
- networkStream = null;
- closewh.Set ();
- }
- void CheckDisposed ()
- {
- if (disposed)
- throw new ObjectDisposedException (GetType ().FullName);
- }
- 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
|