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