//
-// System.IO.TextWriter
+// System.IO.TextWriter.cs
//
// Authors:
// Marcin Szczepanski (marcins@zipworld.com.au)
// Miguel de Icaza (miguel@gnome.org)
// Paolo Molaro (lupus@ximian.com)
-//
+// Marek Safar (marek.safar@gmail.com)
//
// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright 2011 Xamarin Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
//
using System.Text;
-
-#if NET_2_0
using System.Runtime.InteropServices;
+#if NET_4_5
+using System.Threading.Tasks;
#endif
-namespace System.IO {
+namespace System.IO
+{
[Serializable]
-#if NET_2_0
[ComVisible (true)]
+#if NET_2_1
+ public abstract class TextWriter : IDisposable {
+#else
+ public abstract class TextWriter : MarshalByRefObject, IDisposable
+ {
#endif
- public abstract class TextWriter : MarshalByRefObject, IDisposable {
-
- protected TextWriter() {
+ //
+ // 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)
+ {
+ }
+ }
+
+ protected TextWriter ()
+ {
CoreNewLine = System.Environment.NewLine.ToCharArray ();
}
-
- protected TextWriter( IFormatProvider formatProvider ) {
+
+ protected TextWriter (IFormatProvider formatProvider)
+ {
CoreNewLine = System.Environment.NewLine.ToCharArray ();
- internalFormatProvider = formatProvider;
- }
+ internalFormatProvider = formatProvider;
+ }
- protected char[] CoreNewLine;
+ protected char[] CoreNewLine;
- internal IFormatProvider internalFormatProvider;
+ internal IFormatProvider internalFormatProvider;
- public static readonly TextWriter Null = new NullTextWriter ();
+ public static readonly TextWriter Null = new NullTextWriter ();
- public abstract Encoding Encoding { get; }
+ public abstract Encoding Encoding { get; }
- public virtual IFormatProvider FormatProvider {
- get {
- return internalFormatProvider;
- }
- }
+ public virtual IFormatProvider FormatProvider {
+ get {
+ return internalFormatProvider;
+ }
+ }
+
+ public virtual string NewLine {
+ get {
+ return new string (CoreNewLine);
+ }
- public virtual string NewLine {
- get {
- return new string(CoreNewLine);
- }
-
- set {
+ set {
if (value == null)
value = Environment.NewLine;
- CoreNewLine = value.ToCharArray();
- }
- }
-
- public virtual void Close () {
- Dispose (true);
- }
+ CoreNewLine = value.ToCharArray ();
+ }
+ }
- protected virtual void Dispose (bool disposing) { }
-#if NET_2_0
- public void Dispose ()
+ public virtual void Close ()
{
Dispose (true);
}
-#else
- void System.IDisposable.Dispose () {
- Dispose (true);
+
+ protected virtual void Dispose (bool disposing)
+ {
+ if (disposing) {
+ // If we are explicitly disposed, we can avoid finalization.
+ GC.SuppressFinalize (this);
+ }
}
-#endif
+ public void Dispose ()
+ {
+ Dispose (true);
+ // If we are explicitly disposed, we can avoid finalization.
+ GC.SuppressFinalize (this);
+ }
- public virtual void Flush()
+ public virtual void Flush ()
{
// do nothing
}
- public static TextWriter Synchronized (TextWriter writer)
+ public static TextWriter Synchronized (TextWriter writer)
{
return Synchronized (writer, false);
- }
+ }
- internal static TextWriter Synchronized (TextWriter writer, bool neverClose)
+ 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)
+ public virtual void Write (bool value)
{
Write (value.ToString ());
}
-
- public virtual void Write (char value)
+
+ public virtual void Write (char value)
{
// Do nothing
}
- public virtual void Write (char[] value)
+ public virtual void Write (char[] buffer)
{
- if (value == null)
+ if (buffer == null)
return;
- Write (value, 0, value.Length);
+ Write (buffer, 0, buffer.Length);
}
-
- public virtual void Write (decimal value)
+
+ public virtual void Write (decimal value)
{
Write (value.ToString (internalFormatProvider));
}
-
- public virtual void Write (double value)
+
+ public virtual void Write (double value)
{
Write (value.ToString (internalFormatProvider));
}
- public virtual void Write (int value)
+ public virtual void Write (int value)
{
Write (value.ToString (internalFormatProvider));
}
-
- public virtual void Write (long value)
+
+ public virtual void Write (long value)
{
Write (value.ToString (internalFormatProvider));
}
-
- public virtual void Write (object value)
+
+ public virtual void Write (object value)
{
if (value != null)
Write (value.ToString ());
}
-
- public virtual void Write (float value)
+
+ public virtual void Write (float value)
{
Write (value.ToString (internalFormatProvider));
}
-
- public virtual void Write (string value)
+
+ public virtual void Write (string value)
{
if (value != null)
Write (value.ToCharArray ());
}
-
- [CLSCompliant(false)]
- public virtual void Write (uint value)
+
+ [CLSCompliant (false)]
+ public virtual void Write (uint value)
{
Write (value.ToString (internalFormatProvider));
}
-
- [CLSCompliant(false)]
- public virtual void Write (ulong value)
+
+ [CLSCompliant (false)]
+ public virtual void Write (ulong value)
{
Write (value.ToString (internalFormatProvider));
}
-
- public virtual void Write (string format, object arg0)
+
+ public virtual void Write (string format, object arg0)
{
Write (String.Format (format, arg0));
}
-
- public virtual void Write (string format, params object[] arg)
+
+ public virtual void Write (string format, params object[] arg)
{
Write (String.Format (format, arg));
}
-
- public virtual void Write (char[] buffer, int index, int count)
+
+ public virtual void Write (char[] buffer, int index, int count)
{
if (buffer == null)
throw new ArgumentNullException ("buffer");
throw new ArgumentOutOfRangeException ("count");
for (; count > 0; --count, ++index) {
- Write (buffer [index]);
+ Write (buffer[index]);
}
}
-
- public virtual void Write (string format, object arg0, object arg1)
+
+ 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 )
+
+ public virtual void Write (string format, object arg0, object arg1, object arg2)
{
Write (String.Format (format, arg0, arg1, arg2));
}
-
- public virtual void WriteLine ()
+
+ public virtual void WriteLine ()
{
Write (CoreNewLine);
}
-
- public virtual void WriteLine (bool value)
+
+ public virtual void WriteLine (bool value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (char value)
+
+ public virtual void WriteLine (char value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (char[] value)
+
+ public virtual void WriteLine (char[] buffer)
{
- Write (value);
- WriteLine();
+ Write (buffer);
+ WriteLine ();
}
-
- public virtual void WriteLine (decimal value)
+
+ public virtual void WriteLine (decimal value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (double value)
+
+ public virtual void WriteLine (double value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (int value)
+
+ public virtual void WriteLine (int value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (long value)
+
+ public virtual void WriteLine (long value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (object value)
+
+ public virtual void WriteLine (object value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (float value)
+
+ public virtual void WriteLine (float value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (string value)
+
+ public virtual void WriteLine (string value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- [CLSCompliant(false)]
- public virtual void WriteLine (uint value)
+
+ [CLSCompliant (false)]
+ public virtual void WriteLine (uint value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- [CLSCompliant(false)]
- public virtual void WriteLine (ulong value)
+
+ [CLSCompliant (false)]
+ public virtual void WriteLine (ulong value)
{
Write (value);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (string format, object arg0)
+
+ public virtual void WriteLine (string format, object arg0)
{
Write (format, arg0);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (string format, params object[] arg)
+
+ public virtual void WriteLine (string format, params object[] arg)
{
Write (format, arg);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (char[] buffer, int index, int count)
+
+ public virtual void WriteLine (char[] buffer, int index, int count)
{
Write (buffer, index, count);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (string format, object arg0, object arg1)
+
+ public virtual void WriteLine (string format, object arg0, object arg1)
{
Write (format, arg0, arg1);
- WriteLine();
+ WriteLine ();
}
-
- public virtual void WriteLine (string format, object arg0, object arg1, object arg2)
+
+ public virtual void WriteLine (string format, object arg0, object arg1, object arg2)
{
Write (format, arg0, arg1, arg2);
- WriteLine();
+ WriteLine ();
+ }
+
+#if NET_4_5
+ public virtual Task FlushAsync ()
+ {
+ return Task.Factory.StartNew (l => ((TextWriter)l).Flush (), this);
}
//
- // Null version of the TextWriter, for the `Null' instance variable
+ // Use tuple to pack the arguments because it's faster than
+ // setting up anonymous method container with an instance delegate
//
- 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)
- {
- }
+ public virtual Task WriteAsync (char value)
+ {
+ return Task.Factory.StartNew (l => {
+ var t = (Tuple<TextWriter, char>) l;
+ t.Item1.Write (t.Item2);
+ }, Tuple.Create (this, value));
+ }
+
+ public Task WriteAsync (char[] buffer)
+ {
+ return Task.Factory.StartNew (l => {
+ var t = (Tuple<TextWriter, char[]>) l;
+ t.Item1.Write (t.Item2);
+ }, Tuple.Create (this, buffer));
+ }
+
+ public virtual Task WriteAsync (char[] buffer, int index, int count)
+ {
+ return Task.Factory.StartNew (l => {
+ var t = (Tuple<TextWriter, char[], int, int>) l;
+ t.Item1.Write (t.Item2, t.Item3, t.Item4);
+ }, Tuple.Create (this, buffer, index, count));
+ }
+
+ public virtual Task WriteAsync (string value)
+ {
+ return Task.Factory.StartNew (l => {
+ var t = (Tuple<TextWriter, string>) l;
+ t.Item1.Write (t.Item2);
+ }, Tuple.Create (this, value));
+ }
+
+ public virtual Task WriteLineAsync ()
+ {
+ return WriteAsync (CoreNewLine);
+ }
+
+ public virtual Task WriteLineAsync (char value)
+ {
+ return Task.Factory.StartNew (l => {
+ var t = (Tuple<TextWriter, char>) l;
+ t.Item1.WriteLine (t.Item2);
+ }, Tuple.Create (this, value));
+ }
+
+ public Task WriteLineAsync (char[] buffer)
+ {
+ return Task.Factory.StartNew (l => {
+ var t = (Tuple<TextWriter, char[]>) l;
+ t.Item1.WriteLine (t.Item2);
+ }, Tuple.Create (this, buffer));
+ }
+
+ public virtual Task WriteLineAsync (char[] buffer, int index, int count)
+ {
+ return Task.Factory.StartNew (l => {
+ var t = (Tuple<TextWriter, char[], int, int>) l;
+ t.Item1.WriteLine (t.Item2, t.Item3, t.Item4);
+ }, Tuple.Create (this, buffer, index, count));
}
- }
+
+ public virtual Task WriteLineAsync (string value)
+ {
+ return Task.Factory.StartNew (l => {
+ var t = (Tuple<TextWriter, string>) l;
+ t.Item1.WriteLine (t.Item2);
+ }, Tuple.Create (this, value));
+ }
+#endif
+ }
//
// Sychronized version of the TextWriter.
//
[Serializable]
- internal class SynchronizedWriter : TextWriter {
+ sealed class SynchronizedWriter : TextWriter
+ {
private TextWriter writer;
private bool neverClose;
{
if (neverClose)
return;
- lock (this){
+ lock (this) {
writer.Close ();
}
}
public override void Flush ()
{
- lock (this){
+ lock (this) {
writer.Flush ();
}
}
-#region Write methods
+ #region Write methods
public override void Write (bool value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
-
+
public override void Write (char value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
- public override void Write (char [] value)
+ public override void Write (char[] value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
public override void Write (Decimal value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
public override void Write (int value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
public override void Write (long value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
-
+
public override void Write (object value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
public override void Write (float value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
-
+
public override void Write (string value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
-
+
public override void Write (uint value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
-
+
public override void Write (ulong value)
{
- lock (this){
+ lock (this) {
writer.Write (value);
}
}
-
+
public override void Write (string format, object value)
{
- lock (this){
+ lock (this) {
writer.Write (format, value);
}
}
-
- public override void Write (string format, object [] value)
+
+ public override void Write (string format, object[] value)
{
- lock (this){
+ lock (this) {
writer.Write (format, value);
}
}
- public override void Write (char [] buffer, int index, int count)
+ public override void Write (char[] buffer, int index, int count)
{
- lock (this){
+ lock (this) {
writer.Write (buffer, index, count);
}
}
-
+
public override void Write (string format, object arg0, object arg1)
{
- lock (this){
+ lock (this) {
writer.Write (format, arg0, arg1);
}
}
-
+
public override void Write (string format, object arg0, object arg1, object arg2)
{
- lock (this){
+ lock (this) {
writer.Write (format, arg0, arg1, arg2);
}
}
-#endregion
-#region WriteLine methods
+ #endregion
+ #region WriteLine methods
public override void WriteLine ()
{
- lock (this){
+ lock (this) {
writer.WriteLine ();
}
}
public override void WriteLine (bool value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (char value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
- public override void WriteLine (char [] value)
+ public override void WriteLine (char[] value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (Decimal value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (double value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (int value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (long value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (object value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (float value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (string value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (uint value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (ulong value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (value);
}
}
public override void WriteLine (string format, object value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (format, value);
}
}
- public override void WriteLine (string format, object [] value)
+ public override void WriteLine (string format, object[] value)
{
- lock (this){
+ lock (this) {
writer.WriteLine (format, value);
}
}
- public override void WriteLine (char [] buffer, int index, int count)
+ public override void WriteLine (char[] buffer, int index, int count)
{
- lock (this){
+ lock (this) {
writer.WriteLine (buffer, index, count);
}
}
-
+
public override void WriteLine (string format, object arg0, object arg1)
{
- lock (this){
+ lock (this) {
writer.WriteLine (format, arg0, arg1);
}
}
public override void WriteLine (string format, object arg0, object arg1, object arg2)
{
- lock (this){
+ lock (this) {
writer.WriteLine (format, arg0, arg1, arg2);
}
}
-#endregion
-
+ #endregion
+
+#if NET_4_5
+ public override Task FlushAsync ()
+ {
+ lock (this) {
+ return writer.FlushAsync ();
+ }
+ }
+
+ public override Task WriteAsync (char value)
+ {
+ lock (this) {
+ return writer.WriteAsync (value);
+ }
+ }
+
+ public override Task WriteAsync (char[] buffer, int index, int count)
+ {
+ lock (this) {
+ return writer.WriteAsync (buffer, index, count);
+ }
+ }
+
+ public override Task WriteAsync (string value)
+ {
+ lock (this) {
+ return writer.WriteAsync (value);
+ }
+ }
+
+ public override Task WriteLineAsync ()
+ {
+ lock (this) {
+ return writer.WriteLineAsync ();
+ }
+ }
+
+ public override Task WriteLineAsync (char value)
+ {
+ lock (this) {
+ return writer.WriteLineAsync (value);
+ }
+ }
+
+ public override Task WriteLineAsync (char[] buffer, int index, int count)
+ {
+ lock (this) {
+ return writer.WriteLineAsync (buffer, index, count);
+ }
+ }
+
+ public override Task WriteLineAsync (string value)
+ {
+ lock (this) {
+ return writer.WriteLineAsync (value);
+ }
+ }
+#endif
public override Encoding Encoding {
get {
- lock (this){
+ lock (this) {
return writer.Encoding;
}
}
public override IFormatProvider FormatProvider {
get {
- lock (this){
+ lock (this) {
return writer.FormatProvider;
}
}
public override string NewLine {
get {
- lock (this){
+ lock (this) {
return writer.NewLine;
}
}
set {
- lock (this){
+ lock (this) {
writer.NewLine = value;
}
}
}
}
}
-
-
-
-
-