2008-08-21 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / class / corlib / System.IO / TextWriter.cs
index 7ba815aa1ece3425fb1cffc2cb68a333a38d9685..6f9f2a22f67d7ce84a513fa2ca33c354d0735b94 100644 (file)
-//\r
-// System.IO.TextWriter\r
-//\r
-// Authors:\r
-//   Marcin Szczepanski (marcins@zipworld.com.au)\r
-//   Miguel de Icaza (miguel@gnome.org)\r
-//   Paolo Molaro (lupus@ximian.com)\r
-//\r
-\r
-//\r
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)\r
-//\r
-// Permission is hereby granted, free of charge, to any person obtaining\r
-// a copy of this software and associated documentation files (the\r
-// "Software"), to deal in the Software without restriction, including\r
-// without limitation the rights to use, copy, modify, merge, publish,\r
-// distribute, sublicense, and/or sell copies of the Software, and to\r
-// permit persons to whom the Software is furnished to do so, subject to\r
-// the following conditions:\r
-// \r
-// The above copyright notice and this permission notice shall be\r
-// included in all copies or substantial portions of the Software.\r
-// \r
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
-//\r
-\r
-using System.Text;\r
-\r
-namespace System.IO {\r
-\r
-       [Serializable]\r
-       public abstract class TextWriter : MarshalByRefObject, IDisposable {\r
-                \r
-                protected TextWriter() {\r
-                       CoreNewLine = System.Environment.NewLine.ToCharArray ();\r
-               }\r
-                \r
-                protected TextWriter( IFormatProvider formatProvider ) {\r
-                        internalFormatProvider = formatProvider;\r
-                }\r
-\r
-                protected char[] CoreNewLine;\r
-\r
-                internal IFormatProvider internalFormatProvider;\r
-\r
-                public static readonly TextWriter Null = new NullTextWriter ();\r
-\r
-                public abstract Encoding Encoding { get; }\r
-\r
-                public virtual IFormatProvider FormatProvider { \r
-                        get {\r
-                                return internalFormatProvider;\r
-                        } \r
-                }\r
-\r
-                public virtual string NewLine { \r
-                        get {\r
-                                return new string(CoreNewLine);\r
-                        }\r
-                        \r
-                        set {\r
-                               if (value == null)\r
-                                       value = Environment.NewLine;\r
-\r
-                               CoreNewLine = value.ToCharArray();\r
-                        }\r
-                }\r
-\r
-                public virtual void Close () { \r
-                        Dispose (true);\r
-                }\r
-\r
-                protected virtual void Dispose (bool disposing) { }\r
-                \r
-               void System.IDisposable.Dispose () {\r
-                       Dispose (true);\r
-               }\r
-\r
-\r
-                public virtual void Flush()\r
-               {\r
-                       // do nothing\r
-               }\r
-\r
-                public static TextWriter Synchronized (TextWriter writer)\r
-               {\r
-                       return Synchronized (writer, false);\r
-                }\r
-\r
-                internal static TextWriter Synchronized (TextWriter writer, bool neverClose)\r
-               {\r
-                       if (writer == null)\r
-                               throw new ArgumentNullException ("writer is null");\r
-\r
-                       if (writer is SynchronizedWriter)\r
-                               return writer;\r
-                       \r
-                       return new SynchronizedWriter (writer, neverClose);\r
-                }\r
-\r
-                public virtual void Write (bool value)\r
-               {\r
-                       Write (value.ToString ());\r
-               }\r
-               \r
-                public virtual void Write (char value)\r
-               {\r
-                       // Do nothing\r
-               }\r
-\r
-                public virtual void Write (char[] value)\r
-               {\r
-                       if (value != null) {\r
-                               for (int i = 0; i < value.Length; ++i)\r
-                                       Write (value [i]);\r
-                       }\r
-               }\r
-               \r
-                public virtual void Write (decimal value)\r
-               {\r
-                       Write (value.ToString (internalFormatProvider));\r
-               }\r
-               \r
-                public virtual void Write (double value)\r
-               {\r
-                       Write (value.ToString (internalFormatProvider));\r
-               }\r
-\r
-                public virtual void Write (int value)\r
-               {\r
-                       Write (value.ToString (internalFormatProvider));\r
-               }\r
-               \r
-                public virtual void Write (long value)\r
-               {\r
-                       Write (value.ToString (internalFormatProvider));\r
-               }\r
-               \r
-                public virtual void Write (object value)\r
-               {\r
-                       if (value != null)\r
-                               Write (value.ToString ());\r
-               }\r
-               \r
-                public virtual void Write (float value)\r
-               {\r
-                       Write (value.ToString (internalFormatProvider));\r
-               }\r
-               \r
-                public virtual void Write (string value)\r
-               {\r
-                       if (value != null)\r
-                               Write (value.ToCharArray ());\r
-               }\r
-               \r
-               [CLSCompliant(false)]\r
-                public virtual void Write (uint value)\r
-               {\r
-                       Write (value.ToString (internalFormatProvider));\r
-               }\r
-               \r
-               [CLSCompliant(false)]\r
-                public virtual void Write (ulong value)\r
-               {\r
-                       Write (value.ToString (internalFormatProvider));\r
-               }\r
-               \r
-                public virtual void Write (string format, object arg0)\r
-               {\r
-                       Write (String.Format (format, arg0));\r
-               }\r
-               \r
-                public virtual void Write (string format, params object[] arg)\r
-               {\r
-                       Write (String.Format (format, arg));\r
-               }\r
-               \r
-                public virtual void Write (char[] buffer, int index, int count)\r
-               {\r
-                       if (buffer == null)\r
-                               throw new ArgumentNullException ("buffer");\r
-                       if (index < 0 || index > buffer.Length)\r
-                               throw new ArgumentOutOfRangeException ("index");\r
-                       // re-ordered to avoid possible integer overflow\r
-                       if (count < 0 || (index > buffer.Length - count))\r
-                               throw new ArgumentOutOfRangeException ("count");\r
-\r
-                       for (; count > 0; --count, ++index) {\r
-                               Write (buffer [index]);\r
-                       }\r
-               }\r
-               \r
-                public virtual void Write (string format, object arg0, object arg1)\r
-               {\r
-                       Write (String.Format (format, arg0, arg1));\r
-               }\r
-               \r
-                public virtual void Write (string format, object arg0, object arg1, object arg2 )\r
-               {\r
-                       Write (String.Format (format, arg0, arg1, arg2));\r
-               }\r
-                \r
-                public virtual void WriteLine ()\r
-               {\r
-                       Write (NewLine);\r
-               }\r
-               \r
-                public virtual void WriteLine (bool value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (char value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (char[] value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (decimal value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (double value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (int value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (long value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (object value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (float value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (string value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-               [CLSCompliant(false)]\r
-                public virtual void WriteLine (uint value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-               [CLSCompliant(false)]\r
-                public virtual void WriteLine (ulong value)\r
-               {\r
-                       Write (value);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (string format, object arg0)\r
-               {\r
-                       Write (format, arg0);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (string format, params object[] arg)\r
-               {\r
-                       Write (format, arg);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (char[] buffer, int index, int count)\r
-               {\r
-                       Write (buffer, index, count);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (string format, object arg0, object arg1)\r
-               {\r
-                       Write (format, arg0, arg1);\r
-                       WriteLine();\r
-               }\r
-               \r
-                public virtual void WriteLine (string format, object arg0, object arg1, object arg2)\r
-               {\r
-                       Write (format, arg0, arg1, arg2);\r
-                       WriteLine();\r
-               }\r
-\r
-               //\r
-               // Null version of the TextWriter, for the `Null' instance variable\r
-               //\r
-               sealed class NullTextWriter : TextWriter {\r
-                       public override Encoding Encoding {\r
-                               get {\r
-                                       return Encoding.Default;\r
-                               }\r
-                       }\r
-                       \r
-                       public override void Write (string s)\r
-                       {\r
-                       }\r
-                       public override void Write (char value)\r
-                       {\r
-                       }\r
-                       public override void Write (char[] value, int index, int count)\r
-                       {\r
-                       }\r
-               }\r
-        }\r
-\r
-       //\r
-       // Sychronized version of the TextWriter.\r
-       //\r
-       [Serializable]\r
-       internal class SynchronizedWriter : TextWriter {\r
-               private TextWriter writer;\r
-               private bool neverClose;\r
-\r
-               public SynchronizedWriter (TextWriter writer)\r
-                       : this (writer, false)\r
-               {\r
-               }\r
-\r
-               public SynchronizedWriter (TextWriter writer, bool neverClose)\r
-               {\r
-                       this.writer = writer;\r
-                       this.neverClose = neverClose;\r
-               }\r
-\r
-               public override void Close ()\r
-               {\r
-                       if (neverClose)\r
-                               return;\r
-                       lock (this){\r
-                               writer.Close ();\r
-                       }\r
-               }\r
-\r
-               public override void Flush ()\r
-               {\r
-                       lock (this){\r
-                               writer.Flush ();\r
-                       }\r
-               }\r
-\r
-#region Write methods\r
-               public override void Write (bool value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-               \r
-               public override void Write (char value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-\r
-               public override void Write (char [] value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-\r
-               public override void Write (Decimal value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-\r
-               public override void Write (int value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-\r
-               public override void Write (long value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-               \r
-               public override void Write (object value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-\r
-               public override void Write (float value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-               \r
-               public override void Write (string value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-               \r
-               public override void Write (uint value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-               \r
-               public override void Write (ulong value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (value);\r
-                       }\r
-               }\r
-               \r
-               public override void Write (string format, object value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (format, value);\r
-                       }\r
-               }\r
-               \r
-               public override void Write (string format, object [] value)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (format, value);\r
-                       }\r
-               }\r
-\r
-               public override void Write (char [] buffer, int index, int count)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (buffer, index, count);\r
-                       }\r
-               }\r
-               \r
-               public override void Write (string format, object arg0, object arg1)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (format, arg0, arg1);\r
-                       }\r
-               }\r
-               \r
-               public override void Write (string format, object arg0, object arg1, object arg2)\r
-               {\r
-                       lock (this){\r
-                               writer.Write (format, arg0, arg1, arg2);\r
-                       }\r
-               }\r
-#endregion\r
-#region WriteLine methods\r
-               public override void WriteLine ()\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine ();\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (bool value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (char value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (char [] value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (Decimal value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (double value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (int value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (long value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (object value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (float value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (string value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (uint value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (ulong value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (string format, object value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (format, value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (string format, object [] value)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (format, value);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (char [] buffer, int index, int count)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (buffer, index, count);\r
-                       }\r
-               }\r
-               \r
-               public override void WriteLine (string format, object arg0, object arg1)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (format, arg0, arg1);\r
-                       }\r
-               }\r
-\r
-               public override void WriteLine (string format, object arg0, object arg1, object arg2)\r
-               {\r
-                       lock (this){\r
-                               writer.WriteLine (format, arg0, arg1, arg2);\r
-                       }\r
-               }\r
-#endregion\r
-               \r
-               public override Encoding Encoding {\r
-                       get {\r
-                               lock (this){\r
-                                       return writer.Encoding;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               public override IFormatProvider FormatProvider {\r
-                       get {\r
-                               lock (this){\r
-                                       return writer.FormatProvider;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               public override string NewLine {\r
-                       get {\r
-                               lock (this){\r
-                                       return writer.NewLine;\r
-                               }\r
-                       }\r
-\r
-                       set {\r
-                               lock (this){\r
-                                       writer.NewLine = value;\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-\r
-\r
-\r
-\r
+//
+// System.IO.TextWriter.cs
+//
+// Authors:
+//   Marcin Szczepanski (marcins@zipworld.com.au)
+//   Miguel de Icaza (miguel@gnome.org)
+//   Paolo Molaro (lupus@ximian.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.Text;
+
+#if NET_2_0
+using System.Runtime.InteropServices;
+#endif
+
+namespace System.IO {
+
+       [Serializable]
+#if NET_2_0
+       [ComVisible (true)]
+#endif
+#if NET_2_1
+       public abstract class TextWriter : IDisposable {
+#else
+       public abstract class TextWriter : MarshalByRefObject, IDisposable {
+#endif
+                
+                protected TextWriter() {
+                       CoreNewLine = System.Environment.NewLine.ToCharArray ();
+               }
+                
+                protected TextWriter( IFormatProvider formatProvider ) {
+                       CoreNewLine = System.Environment.NewLine.ToCharArray ();
+                        internalFormatProvider = formatProvider;
+                }
+
+                protected char[] CoreNewLine;
+
+                internal IFormatProvider internalFormatProvider;
+
+                public static readonly TextWriter Null = new NullTextWriter ();
+
+                public abstract Encoding Encoding { get; }
+
+                public virtual IFormatProvider FormatProvider { 
+                        get {
+                                return internalFormatProvider;
+                        } 
+                }
+
+                public virtual string NewLine { 
+                        get {
+                                return new string(CoreNewLine);
+                        }
+                        
+                        set {
+                               if (value == null)
+                                       value = Environment.NewLine;
+
+                               CoreNewLine = value.ToCharArray();
+                        }
+                }
+
+                public virtual void Close () { 
+                        Dispose (true);
+                }
+
+                protected virtual void Dispose (bool disposing)
+               {
+                       if (disposing){
+                               // If we are explicitly disposed, we can avoid finalization.
+                               GC.SuppressFinalize (this);
+                       }
+               }
+#if NET_2_0
+               public void Dispose ()
+               {
+                       Dispose (true);
+
+                       // If we are explicitly disposed, we can avoid finalization.
+                       GC.SuppressFinalize (this);
+               }
+#else
+               void System.IDisposable.Dispose () {
+                       Dispose (true);
+               }
+#endif
+
+
+                public virtual void Flush()
+               {
+                       // do nothing
+               }
+
+                public static TextWriter Synchronized (TextWriter writer)
+               {
+                       return Synchronized (writer, false);
+                }
+
+                internal static TextWriter Synchronized (TextWriter writer, bool neverClose)
+               {
+                       if (writer == null)
+                               throw new ArgumentNullException ("writer is null");
+
+                       if (writer is SynchronizedWriter)
+                               return writer;
+                       
+                       return new SynchronizedWriter (writer, neverClose);
+                }
+
+                public virtual void Write (bool value)
+               {
+                       Write (value.ToString ());
+               }
+               
+                public virtual void Write (char value)
+               {
+                       // Do nothing
+               }
+
+                public virtual void Write (char[] buffer)
+               {
+                       if (buffer == null)
+                               return;
+                       Write (buffer, 0, buffer.Length);
+               }
+               
+                public virtual void Write (decimal value)
+               {
+                       Write (value.ToString (internalFormatProvider));
+               }
+               
+                public virtual void Write (double value)
+               {
+                       Write (value.ToString (internalFormatProvider));
+               }
+
+                public virtual void Write (int value)
+               {
+                       Write (value.ToString (internalFormatProvider));
+               }
+               
+                public virtual void Write (long value)
+               {
+                       Write (value.ToString (internalFormatProvider));
+               }
+               
+                public virtual void Write (object value)
+               {
+                       if (value != null)
+                               Write (value.ToString ());
+               }
+               
+                public virtual void Write (float value)
+               {
+                       Write (value.ToString (internalFormatProvider));
+               }
+               
+                public virtual void Write (string value)
+               {
+                       if (value != null)
+                               Write (value.ToCharArray ());
+               }
+               
+               [CLSCompliant(false)]
+                public virtual void Write (uint value)
+               {
+                       Write (value.ToString (internalFormatProvider));
+               }
+               
+               [CLSCompliant(false)]
+                public virtual void Write (ulong value)
+               {
+                       Write (value.ToString (internalFormatProvider));
+               }
+               
+                public virtual void Write (string format, object arg0)
+               {
+                       Write (String.Format (format, arg0));
+               }
+               
+                public virtual void Write (string format, params object[] arg)
+               {
+                       Write (String.Format (format, arg));
+               }
+               
+                public virtual void Write (char[] buffer, int index, int count)
+               {
+                       if (buffer == null)
+                               throw new ArgumentNullException ("buffer");
+                       if (index < 0 || index > buffer.Length)
+                               throw new ArgumentOutOfRangeException ("index");
+                       // re-ordered to avoid possible integer overflow
+                       if (count < 0 || (index > buffer.Length - count))
+                               throw new ArgumentOutOfRangeException ("count");
+
+                       for (; count > 0; --count, ++index) {
+                               Write (buffer [index]);
+                       }
+               }
+               
+                public virtual void Write (string format, object arg0, object arg1)
+               {
+                       Write (String.Format (format, arg0, arg1));
+               }
+               
+                public virtual void Write (string format, object arg0, object arg1, object arg2 )
+               {
+                       Write (String.Format (format, arg0, arg1, arg2));
+               }
+                
+                public virtual void WriteLine ()
+               {
+                       Write (CoreNewLine);
+               }
+               
+                public virtual void WriteLine (bool value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (char value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (char[] buffer)
+               {
+                       Write (buffer);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (decimal value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (double value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (int value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (long value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (object value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (float value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (string value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+               [CLSCompliant(false)]
+                public virtual void WriteLine (uint value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+               [CLSCompliant(false)]
+                public virtual void WriteLine (ulong value)
+               {
+                       Write (value);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (string format, object arg0)
+               {
+                       Write (format, arg0);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (string format, params object[] arg)
+               {
+                       Write (format, arg);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (char[] buffer, int index, int count)
+               {
+                       Write (buffer, index, count);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (string format, object arg0, object arg1)
+               {
+                       Write (format, arg0, arg1);
+                       WriteLine();
+               }
+               
+                public virtual void WriteLine (string format, object arg0, object arg1, object arg2)
+               {
+                       Write (format, arg0, arg1, arg2);
+                       WriteLine();
+               }
+
+               //
+               // Null version of the TextWriter, for the `Null' instance variable
+               //
+               sealed class NullTextWriter : TextWriter {
+                       public override Encoding Encoding {
+                               get {
+                                       return Encoding.Default;
+                               }
+                       }
+                       
+                       public override void Write (string s)
+                       {
+                       }
+                       public override void Write (char value)
+                       {
+                       }
+                       public override void Write (char[] value, int index, int count)
+                       {
+                       }
+               }
+        }
+
+       //
+       // Sychronized version of the TextWriter.
+       //
+       [Serializable]
+       internal class SynchronizedWriter : TextWriter {
+               private TextWriter writer;
+               private bool neverClose;
+
+               public SynchronizedWriter (TextWriter writer)
+                       : this (writer, false)
+               {
+               }
+
+               public SynchronizedWriter (TextWriter writer, bool neverClose)
+               {
+                       this.writer = writer;
+                       this.neverClose = neverClose;
+               }
+
+               public override void Close ()
+               {
+                       if (neverClose)
+                               return;
+                       lock (this){
+                               writer.Close ();
+                       }
+               }
+
+               public override void Flush ()
+               {
+                       lock (this){
+                               writer.Flush ();
+                       }
+               }
+
+#region Write methods
+               public override void Write (bool value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+               
+               public override void Write (char value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+
+               public override void Write (char [] value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+
+               public override void Write (Decimal value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+
+               public override void Write (int value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+
+               public override void Write (long value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+               
+               public override void Write (object value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+
+               public override void Write (float value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+               
+               public override void Write (string value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+               
+               public override void Write (uint value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+               
+               public override void Write (ulong value)
+               {
+                       lock (this){
+                               writer.Write (value);
+                       }
+               }
+               
+               public override void Write (string format, object value)
+               {
+                       lock (this){
+                               writer.Write (format, value);
+                       }
+               }
+               
+               public override void Write (string format, object [] value)
+               {
+                       lock (this){
+                               writer.Write (format, value);
+                       }
+               }
+
+               public override void Write (char [] buffer, int index, int count)
+               {
+                       lock (this){
+                               writer.Write (buffer, index, count);
+                       }
+               }
+               
+               public override void Write (string format, object arg0, object arg1)
+               {
+                       lock (this){
+                               writer.Write (format, arg0, arg1);
+                       }
+               }
+               
+               public override void Write (string format, object arg0, object arg1, object arg2)
+               {
+                       lock (this){
+                               writer.Write (format, arg0, arg1, arg2);
+                       }
+               }
+#endregion
+#region WriteLine methods
+               public override void WriteLine ()
+               {
+                       lock (this){
+                               writer.WriteLine ();
+                       }
+               }
+
+               public override void WriteLine (bool value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (char value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (char [] value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (Decimal value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (double value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (int value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (long value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (object value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (float value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (string value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (uint value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (ulong value)
+               {
+                       lock (this){
+                               writer.WriteLine (value);
+                       }
+               }
+
+               public override void WriteLine (string format, object value)
+               {
+                       lock (this){
+                               writer.WriteLine (format, value);
+                       }
+               }
+
+               public override void WriteLine (string format, object [] value)
+               {
+                       lock (this){
+                               writer.WriteLine (format, value);
+                       }
+               }
+
+               public override void WriteLine (char [] buffer, int index, int count)
+               {
+                       lock (this){
+                               writer.WriteLine (buffer, index, count);
+                       }
+               }
+               
+               public override void WriteLine (string format, object arg0, object arg1)
+               {
+                       lock (this){
+                               writer.WriteLine (format, arg0, arg1);
+                       }
+               }
+
+               public override void WriteLine (string format, object arg0, object arg1, object arg2)
+               {
+                       lock (this){
+                               writer.WriteLine (format, arg0, arg1, arg2);
+                       }
+               }
+#endregion
+               
+               public override Encoding Encoding {
+                       get {
+                               lock (this){
+                                       return writer.Encoding;
+                               }
+                       }
+               }
+
+               public override IFormatProvider FormatProvider {
+                       get {
+                               lock (this){
+                                       return writer.FormatProvider;
+                               }
+                       }
+               }
+
+               public override string NewLine {
+                       get {
+                               lock (this){
+                                       return writer.NewLine;
+                               }
+                       }
+
+                       set {
+                               lock (this){
+                                       writer.NewLine = value;
+                               }
+                       }
+               }
+       }
+}