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)
8 // Marek Safar (marek.safar@gmail.com)
11 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
12 // Copyright 2011 Xamarin Inc.
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using System.Runtime.InteropServices;
37 using System.Threading.Tasks;
46 public abstract class TextWriter : IDisposable {
48 public abstract class TextWriter : MarshalByRefObject, IDisposable
52 // Null version of the TextWriter, for the `Null' instance variable
54 sealed class NullTextWriter : TextWriter
56 public override Encoding Encoding
60 return Encoding.Default;
64 public override void Write (string s)
67 public override void Write (char value)
70 public override void Write (char[] value, int index, int count)
75 protected TextWriter ()
77 CoreNewLine = System.Environment.NewLine.ToCharArray ();
80 protected TextWriter (IFormatProvider formatProvider)
82 CoreNewLine = System.Environment.NewLine.ToCharArray ();
83 internalFormatProvider = formatProvider;
86 protected char[] CoreNewLine;
88 internal IFormatProvider internalFormatProvider;
90 public static readonly TextWriter Null = new NullTextWriter ();
92 public abstract Encoding Encoding { get; }
94 public virtual IFormatProvider FormatProvider {
96 return internalFormatProvider;
100 public virtual string NewLine {
102 return new string (CoreNewLine);
107 value = Environment.NewLine;
109 CoreNewLine = value.ToCharArray ();
113 public virtual void Close ()
118 protected virtual void Dispose (bool disposing)
121 // If we are explicitly disposed, we can avoid finalization.
122 GC.SuppressFinalize (this);
125 public void Dispose ()
129 // If we are explicitly disposed, we can avoid finalization.
130 GC.SuppressFinalize (this);
133 public virtual void Flush ()
138 public static TextWriter Synchronized (TextWriter writer)
140 return Synchronized (writer, false);
143 internal static TextWriter Synchronized (TextWriter writer, bool neverClose)
146 throw new ArgumentNullException ("writer is null");
148 if (writer is SynchronizedWriter)
151 return new SynchronizedWriter (writer, neverClose);
154 public virtual void Write (bool value)
156 Write (value.ToString ());
159 public virtual void Write (char value)
164 public virtual void Write (char[] buffer)
168 Write (buffer, 0, buffer.Length);
171 public virtual void Write (decimal value)
173 Write (value.ToString (internalFormatProvider));
176 public virtual void Write (double value)
178 Write (value.ToString (internalFormatProvider));
181 public virtual void Write (int value)
183 Write (value.ToString (internalFormatProvider));
186 public virtual void Write (long value)
188 Write (value.ToString (internalFormatProvider));
191 public virtual void Write (object value)
194 Write (value.ToString ());
197 public virtual void Write (float value)
199 Write (value.ToString (internalFormatProvider));
202 public virtual void Write (string value)
205 Write (value.ToCharArray ());
208 [CLSCompliant (false)]
209 public virtual void Write (uint value)
211 Write (value.ToString (internalFormatProvider));
214 [CLSCompliant (false)]
215 public virtual void Write (ulong value)
217 Write (value.ToString (internalFormatProvider));
220 public virtual void Write (string format, object arg0)
222 Write (String.Format (format, arg0));
225 public virtual void Write (string format, params object[] arg)
227 Write (String.Format (format, arg));
230 public virtual void Write (char[] buffer, int index, int count)
233 throw new ArgumentNullException ("buffer");
234 if (index < 0 || index > buffer.Length)
235 throw new ArgumentOutOfRangeException ("index");
236 // re-ordered to avoid possible integer overflow
237 if (count < 0 || (index > buffer.Length - count))
238 throw new ArgumentOutOfRangeException ("count");
240 for (; count > 0; --count, ++index) {
241 Write (buffer[index]);
245 public virtual void Write (string format, object arg0, object arg1)
247 Write (String.Format (format, arg0, arg1));
250 public virtual void Write (string format, object arg0, object arg1, object arg2)
252 Write (String.Format (format, arg0, arg1, arg2));
255 public virtual void WriteLine ()
260 public virtual void WriteLine (bool value)
266 public virtual void WriteLine (char value)
272 public virtual void WriteLine (char[] buffer)
278 public virtual void WriteLine (decimal value)
284 public virtual void WriteLine (double value)
290 public virtual void WriteLine (int value)
296 public virtual void WriteLine (long value)
302 public virtual void WriteLine (object value)
308 public virtual void WriteLine (float value)
314 public virtual void WriteLine (string value)
320 [CLSCompliant (false)]
321 public virtual void WriteLine (uint value)
327 [CLSCompliant (false)]
328 public virtual void WriteLine (ulong value)
334 public virtual void WriteLine (string format, object arg0)
336 Write (format, arg0);
340 public virtual void WriteLine (string format, params object[] arg)
346 public virtual void WriteLine (char[] buffer, int index, int count)
348 Write (buffer, index, count);
352 public virtual void WriteLine (string format, object arg0, object arg1)
354 Write (format, arg0, arg1);
358 public virtual void WriteLine (string format, object arg0, object arg1, object arg2)
360 Write (format, arg0, arg1, arg2);
365 public virtual Task FlushAsync ()
367 return Task.Factory.StartNew (l => ((TextWriter)l).Flush (), this);
371 // Use tuple to pack the arguments because it's faster than
372 // setting up anonymous method container with an instance delegate
374 public virtual Task WriteAsync (char value)
376 return Task.Factory.StartNew (l => {
377 var t = (Tuple<TextWriter, char>) l;
378 t.Item1.Write (t.Item2);
379 }, Tuple.Create (this, value));
382 public Task WriteAsync (char[] buffer)
384 return Task.Factory.StartNew (l => {
385 var t = (Tuple<TextWriter, char[]>) l;
386 t.Item1.Write (t.Item2);
387 }, Tuple.Create (this, buffer));
390 public virtual Task WriteAsync (char[] buffer, int index, int count)
392 return Task.Factory.StartNew (l => {
393 var t = (Tuple<TextWriter, char[], int, int>) l;
394 t.Item1.Write (t.Item2, t.Item3, t.Item4);
395 }, Tuple.Create (this, buffer, index, count));
398 public virtual Task WriteAsync (string value)
400 return Task.Factory.StartNew (l => {
401 var t = (Tuple<TextWriter, string>) l;
402 t.Item1.Write (t.Item2);
403 }, Tuple.Create (this, value));
406 public virtual Task WriteLineAsync ()
408 return WriteAsync (CoreNewLine);
411 public virtual Task WriteLineAsync (char value)
413 return Task.Factory.StartNew (l => {
414 var t = (Tuple<TextWriter, char>) l;
415 t.Item1.WriteLine (t.Item2);
416 }, Tuple.Create (this, value));
419 public Task WriteLineAsync (char[] buffer)
421 return Task.Factory.StartNew (l => {
422 var t = (Tuple<TextWriter, char[]>) l;
423 t.Item1.WriteLine (t.Item2);
424 }, Tuple.Create (this, buffer));
427 public virtual Task WriteLineAsync (char[] buffer, int index, int count)
429 return Task.Factory.StartNew (l => {
430 var t = (Tuple<TextWriter, char[], int, int>) l;
431 t.Item1.WriteLine (t.Item2, t.Item3, t.Item4);
432 }, Tuple.Create (this, buffer, index, count));
435 public virtual Task WriteLineAsync (string value)
437 return Task.Factory.StartNew (l => {
438 var t = (Tuple<TextWriter, string>) l;
439 t.Item1.WriteLine (t.Item2);
440 }, Tuple.Create (this, value));
446 // Sychronized version of the TextWriter.
449 sealed class SynchronizedWriter : TextWriter
451 private TextWriter writer;
452 private bool neverClose;
454 public SynchronizedWriter (TextWriter writer)
455 : this (writer, false)
459 public SynchronizedWriter (TextWriter writer, bool neverClose)
461 this.writer = writer;
462 this.neverClose = neverClose;
465 public override void Close ()
474 public override void Flush ()
481 #region Write methods
482 public override void Write (bool value)
485 writer.Write (value);
489 public override void Write (char value)
492 writer.Write (value);
496 public override void Write (char[] value)
499 writer.Write (value);
503 public override void Write (Decimal value)
506 writer.Write (value);
510 public override void Write (int value)
513 writer.Write (value);
517 public override void Write (long value)
520 writer.Write (value);
524 public override void Write (object value)
527 writer.Write (value);
531 public override void Write (float value)
534 writer.Write (value);
538 public override void Write (string value)
541 writer.Write (value);
545 public override void Write (uint value)
548 writer.Write (value);
552 public override void Write (ulong value)
555 writer.Write (value);
559 public override void Write (string format, object value)
562 writer.Write (format, value);
566 public override void Write (string format, object[] value)
569 writer.Write (format, value);
573 public override void Write (char[] buffer, int index, int count)
576 writer.Write (buffer, index, count);
580 public override void Write (string format, object arg0, object arg1)
583 writer.Write (format, arg0, arg1);
587 public override void Write (string format, object arg0, object arg1, object arg2)
590 writer.Write (format, arg0, arg1, arg2);
594 #region WriteLine methods
595 public override void WriteLine ()
602 public override void WriteLine (bool value)
605 writer.WriteLine (value);
609 public override void WriteLine (char value)
612 writer.WriteLine (value);
616 public override void WriteLine (char[] value)
619 writer.WriteLine (value);
623 public override void WriteLine (Decimal value)
626 writer.WriteLine (value);
630 public override void WriteLine (double value)
633 writer.WriteLine (value);
637 public override void WriteLine (int value)
640 writer.WriteLine (value);
644 public override void WriteLine (long value)
647 writer.WriteLine (value);
651 public override void WriteLine (object value)
654 writer.WriteLine (value);
658 public override void WriteLine (float value)
661 writer.WriteLine (value);
665 public override void WriteLine (string value)
668 writer.WriteLine (value);
672 public override void WriteLine (uint value)
675 writer.WriteLine (value);
679 public override void WriteLine (ulong value)
682 writer.WriteLine (value);
686 public override void WriteLine (string format, object value)
689 writer.WriteLine (format, value);
693 public override void WriteLine (string format, object[] value)
696 writer.WriteLine (format, value);
700 public override void WriteLine (char[] buffer, int index, int count)
703 writer.WriteLine (buffer, index, count);
707 public override void WriteLine (string format, object arg0, object arg1)
710 writer.WriteLine (format, arg0, arg1);
714 public override void WriteLine (string format, object arg0, object arg1, object arg2)
717 writer.WriteLine (format, arg0, arg1, arg2);
723 public override Task FlushAsync ()
726 return writer.FlushAsync ();
730 public override Task WriteAsync (char value)
733 return writer.WriteAsync (value);
737 public override Task WriteAsync (char[] buffer, int index, int count)
740 return writer.WriteAsync (buffer, index, count);
744 public override Task WriteAsync (string value)
747 return writer.WriteAsync (value);
751 public override Task WriteLineAsync ()
754 return writer.WriteLineAsync ();
758 public override Task WriteLineAsync (char value)
761 return writer.WriteLineAsync (value);
765 public override Task WriteLineAsync (char[] buffer, int index, int count)
768 return writer.WriteLineAsync (buffer, index, count);
772 public override Task WriteLineAsync (string value)
775 return writer.WriteLineAsync (value);
779 public override Encoding Encoding {
782 return writer.Encoding;
787 public override IFormatProvider FormatProvider {
790 return writer.FormatProvider;
795 public override string NewLine {
798 return writer.NewLine;
804 writer.NewLine = value;