Copied remotely
[mono.git] / mcs / class / corlib / System.IO / TextWriter.cs
1 //\r
2 // System.IO.TextWriter\r
3 //\r
4 // Authors:\r
5 //   Marcin Szczepanski (marcins@zipworld.com.au)\r
6 //   Miguel de Icaza (miguel@gnome.org)\r
7 //   Paolo Molaro (lupus@ximian.com)\r
8 //\r
9 \r
10 //\r
11 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)\r
12 //\r
13 // Permission is hereby granted, free of charge, to any person obtaining\r
14 // a copy of this software and associated documentation files (the\r
15 // "Software"), to deal in the Software without restriction, including\r
16 // without limitation the rights to use, copy, modify, merge, publish,\r
17 // distribute, sublicense, and/or sell copies of the Software, and to\r
18 // permit persons to whom the Software is furnished to do so, subject to\r
19 // the following conditions:\r
20 // \r
21 // The above copyright notice and this permission notice shall be\r
22 // included in all copies or substantial portions of the Software.\r
23 // \r
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
31 //\r
32 \r
33 using System.Text;\r
34 \r
35 namespace System.IO {\r
36 \r
37         [Serializable]\r
38         public abstract class TextWriter : MarshalByRefObject, IDisposable {\r
39                 \r
40                 protected TextWriter() {\r
41                         CoreNewLine = System.Environment.NewLine.ToCharArray ();\r
42                 }\r
43                 \r
44                 protected TextWriter( IFormatProvider formatProvider ) {\r
45                         CoreNewLine = System.Environment.NewLine.ToCharArray ();\r
46                         internalFormatProvider = formatProvider;\r
47                 }\r
48 \r
49                 protected char[] CoreNewLine;\r
50 \r
51                 internal IFormatProvider internalFormatProvider;\r
52 \r
53                 public static readonly TextWriter Null = new NullTextWriter ();\r
54 \r
55                 public abstract Encoding Encoding { get; }\r
56 \r
57                 public virtual IFormatProvider FormatProvider { \r
58                         get {\r
59                                 return internalFormatProvider;\r
60                         } \r
61                 }\r
62 \r
63                 public virtual string NewLine { \r
64                         get {\r
65                                 return new string(CoreNewLine);\r
66                         }\r
67                         \r
68                         set {\r
69                                 if (value == null)\r
70                                         value = Environment.NewLine;\r
71 \r
72                                 CoreNewLine = value.ToCharArray();\r
73                         }\r
74                 }\r
75 \r
76                 public virtual void Close () { \r
77                         Dispose (true);\r
78                 }\r
79 \r
80                 protected virtual void Dispose (bool disposing) { }\r
81                 \r
82                 void System.IDisposable.Dispose () {\r
83                         Dispose (true);\r
84                 }\r
85 \r
86 \r
87                 public virtual void Flush()\r
88                 {\r
89                         // do nothing\r
90                 }\r
91 \r
92                 public static TextWriter Synchronized (TextWriter writer)\r
93                 {\r
94                         return Synchronized (writer, false);\r
95                 }\r
96 \r
97                 internal static TextWriter Synchronized (TextWriter writer, bool neverClose)\r
98                 {\r
99                         if (writer == null)\r
100                                 throw new ArgumentNullException ("writer is null");\r
101 \r
102                         if (writer is SynchronizedWriter)\r
103                                 return writer;\r
104                         \r
105                         return new SynchronizedWriter (writer, neverClose);\r
106                 }\r
107 \r
108                 public virtual void Write (bool value)\r
109                 {\r
110                         Write (value.ToString ());\r
111                 }\r
112                 \r
113                 public virtual void Write (char value)\r
114                 {\r
115                         // Do nothing\r
116                 }\r
117 \r
118                 public virtual void Write (char[] value)\r
119                 {\r
120                         if (value != null) {\r
121                                 for (int i = 0; i < value.Length; ++i)\r
122                                         Write (value [i]);\r
123                         }\r
124                 }\r
125                 \r
126                 public virtual void Write (decimal value)\r
127                 {\r
128                         Write (value.ToString (internalFormatProvider));\r
129                 }\r
130                 \r
131                 public virtual void Write (double value)\r
132                 {\r
133                         Write (value.ToString (internalFormatProvider));\r
134                 }\r
135 \r
136                 public virtual void Write (int value)\r
137                 {\r
138                         Write (value.ToString (internalFormatProvider));\r
139                 }\r
140                 \r
141                 public virtual void Write (long value)\r
142                 {\r
143                         Write (value.ToString (internalFormatProvider));\r
144                 }\r
145                 \r
146                 public virtual void Write (object value)\r
147                 {\r
148                         if (value != null)\r
149                                 Write (value.ToString ());\r
150                 }\r
151                 \r
152                 public virtual void Write (float value)\r
153                 {\r
154                         Write (value.ToString (internalFormatProvider));\r
155                 }\r
156                 \r
157                 public virtual void Write (string value)\r
158                 {\r
159                         if (value != null)\r
160                                 Write (value.ToCharArray ());\r
161                 }\r
162                 \r
163                 [CLSCompliant(false)]\r
164                 public virtual void Write (uint value)\r
165                 {\r
166                         Write (value.ToString (internalFormatProvider));\r
167                 }\r
168                 \r
169                 [CLSCompliant(false)]\r
170                 public virtual void Write (ulong value)\r
171                 {\r
172                         Write (value.ToString (internalFormatProvider));\r
173                 }\r
174                 \r
175                 public virtual void Write (string format, object arg0)\r
176                 {\r
177                         Write (String.Format (format, arg0));\r
178                 }\r
179                 \r
180                 public virtual void Write (string format, params object[] arg)\r
181                 {\r
182                         Write (String.Format (format, arg));\r
183                 }\r
184                 \r
185                 public virtual void Write (char[] buffer, int index, int count)\r
186                 {\r
187                         if (buffer == null)\r
188                                 throw new ArgumentNullException ("buffer");\r
189                         if (index < 0 || index > buffer.Length)\r
190                                 throw new ArgumentOutOfRangeException ("index");\r
191                         // re-ordered to avoid possible integer overflow\r
192                         if (count < 0 || (index > buffer.Length - count))\r
193                                 throw new ArgumentOutOfRangeException ("count");\r
194 \r
195                         for (; count > 0; --count, ++index) {\r
196                                 Write (buffer [index]);\r
197                         }\r
198                 }\r
199                 \r
200                 public virtual void Write (string format, object arg0, object arg1)\r
201                 {\r
202                         Write (String.Format (format, arg0, arg1));\r
203                 }\r
204                 \r
205                 public virtual void Write (string format, object arg0, object arg1, object arg2 )\r
206                 {\r
207                         Write (String.Format (format, arg0, arg1, arg2));\r
208                 }\r
209                 \r
210                 public virtual void WriteLine ()\r
211                 {\r
212                         Write (CoreNewLine);\r
213                 }\r
214                 \r
215                 public virtual void WriteLine (bool value)\r
216                 {\r
217                         Write (value);\r
218                         WriteLine();\r
219                 }\r
220                 \r
221                 public virtual void WriteLine (char value)\r
222                 {\r
223                         Write (value);\r
224                         WriteLine();\r
225                 }\r
226                 \r
227                 public virtual void WriteLine (char[] value)\r
228                 {\r
229                         Write (value);\r
230                         WriteLine();\r
231                 }\r
232                 \r
233                 public virtual void WriteLine (decimal value)\r
234                 {\r
235                         Write (value);\r
236                         WriteLine();\r
237                 }\r
238                 \r
239                 public virtual void WriteLine (double value)\r
240                 {\r
241                         Write (value);\r
242                         WriteLine();\r
243                 }\r
244                 \r
245                 public virtual void WriteLine (int value)\r
246                 {\r
247                         Write (value);\r
248                         WriteLine();\r
249                 }\r
250                 \r
251                 public virtual void WriteLine (long value)\r
252                 {\r
253                         Write (value);\r
254                         WriteLine();\r
255                 }\r
256                 \r
257                 public virtual void WriteLine (object value)\r
258                 {\r
259                         Write (value);\r
260                         WriteLine();\r
261                 }\r
262                 \r
263                 public virtual void WriteLine (float value)\r
264                 {\r
265                         Write (value);\r
266                         WriteLine();\r
267                 }\r
268                 \r
269                 public virtual void WriteLine (string value)\r
270                 {\r
271                         Write (value);\r
272                         WriteLine();\r
273                 }\r
274                 \r
275                 [CLSCompliant(false)]\r
276                 public virtual void WriteLine (uint value)\r
277                 {\r
278                         Write (value);\r
279                         WriteLine();\r
280                 }\r
281                 \r
282                 [CLSCompliant(false)]\r
283                 public virtual void WriteLine (ulong value)\r
284                 {\r
285                         Write (value);\r
286                         WriteLine();\r
287                 }\r
288                 \r
289                 public virtual void WriteLine (string format, object arg0)\r
290                 {\r
291                         Write (format, arg0);\r
292                         WriteLine();\r
293                 }\r
294                 \r
295                 public virtual void WriteLine (string format, params object[] arg)\r
296                 {\r
297                         Write (format, arg);\r
298                         WriteLine();\r
299                 }\r
300                 \r
301                 public virtual void WriteLine (char[] buffer, int index, int count)\r
302                 {\r
303                         Write (buffer, index, count);\r
304                         WriteLine();\r
305                 }\r
306                 \r
307                 public virtual void WriteLine (string format, object arg0, object arg1)\r
308                 {\r
309                         Write (format, arg0, arg1);\r
310                         WriteLine();\r
311                 }\r
312                 \r
313                 public virtual void WriteLine (string format, object arg0, object arg1, object arg2)\r
314                 {\r
315                         Write (format, arg0, arg1, arg2);\r
316                         WriteLine();\r
317                 }\r
318 \r
319                 //\r
320                 // Null version of the TextWriter, for the `Null' instance variable\r
321                 //\r
322                 sealed class NullTextWriter : TextWriter {\r
323                         public override Encoding Encoding {\r
324                                 get {\r
325                                         return Encoding.Default;\r
326                                 }\r
327                         }\r
328                         \r
329                         public override void Write (string s)\r
330                         {\r
331                         }\r
332                         public override void Write (char value)\r
333                         {\r
334                         }\r
335                         public override void Write (char[] value, int index, int count)\r
336                         {\r
337                         }\r
338                 }\r
339         }\r
340 \r
341         //\r
342         // Sychronized version of the TextWriter.\r
343         //\r
344         [Serializable]\r
345         internal class SynchronizedWriter : TextWriter {\r
346                 private TextWriter writer;\r
347                 private bool neverClose;\r
348 \r
349                 public SynchronizedWriter (TextWriter writer)\r
350                         : this (writer, false)\r
351                 {\r
352                 }\r
353 \r
354                 public SynchronizedWriter (TextWriter writer, bool neverClose)\r
355                 {\r
356                         this.writer = writer;\r
357                         this.neverClose = neverClose;\r
358                 }\r
359 \r
360                 public override void Close ()\r
361                 {\r
362                         if (neverClose)\r
363                                 return;\r
364                         lock (this){\r
365                                 writer.Close ();\r
366                         }\r
367                 }\r
368 \r
369                 public override void Flush ()\r
370                 {\r
371                         lock (this){\r
372                                 writer.Flush ();\r
373                         }\r
374                 }\r
375 \r
376 #region Write methods\r
377                 public override void Write (bool value)\r
378                 {\r
379                         lock (this){\r
380                                 writer.Write (value);\r
381                         }\r
382                 }\r
383                 \r
384                 public override void Write (char value)\r
385                 {\r
386                         lock (this){\r
387                                 writer.Write (value);\r
388                         }\r
389                 }\r
390 \r
391                 public override void Write (char [] value)\r
392                 {\r
393                         lock (this){\r
394                                 writer.Write (value);\r
395                         }\r
396                 }\r
397 \r
398                 public override void Write (Decimal value)\r
399                 {\r
400                         lock (this){\r
401                                 writer.Write (value);\r
402                         }\r
403                 }\r
404 \r
405                 public override void Write (int value)\r
406                 {\r
407                         lock (this){\r
408                                 writer.Write (value);\r
409                         }\r
410                 }\r
411 \r
412                 public override void Write (long value)\r
413                 {\r
414                         lock (this){\r
415                                 writer.Write (value);\r
416                         }\r
417                 }\r
418                 \r
419                 public override void Write (object value)\r
420                 {\r
421                         lock (this){\r
422                                 writer.Write (value);\r
423                         }\r
424                 }\r
425 \r
426                 public override void Write (float value)\r
427                 {\r
428                         lock (this){\r
429                                 writer.Write (value);\r
430                         }\r
431                 }\r
432                 \r
433                 public override void Write (string value)\r
434                 {\r
435                         lock (this){\r
436                                 writer.Write (value);\r
437                         }\r
438                 }\r
439                 \r
440                 public override void Write (uint value)\r
441                 {\r
442                         lock (this){\r
443                                 writer.Write (value);\r
444                         }\r
445                 }\r
446                 \r
447                 public override void Write (ulong value)\r
448                 {\r
449                         lock (this){\r
450                                 writer.Write (value);\r
451                         }\r
452                 }\r
453                 \r
454                 public override void Write (string format, object value)\r
455                 {\r
456                         lock (this){\r
457                                 writer.Write (format, value);\r
458                         }\r
459                 }\r
460                 \r
461                 public override void Write (string format, object [] value)\r
462                 {\r
463                         lock (this){\r
464                                 writer.Write (format, value);\r
465                         }\r
466                 }\r
467 \r
468                 public override void Write (char [] buffer, int index, int count)\r
469                 {\r
470                         lock (this){\r
471                                 writer.Write (buffer, index, count);\r
472                         }\r
473                 }\r
474                 \r
475                 public override void Write (string format, object arg0, object arg1)\r
476                 {\r
477                         lock (this){\r
478                                 writer.Write (format, arg0, arg1);\r
479                         }\r
480                 }\r
481                 \r
482                 public override void Write (string format, object arg0, object arg1, object arg2)\r
483                 {\r
484                         lock (this){\r
485                                 writer.Write (format, arg0, arg1, arg2);\r
486                         }\r
487                 }\r
488 #endregion\r
489 #region WriteLine methods\r
490                 public override void WriteLine ()\r
491                 {\r
492                         lock (this){\r
493                                 writer.WriteLine ();\r
494                         }\r
495                 }\r
496 \r
497                 public override void WriteLine (bool value)\r
498                 {\r
499                         lock (this){\r
500                                 writer.WriteLine (value);\r
501                         }\r
502                 }\r
503 \r
504                 public override void WriteLine (char value)\r
505                 {\r
506                         lock (this){\r
507                                 writer.WriteLine (value);\r
508                         }\r
509                 }\r
510 \r
511                 public override void WriteLine (char [] value)\r
512                 {\r
513                         lock (this){\r
514                                 writer.WriteLine (value);\r
515                         }\r
516                 }\r
517 \r
518                 public override void WriteLine (Decimal value)\r
519                 {\r
520                         lock (this){\r
521                                 writer.WriteLine (value);\r
522                         }\r
523                 }\r
524 \r
525                 public override void WriteLine (double value)\r
526                 {\r
527                         lock (this){\r
528                                 writer.WriteLine (value);\r
529                         }\r
530                 }\r
531 \r
532                 public override void WriteLine (int value)\r
533                 {\r
534                         lock (this){\r
535                                 writer.WriteLine (value);\r
536                         }\r
537                 }\r
538 \r
539                 public override void WriteLine (long value)\r
540                 {\r
541                         lock (this){\r
542                                 writer.WriteLine (value);\r
543                         }\r
544                 }\r
545 \r
546                 public override void WriteLine (object value)\r
547                 {\r
548                         lock (this){\r
549                                 writer.WriteLine (value);\r
550                         }\r
551                 }\r
552 \r
553                 public override void WriteLine (float value)\r
554                 {\r
555                         lock (this){\r
556                                 writer.WriteLine (value);\r
557                         }\r
558                 }\r
559 \r
560                 public override void WriteLine (string value)\r
561                 {\r
562                         lock (this){\r
563                                 writer.WriteLine (value);\r
564                         }\r
565                 }\r
566 \r
567                 public override void WriteLine (uint value)\r
568                 {\r
569                         lock (this){\r
570                                 writer.WriteLine (value);\r
571                         }\r
572                 }\r
573 \r
574                 public override void WriteLine (ulong value)\r
575                 {\r
576                         lock (this){\r
577                                 writer.WriteLine (value);\r
578                         }\r
579                 }\r
580 \r
581                 public override void WriteLine (string format, object value)\r
582                 {\r
583                         lock (this){\r
584                                 writer.WriteLine (format, value);\r
585                         }\r
586                 }\r
587 \r
588                 public override void WriteLine (string format, object [] value)\r
589                 {\r
590                         lock (this){\r
591                                 writer.WriteLine (format, value);\r
592                         }\r
593                 }\r
594 \r
595                 public override void WriteLine (char [] buffer, int index, int count)\r
596                 {\r
597                         lock (this){\r
598                                 writer.WriteLine (buffer, index, count);\r
599                         }\r
600                 }\r
601                 \r
602                 public override void WriteLine (string format, object arg0, object arg1)\r
603                 {\r
604                         lock (this){\r
605                                 writer.WriteLine (format, arg0, arg1);\r
606                         }\r
607                 }\r
608 \r
609                 public override void WriteLine (string format, object arg0, object arg1, object arg2)\r
610                 {\r
611                         lock (this){\r
612                                 writer.WriteLine (format, arg0, arg1, arg2);\r
613                         }\r
614                 }\r
615 #endregion\r
616                 \r
617                 public override Encoding Encoding {\r
618                         get {\r
619                                 lock (this){\r
620                                         return writer.Encoding;\r
621                                 }\r
622                         }\r
623                 }\r
624 \r
625                 public override IFormatProvider FormatProvider {\r
626                         get {\r
627                                 lock (this){\r
628                                         return writer.FormatProvider;\r
629                                 }\r
630                         }\r
631                 }\r
632 \r
633                 public override string NewLine {\r
634                         get {\r
635                                 lock (this){\r
636                                         return writer.NewLine;\r
637                                 }\r
638                         }\r
639 \r
640                         set {\r
641                                 lock (this){\r
642                                         writer.NewLine = value;\r
643                                 }\r
644                         }\r
645                 }\r
646         }\r
647 }\r
648 \r
649 \r
650 \r
651 \r
652 \r