X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.IO%2FStringWriter.cs;h=2b1bdc193e1f449096cf68f821dcec84703907ab;hb=7c970f8ee1f635da8575bcf58d89c16bb5c2ace1;hp=7e283b67b49cd7b704d57e5c4c11c16f38f15f8f;hpb=610d7923acfbdc29cc61e0694b716eea940d819b;p=mono.git diff --git a/mcs/class/corlib/System.IO/StringWriter.cs b/mcs/class/corlib/System.IO/StringWriter.cs index 7e283b67b49..2b1bdc193e1 100644 --- a/mcs/class/corlib/System.IO/StringWriter.cs +++ b/mcs/class/corlib/System.IO/StringWriter.cs @@ -1,80 +1,146 @@ // // System.IO.StringWriter // -// Author: Marcin Szczepanski (marcins@zipworld.com.au) +// Authors +// Marcin Szczepanski (marcins@zipworld.com.au) +// Sebastien Pouliot +// +// Copyright (C) 2004 Novell (http://www.novell.com) +// + +// +// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +using System.Globalization; using System.Text; +#if NET_2_0 +using System.Runtime.InteropServices; +#endif + namespace System.IO { - [Serializable] - public class StringWriter : TextWriter { + + [Serializable] +#if NET_2_0 + [ComVisible (true)] +#endif + [MonoTODO ("Serialization format not compatible with .NET")] + public class StringWriter : TextWriter { - protected StringBuilder internalString; + private StringBuilder internalString; + private bool disposed = false; - public StringWriter() { - internalString = new StringBuilder(); - } + public StringWriter () : this (new StringBuilder ()) + { + } - public StringWriter( IFormatProvider formatProvider ) { - internalFormatProvider = formatProvider; - } + public StringWriter (IFormatProvider formatProvider) : + this (new StringBuilder (), formatProvider) + { + } - public StringWriter( StringBuilder sb ) { - internalString = sb; - } + public StringWriter (StringBuilder sb) : + this (sb, null) + { + } - public StringWriter( StringBuilder sb, IFormatProvider formatProvider ) { - internalString = sb; - internalFormatProvider = formatProvider; - } + public StringWriter (StringBuilder sb, IFormatProvider formatProvider) + { + if (sb == null) + throw new ArgumentNullException ("sb"); + + internalString = sb; + internalFormatProvider = formatProvider; + } public override System.Text.Encoding Encoding { get { - // TODO: Implement - return null; + return System.Text.Encoding.Unicode; } - } - - public override void Close() { - Dispose( true ); - } - - protected override void Dispose( bool disposing ) { } - - public virtual StringBuilder GetStringBuilder() { - return internalString; - } + } - public override string ToString() { - return internalString.ToString(); + public override void Close () + { + Dispose (true); + disposed = true; } - public override void Write( char value ) { - internalString.Append( value ); + protected override void Dispose (bool disposing) + { + // MS.NET doesn't clear internal buffer. + // internalString = null; + base.Dispose (disposing); + disposed = true; + } + + public virtual StringBuilder GetStringBuilder () + { + return internalString; + } + + public override string ToString () + { + return internalString.ToString (); } - public override void Write( string value ) { - internalString.Append( value ); - } - - public override void Write( char[] buffer, int index, int count ) { - if( buffer == null ) { - throw new ArgumentNullException(); - } else if( index < 0 || count < 0 ) { - throw new ArgumentOutOfRangeException(); - } else if( index > buffer.Length || index + count > buffer.Length ) { - throw new ArgumentException(); - } - - char[] writeBuffer = new char[ count ]; - - Array.Copy( buffer, index, writeBuffer, 0, count ); - - internalString.Append( writeBuffer ); - } - - } + public override void Write (char value) + { + if (disposed) { + throw new ObjectDisposedException ("StringReader", + Locale.GetText ("Cannot write to a closed StringWriter")); + } + + internalString.Append (value); + } + + public override void Write (string value) + { + if (disposed) { + throw new ObjectDisposedException ("StringReader", + Locale.GetText ("Cannot write to a closed StringWriter")); + } + + internalString.Append (value); + } + + public override void Write (char[] buffer, int index, int count) + { + if (disposed) { + throw new ObjectDisposedException ("StringReader", + Locale.GetText ("Cannot write to a closed StringWriter")); + } + if (buffer == null) + throw new ArgumentNullException ("buffer"); + if (index < 0) + throw new ArgumentOutOfRangeException ("index", "< 0"); + if (count < 0) + throw new ArgumentOutOfRangeException ("count", "< 0"); + // re-ordered to avoid possible integer overflow + if (index > buffer.Length - count) + throw new ArgumentException ("index + count > buffer.Length"); + + internalString.Append (buffer, index, count); + } + } } - - +