/* ****************************************************************************
*
* Copyright (c) Microsoft Corporation.
*
* This source code is subject to terms and conditions of the Microsoft Public License. A
* copy of the license can be found in the License.html file at the root of this distribution. If
* you cannot locate the Microsoft Public License, please send an email to
* dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
* by the terms of the Microsoft Public License.
*
* You must not remove this notice, or any other, from this software.
*
*
* ***************************************************************************/
#if SILVERLIGHT // only needed in SL, see SharedIO
using System;
using System.IO;
using System.Text;
namespace Microsoft.Scripting.Utils{
internal abstract class TextStreamBase : Stream {
private readonly bool _buffered;
protected TextStreamBase(bool buffered) {
_buffered = buffered;
}
public abstract Encoding Encoding { get; }
public abstract TextReader Reader { get; }
public abstract TextWriter Writer { get; }
public sealed override bool CanSeek {
get { return false; }
}
public sealed override bool CanWrite {
get { return Writer != null; }
}
public sealed override bool CanRead {
get { return Reader != null; }
}
public sealed override void Flush() {
if (!CanWrite) throw new InvalidOperationException();
Writer.Flush();
}
public sealed override int Read(byte[] buffer, int offset, int count) {
if (!CanRead) throw new InvalidOperationException();
ContractUtils.RequiresArrayRange(buffer, offset, count, "offset", "count");
char[] charBuffer = new char[count];
int realCount = Reader.Read(charBuffer, 0, count);
return Encoding.GetBytes(charBuffer, 0, realCount, buffer, offset);
}
public sealed override void Write(byte[] buffer, int offset, int count) {
ContractUtils.RequiresArrayRange(buffer, offset, count, "offset", "count");
char[] charBuffer = Encoding.GetChars(buffer, offset, count);
Writer.Write(charBuffer, 0, charBuffer.Length);
if (!_buffered) Writer.Flush();
}
#region Invalid Operations
public sealed override long Length {
get {
throw new InvalidOperationException();
}
}
public sealed override long Position {
get {
throw new InvalidOperationException();
}
set {
throw new InvalidOperationException();
}
}
public sealed override long Seek(long offset, SeekOrigin origin) {
throw new InvalidOperationException();
}
public sealed override void SetLength(long value) {
throw new InvalidOperationException();
}
#endregion
}
internal sealed class TextStream : TextStreamBase {
private readonly TextReader _reader;
private readonly TextWriter _writer;
private readonly Encoding _encoding;
public override Encoding Encoding {
get { return _encoding; }
}
public override TextReader Reader {
get { return _reader; }
}
public override TextWriter Writer {
get { return _writer; }
}
internal TextStream(TextReader reader, Encoding encoding)
: base(true) {
ContractUtils.RequiresNotNull(reader, "reader");
ContractUtils.RequiresNotNull(encoding, "encoding");
_reader = reader;
_encoding = encoding;
}
internal TextStream(TextWriter writer)
: this(writer, writer.Encoding, true) {
}
internal TextStream(TextWriter writer, Encoding encoding, bool buffered)
: base(buffered) {
ContractUtils.RequiresNotNull(writer, "writer");
ContractUtils.RequiresNotNull(encoding, "encoding");
_writer = writer;
_encoding = encoding;
}
}
}
#endif
|