112 lines
4.1 KiB
C#
112 lines
4.1 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// <copyright file="BufferedResponseStream.cs" company="Microsoft">
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
namespace System.Web.Services.Protocols {
|
||
|
using System;
|
||
|
using System.IO;
|
||
|
using System.Web.Services;
|
||
|
|
||
|
internal class BufferedResponseStream : Stream {
|
||
|
Stream outputStream;
|
||
|
byte[] buffer;
|
||
|
int position;
|
||
|
bool flushEnabled = true;
|
||
|
|
||
|
internal BufferedResponseStream(Stream outputStream, int buffersize) {
|
||
|
buffer = new byte[buffersize];
|
||
|
this.outputStream = outputStream;
|
||
|
}
|
||
|
|
||
|
public override bool CanRead { get { return false; } }
|
||
|
|
||
|
public override bool CanSeek { get { return false; } }
|
||
|
|
||
|
public override bool CanWrite { get { return true; } }
|
||
|
|
||
|
public override long Length { get { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); } }
|
||
|
|
||
|
public override long Position {
|
||
|
get { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); }
|
||
|
set { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); }
|
||
|
}
|
||
|
|
||
|
protected override void Dispose(bool disposing) {
|
||
|
try {
|
||
|
if (disposing)
|
||
|
outputStream.Close();
|
||
|
}
|
||
|
finally {
|
||
|
base.Dispose(disposing);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal bool FlushEnabled {
|
||
|
set { flushEnabled = value; }
|
||
|
}
|
||
|
|
||
|
public override void Flush() {
|
||
|
if (!flushEnabled)
|
||
|
return;
|
||
|
FlushWrite();
|
||
|
}
|
||
|
|
||
|
public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, Object state) {
|
||
|
throw new NotSupportedException(Res.GetString(Res.StreamDoesNotRead));
|
||
|
}
|
||
|
|
||
|
public override int EndRead(IAsyncResult asyncResult) { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotRead)); }
|
||
|
|
||
|
public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); }
|
||
|
|
||
|
public override void SetLength(long value) { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotSeek)); }
|
||
|
|
||
|
public override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotRead)); }
|
||
|
|
||
|
|
||
|
public override int ReadByte() { throw new NotSupportedException(Res.GetString(Res.StreamDoesNotRead)); }
|
||
|
|
||
|
public override void Write(byte[] array, int offset, int count) {
|
||
|
if (position > 0) {
|
||
|
int numBytes = buffer.Length - position; // space left in buffer
|
||
|
if (numBytes > 0) {
|
||
|
if (numBytes > count)
|
||
|
numBytes = count;
|
||
|
Array.Copy(array, offset, buffer, position, numBytes);
|
||
|
position += numBytes;
|
||
|
if (count == numBytes) return;
|
||
|
offset += numBytes;
|
||
|
count -= numBytes;
|
||
|
}
|
||
|
FlushWrite();
|
||
|
}
|
||
|
// Skip buffer if we have more bytes then will fit in the buffer.
|
||
|
if (count >= buffer.Length) {
|
||
|
outputStream.Write(array, offset, count);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Copy remaining bytes into buffer, to write at a later date.
|
||
|
Array.Copy(array, offset, buffer, position, count);
|
||
|
position = count;
|
||
|
}
|
||
|
|
||
|
private void FlushWrite() {
|
||
|
if (position > 0) {
|
||
|
outputStream.Write(buffer, 0, position);
|
||
|
position = 0;
|
||
|
}
|
||
|
outputStream.Flush();
|
||
|
}
|
||
|
|
||
|
public override void WriteByte(byte value) {
|
||
|
if (position == buffer.Length)
|
||
|
FlushWrite();
|
||
|
|
||
|
buffer[position++] = value;
|
||
|
}
|
||
|
}
|
||
|
}
|