2 // System.IO.TextWriter.cs
5 // Marcin Szczepanski (marcins@zipworld.com.au)
6 // Miguel de Icaza (miguel@gnome.org)
7 // Paolo Molaro (lupus@ximian.com)
11 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 using System.Runtime.InteropServices;
46 public abstract class TextWriter : IDisposable {
48 public abstract class TextWriter : MarshalByRefObject, IDisposable {
51 protected TextWriter() {
52 CoreNewLine = System.Environment.NewLine.ToCharArray ();
55 protected TextWriter( IFormatProvider formatProvider ) {
56 CoreNewLine = System.Environment.NewLine.ToCharArray ();
57 internalFormatProvider = formatProvider;
60 protected char[] CoreNewLine;
62 internal IFormatProvider internalFormatProvider;
64 public static readonly TextWriter Null = new NullTextWriter ();
66 public abstract Encoding Encoding { get; }
68 public virtual IFormatProvider FormatProvider {
70 return internalFormatProvider;
74 public virtual string NewLine {
76 return new string(CoreNewLine);
81 value = Environment.NewLine;
83 CoreNewLine = value.ToCharArray();
87 public virtual void Close () {
91 protected virtual void Dispose (bool disposing)
94 // If we are explicitly disposed, we can avoid finalization.
95 GC.SuppressFinalize (this);
99 public void Dispose ()
103 // If we are explicitly disposed, we can avoid finalization.
104 GC.SuppressFinalize (this);
107 void System.IDisposable.Dispose () {
113 public virtual void Flush()
118 public static TextWriter Synchronized (TextWriter writer)
120 return Synchronized (writer, false);
123 internal static TextWriter Synchronized (TextWriter writer, bool neverClose)
126 throw new ArgumentNullException ("writer is null");
128 if (writer is SynchronizedWriter)
131 return new SynchronizedWriter (writer, neverClose);
134 public virtual void Write (bool value)
136 Write (value.ToString ());
139 public virtual void Write (char value)
144 public virtual void Write (char[] buffer)
148 Write (buffer, 0, buffer.Length);
151 public virtual void Write (decimal value)
153 Write (value.ToString (internalFormatProvider));
156 public virtual void Write (double value)
158 Write (value.ToString (internalFormatProvider));
161 public virtual void Write (int value)
163 Write (value.ToString (internalFormatProvider));
166 public virtual void Write (long value)
168 Write (value.ToString (internalFormatProvider));
171 public virtual void Write (object value)
174 Write (value.ToString ());
177 public virtual void Write (float value)
179 Write (value.ToString (internalFormatProvider));
182 public virtual void Write (string value)
185 Write (value.ToCharArray ());
188 [CLSCompliant(false)]
189 public virtual void Write (uint value)
191 Write (value.ToString (internalFormatProvider));
194 [CLSCompliant(false)]
195 public virtual void Write (ulong value)
197 Write (value.ToString (internalFormatProvider));
200 public virtual void Write (string format, object arg0)
202 Write (String.Format (format, arg0));
205 public virtual void Write (string format, params object[] arg)
207 Write (String.Format (format, arg));
210 public virtual void Write (char[] buffer, int index, int count)
213 throw new ArgumentNullException ("buffer");
214 if (index < 0 || index > buffer.Length)
215 throw new ArgumentOutOfRangeException ("index");
216 // re-ordered to avoid possible integer overflow
217 if (count < 0 || (index > buffer.Length - count))
218 throw new ArgumentOutOfRangeException ("count");
220 for (; count > 0; --count, ++index) {
221 Write (buffer [index]);
225 public virtual void Write (string format, object arg0, object arg1)
227 Write (String.Format (format, arg0, arg1));
230 public virtual void Write (string format, object arg0, object arg1, object arg2 )
232 Write (String.Format (format, arg0, arg1, arg2));
235 public virtual void WriteLine ()
240 public virtual void WriteLine (bool value)
246 public virtual void WriteLine (char value)
252 public virtual void WriteLine (char[] buffer)
258 public virtual void WriteLine (decimal value)
264 public virtual void WriteLine (double value)
270 public virtual void WriteLine (int value)
276 public virtual void WriteLine (long value)
282 public virtual void WriteLine (object value)
288 public virtual void WriteLine (float value)
294 public virtual void WriteLine (string value)
300 [CLSCompliant(false)]
301 public virtual void WriteLine (uint value)
307 [CLSCompliant(false)]
308 public virtual void WriteLine (ulong value)
314 public virtual void WriteLine (string format, object arg0)
316 Write (format, arg0);
320 public virtual void WriteLine (string format, params object[] arg)
326 public virtual void WriteLine (char[] buffer, int index, int count)
328 Write (buffer, index, count);
332 public virtual void WriteLine (string format, object arg0, object arg1)
334 Write (format, arg0, arg1);
338 public virtual void WriteLine (string format, object arg0, object arg1, object arg2)
340 Write (format, arg0, arg1, arg2);
345 // Null version of the TextWriter, for the `Null' instance variable
347 sealed class NullTextWriter : TextWriter {
348 public override Encoding Encoding {
350 return Encoding.Default;
354 public override void Write (string s)
357 public override void Write (char value)
360 public override void Write (char[] value, int index, int count)
367 // Sychronized version of the TextWriter.
370 internal class SynchronizedWriter : TextWriter {
371 private TextWriter writer;
372 private bool neverClose;
374 public SynchronizedWriter (TextWriter writer)
375 : this (writer, false)
379 public SynchronizedWriter (TextWriter writer, bool neverClose)
381 this.writer = writer;
382 this.neverClose = neverClose;
385 public override void Close ()
394 public override void Flush ()
401 #region Write methods
402 public override void Write (bool value)
405 writer.Write (value);
409 public override void Write (char value)
412 writer.Write (value);
416 public override void Write (char [] value)
419 writer.Write (value);
423 public override void Write (Decimal value)
426 writer.Write (value);
430 public override void Write (int value)
433 writer.Write (value);
437 public override void Write (long value)
440 writer.Write (value);
444 public override void Write (object value)
447 writer.Write (value);
451 public override void Write (float value)
454 writer.Write (value);
458 public override void Write (string value)
461 writer.Write (value);
465 public override void Write (uint value)
468 writer.Write (value);
472 public override void Write (ulong value)
475 writer.Write (value);
479 public override void Write (string format, object value)
482 writer.Write (format, value);
486 public override void Write (string format, object [] value)
489 writer.Write (format, value);
493 public override void Write (char [] buffer, int index, int count)
496 writer.Write (buffer, index, count);
500 public override void Write (string format, object arg0, object arg1)
503 writer.Write (format, arg0, arg1);
507 public override void Write (string format, object arg0, object arg1, object arg2)
510 writer.Write (format, arg0, arg1, arg2);
514 #region WriteLine methods
515 public override void WriteLine ()
522 public override void WriteLine (bool value)
525 writer.WriteLine (value);
529 public override void WriteLine (char value)
532 writer.WriteLine (value);
536 public override void WriteLine (char [] value)
539 writer.WriteLine (value);
543 public override void WriteLine (Decimal value)
546 writer.WriteLine (value);
550 public override void WriteLine (double value)
553 writer.WriteLine (value);
557 public override void WriteLine (int value)
560 writer.WriteLine (value);
564 public override void WriteLine (long value)
567 writer.WriteLine (value);
571 public override void WriteLine (object value)
574 writer.WriteLine (value);
578 public override void WriteLine (float value)
581 writer.WriteLine (value);
585 public override void WriteLine (string value)
588 writer.WriteLine (value);
592 public override void WriteLine (uint value)
595 writer.WriteLine (value);
599 public override void WriteLine (ulong value)
602 writer.WriteLine (value);
606 public override void WriteLine (string format, object value)
609 writer.WriteLine (format, value);
613 public override void WriteLine (string format, object [] value)
616 writer.WriteLine (format, value);
620 public override void WriteLine (char [] buffer, int index, int count)
623 writer.WriteLine (buffer, index, count);
627 public override void WriteLine (string format, object arg0, object arg1)
630 writer.WriteLine (format, arg0, arg1);
634 public override void WriteLine (string format, object arg0, object arg1, object arg2)
637 writer.WriteLine (format, arg0, arg1, arg2);
642 public override Encoding Encoding {
645 return writer.Encoding;
650 public override IFormatProvider FormatProvider {
653 return writer.FormatProvider;
658 public override string NewLine {
661 return writer.NewLine;
667 writer.NewLine = value;