We need you! We're working hard on the next version of Developer Fusion -
Let us know what you think we should be up to!
- using System;
- using System.IO;
- using System.Runtime.Remoting;
- using System.Threading;
- namespace System.Runtime.Remoting.Channels
- {
-
- static internal class StreamHelper
- {
- private static AsyncCallback _asyncCopyStreamReadCallback = new AsyncCallback(AsyncCopyStreamReadCallback);
- private static AsyncCallback _asyncCopyStreamWriteCallback = new AsyncCallback(AsyncCopyStreamWriteCallback);
-
- static internal void CopyStream(Stream source, Stream target)
- {
- if (source == null)
- return;
-
-
- ChunkedMemoryStream chunkedMemStream = source as ChunkedMemoryStream;
- if (chunkedMemStream != null) {
- chunkedMemStream.WriteTo(target);
- }
- else {
-
- MemoryStream memContentStream = source as MemoryStream;
- if (memContentStream != null) {
- memContentStream.WriteTo(target);
- }
- else {
-
-
- byte[] buffer = CoreChannel.BufferPool.GetBuffer();
- int bufferSize = buffer.Length;
- int readCount = source.Read(buffer, 0, bufferSize);
- while (readCount > 0) {
- target.Write(buffer, 0, readCount);
- readCount = source.Read(buffer, 0, bufferSize);
- }
- CoreChannel.BufferPool.ReturnBuffer(buffer);
- }
- }
-
- }
-
-
-
- static internal void BufferCopy(byte[] source, int srcOffset, byte[] dest, int destOffset, int count)
- {
- if (count > 8) {
- Buffer.BlockCopy(source, srcOffset, dest, destOffset, count);
- }
- else {
- for (int co = 0; co < count; co++)
- dest[destOffset + co] = source[srcOffset + co];
- }
- }
-
-
-
-
- static internal IAsyncResult BeginAsyncCopyStream(Stream source, Stream target, bool asyncRead, bool asyncWrite, bool closeSource, bool closeTarget, AsyncCallback callback, object state)
- {
- AsyncCopyStreamResult streamState = new AsyncCopyStreamResult(callback, state);
-
- byte[] buffer = CoreChannel.BufferPool.GetBuffer();
-
- streamState.Source = source;
- streamState.Target = target;
- streamState.Buffer = buffer;
- streamState.AsyncRead = asyncRead;
- streamState.AsyncWrite = asyncWrite;
- streamState.CloseSource = closeSource;
- streamState.CloseTarget = closeTarget;
-
- try {
- AsyncCopyReadHelper(streamState);
- }
- catch (Exception e) {
- streamState.SetComplete(null, e);
- }
- catch {
- streamState.SetComplete(null, new Exception(CoreChannel.GetResourceString("Remoting_nonClsCompliantException")));
- }
-
- return streamState;
- }
-
- static internal void EndAsyncCopyStream(IAsyncResult iar)
- {
- AsyncCopyStreamResult asyncResult = (AsyncCopyStreamResult)iar;
-
- if (!iar.IsCompleted) {
- iar.AsyncWaitHandle.WaitOne();
- }
-
- if (asyncResult.Exception != null) {
- throw asyncResult.Exception;
- }
- }
-
-
- private static void AsyncCopyReadHelper(AsyncCopyStreamResult streamState)
- {
-
-
- if (streamState.AsyncRead) {
- byte[] buffer = streamState.Buffer;
- streamState.Source.BeginRead(buffer, 0, buffer.Length, _asyncCopyStreamReadCallback, streamState);
- }
- else {
- byte[] buffer = streamState.Buffer;
- int bytesRead = streamState.Source.Read(buffer, 0, buffer.Length);
- if (bytesRead == 0) {
- streamState.SetComplete(null, null);
- }
- else if (bytesRead < 0) {
- throw new RemotingException(CoreChannel.GetResourceString("Remoting_Stream_UnknownReadError"));
- }
- else {
- AsyncCopyWriteHelper(streamState, bytesRead);
- }
- }
- }
-
-
- private static void AsyncCopyWriteHelper(AsyncCopyStreamResult streamState, int bytesRead)
- {
-
-
- if (streamState.AsyncWrite) {
- byte[] buffer = streamState.Buffer;
- streamState.Target.BeginWrite(buffer, 0, bytesRead, _asyncCopyStreamWriteCallback, streamState);
- }
- else {
- byte[] buffer = streamState.Buffer;
- streamState.Target.Write(buffer, 0, bytesRead);
-
- AsyncCopyReadHelper(streamState);
- }
- }
-
-
- private static void AsyncCopyStreamReadCallback(IAsyncResult iar)
- {
- AsyncCopyStreamResult state = (AsyncCopyStreamResult)iar.AsyncState;
-
- try {
- Stream source = state.Source;
-
- int bytesRead = source.EndRead(iar);
- if (bytesRead == 0) {
- state.SetComplete(null, null);
- }
- else if (bytesRead < 0) {
- throw new RemotingException(CoreChannel.GetResourceString("Remoting_Stream_UnknownReadError"));
- }
- else {
- AsyncCopyWriteHelper(state, bytesRead);
- }
- }
- catch (Exception e) {
- state.SetComplete(null, e);
- }
- catch {
- state.SetComplete(null, new Exception(CoreChannel.GetResourceString("Remoting_nonClsCompliantException")));
- }
- }
-
-
- private static void AsyncCopyStreamWriteCallback(IAsyncResult iar)
- {
- AsyncCopyStreamResult state = (AsyncCopyStreamResult)iar.AsyncState;
-
- try {
- state.Target.EndWrite(iar);
-
- AsyncCopyReadHelper(state);
- }
- catch (Exception e) {
- state.SetComplete(null, e);
- }
- catch {
- state.SetComplete(null, new Exception(CoreChannel.GetResourceString("Remoting_nonClsCompliantException")));
- }
- }
-
- }
-
-
-
- internal class AsyncCopyStreamResult : BasicAsyncResult
- {
- internal Stream Source;
- internal Stream Target;
- internal byte[] Buffer;
- internal bool AsyncRead;
- internal bool AsyncWrite;
- internal bool CloseSource;
- internal bool CloseTarget;
-
- internal AsyncCopyStreamResult(AsyncCallback callback, object state) : base(callback, state)
- {
- }
-
- internal override void CleanupOnComplete()
- {
- if (Buffer != null)
- CoreChannel.BufferPool.ReturnBuffer(Buffer);
-
- if (CloseSource)
- Source.Close();
- if (CloseTarget)
- Target.Close();
-
- }
-
- }
-
-
- }