08faa24ae143f3f1637888127623e9ad051f9157
[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");\r
164                         if (count < 0 || (index + count) > buffer.Length)\r
165                                 throw new ArgumentOutOfRangeException ("count");\r
166                         for (; count > 0; --count, ++index) {\r
167                                 Write (buffer [index]);\r
168                         }\r
169                 }\r
170                 \r
171                 public virtual void Write (string format, object arg0, object arg1)\r
172                 {\r
173                         Write (String.Format (format, arg0, arg1));\r
174                 }\r
175                 \r
176                 public virtual void Write (string format, object arg0, object arg1, object arg2 )\r
177                 {\r
178                         Write (String.Format (format, arg0, arg1, arg2));\r
179                 }\r
180                 \r
181                 public virtual void WriteLine ()\r
182                 {\r
183                         Write (NewLine);\r
184                 }\r
185                 \r
186                 public virtual void WriteLine (bool value)\r
187                 {\r
188                         Write (value);\r
189                         WriteLine();\r
190                 }\r
191                 \r
192                 public virtual void WriteLine (char value)\r
193                 {\r
194                         Write (value);\r
195                         WriteLine();\r
196                 }\r
197                 \r
198                 public virtual void WriteLine (char[] value)\r
199                 {\r
200                         Write (value);\r
201                         WriteLine();\r
202                 }\r
203                 \r
204                 public virtual void WriteLine (decimal value)\r
205                 {\r
206                         Write (value);\r
207                         WriteLine();\r
208                 }\r
209                 \r
210                 public virtual void WriteLine (double value)\r
211                 {\r
212                         Write (value);\r
213                         WriteLine();\r
214                 }\r
215                 \r
216                 public virtual void WriteLine (int value)\r
217                 {\r
218                         Write (value);\r
219                         WriteLine();\r
220                 }\r
221                 \r
222                 public virtual void WriteLine (long value)\r
223                 {\r
224                         Write (value);\r
225                         WriteLine();\r
226                 }\r
227                 \r
228                 public virtual void WriteLine (object value)\r
229                 {\r
230                         Write (value);\r
231                         WriteLine();\r
232                 }\r
233                 \r
234                 public virtual void WriteLine (float value)\r
235                 {\r
236                         Write (value);\r
237                         WriteLine();\r
238                 }\r
239                 \r
240                 public virtual void WriteLine (string value)\r
241                 {\r
242                         Write (value);\r
243                         WriteLine();\r
244                 }\r
245                 \r
246                 [CLSCompliant(false)]\r
247                 public virtual void WriteLine (uint value)\r
248                 {\r
249                         Write (value);\r
250                         WriteLine();\r
251                 }\r
252                 \r
253                 [CLSCompliant(false)]\r
254                 public virtual void WriteLine (ulong value)\r
255                 {\r
256                         Write (value);\r
257                         WriteLine();\r
258                 }\r
259                 \r
260                 public virtual void WriteLine (string format, object arg0)\r
261                 {\r
262                         Write (format, arg0);\r
263                         WriteLine();\r
264                 }\r
265                 \r
266                 public virtual void WriteLine (string format, params object[] arg)\r
267                 {\r
268                         Write (format, arg);\r
269                         WriteLine();\r
270                 }\r
271                 \r
272                 public virtual void WriteLine (char[] buffer, int index, int count)\r
273                 {\r
274                         Write (buffer, index, count);\r
275                         WriteLine();\r
276                 }\r
277                 \r
278                 public virtual void WriteLine (string format, object arg0, object arg1)\r
279                 {\r
280                         Write (format, arg0, arg1);\r
281                         WriteLine();\r
282                 }\r
283                 \r
284                 public virtual void WriteLine (string format, object arg0, object arg1, object arg2)\r
285                 {\r
286                         Write (format, arg0, arg1, arg2);\r
287                         WriteLine();\r
288                 }\r
289 \r
290                 //\r
291                 // Null version of the TextWriter, for the `Null' instance variable\r
292                 //\r
293                 sealed class NullTextWriter : TextWriter {\r
294                         public override Encoding Encoding {\r
295                                 get {\r
296                                         return Encoding.Default;\r
297                                 }\r
298                         }\r
299                         \r
300                         public override void Write (string s)\r
301                         {\r
302                         }\r
303                         public override void Write (char value)\r
304                         {\r
305                         }\r
306                         public override void Write (char[] value, int index, int count)\r
307                         {\r
308                         }\r
309                 }\r
310         }\r
311 \r
312         //\r
313         // Sychronized version of the TextWriter.\r
314         //\r
315         [Serializable]\r
316         internal class SynchronizedWriter : TextWriter {\r
317                 private TextWriter writer;\r
318                 private bool neverClose;\r
319 \r
320                 public SynchronizedWriter (TextWriter writer)\r
321                         : this (writer, false)\r
322                 {\r
323                 }\r
324 \r
325                 public SynchronizedWriter (TextWriter writer, bool neverClose)\r
326                 {\r
327                         this.writer = writer;\r
328                         this.neverClose = neverClose;\r
329                 }\r
330 \r
331                 public override void Close ()\r
332                 {\r
333                         if (neverClose)\r
334                                 return;\r
335                         lock (this){\r
336                                 writer.Close ();\r
337                         }\r
338                 }\r
339 \r
340                 public override void Flush ()\r
341                 {\r
342                         lock (this){\r
343                                 writer.Flush ();\r
344                         }\r
345                 }\r
346 \r
347 #region Write methods\r
348                 public override void Write (bool value)\r
349                 {\r
350                         lock (this){\r
351                                 writer.Write (value);\r
352                         }\r
353                 }\r
354                 \r
355                 public override void Write (char value)\r
356                 {\r
357                         lock (this){\r
358                                 writer.Write (value);\r
359                         }\r
360                 }\r
361 \r
362                 public override void Write (char [] value)\r
363                 {\r
364                         lock (this){\r
365                                 writer.Write (value);\r
366                         }\r
367                 }\r
368 \r
369                 public override void Write (Decimal value)\r
370                 {\r
371                         lock (this){\r
372                                 writer.Write (value);\r
373                         }\r
374                 }\r
375 \r
376                 public override void Write (int value)\r
377                 {\r
378                         lock (this){\r
379                                 writer.Write (value);\r
380                         }\r
381                 }\r
382 \r
383                 public override void Write (long value)\r
384                 {\r
385                         lock (this){\r
386                                 writer.Write (value);\r
387                         }\r
388                 }\r
389                 \r
390                 public override void Write (object value)\r
391                 {\r
392                         lock (this){\r
393                                 writer.Write (value);\r
394                         }\r
395                 }\r
396 \r
397                 public override void Write (float value)\r
398                 {\r
399                         lock (this){\r
400                                 writer.Write (value);\r
401                         }\r
402                 }\r
403                 \r
404                 public override void Write (string value)\r
405                 {\r
406                         lock (this){\r
407                                 writer.Write (value);\r
408                         }\r
409                 }\r
410                 \r
411                 [CLSCompliant(false)]\r
412                 public override void Write (uint value)\r
413                 {\r
414                         lock (this){\r
415                                 writer.Write (value);\r
416                         }\r
417                 }\r
418                 \r
419                 [CLSCompliant(false)]\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                 [CLSCompliant(false)]\r
541                 public override void WriteLine (uint value)\r
542                 {\r
543                         lock (this){\r
544                                 writer.WriteLine (value);\r
545                         }\r
546                 }\r
547 \r
548                 [CLSCompliant(false)]\r
549                 public override void WriteLine (ulong value)\r
550                 {\r
551                         lock (this){\r
552                                 writer.WriteLine (value);\r
553                         }\r
554                 }\r
555 \r
556                 public override void WriteLine (string format, object value)\r
557                 {\r
558                         lock (this){\r
559                                 writer.WriteLine (format, value);\r
560                         }\r
561                 }\r
562 \r
563                 public override void WriteLine (string format, object [] value)\r
564                 {\r
565                         lock (this){\r
566                                 writer.WriteLine (format, value);\r
567                         }\r
568                 }\r
569 \r
570                 public override void WriteLine (char [] buffer, int index, int count)\r
571                 {\r
572                         lock (this){\r
573                                 writer.WriteLine (buffer, index, count);\r
574                         }\r
575                 }\r
576                 \r
577                 public override void WriteLine (string format, object arg0, object arg1)\r
578                 {\r
579                         lock (this){\r
580                                 writer.WriteLine (format, arg0, arg1);\r
581                         }\r
582                 }\r
583 \r
584                 public override void WriteLine (string format, object arg0, object arg1, object arg2)\r
585                 {\r
586                         lock (this){\r
587                                 writer.WriteLine (format, arg0, arg1, arg2);\r
588                         }\r
589                 }\r
590 #endregion\r
591                 \r
592                 public override Encoding Encoding {\r
593                         get {\r
594                                 lock (this){\r
595                                         return writer.Encoding;\r
596                                 }\r
597                         }\r
598                 }\r
599 \r
600                 public override IFormatProvider FormatProvider {\r
601                         get {\r
602                                 lock (this){\r
603                                         return writer.FormatProvider;\r
604                                 }\r
605                         }\r
606                 }\r
607 \r
608                 public override string NewLine {\r
609                         get {\r
610                                 lock (this){\r
611                                         return writer.NewLine;\r
612                                 }\r
613                         }\r
614 \r
615                         set {\r
616                                 lock (this){\r
617                                         writer.NewLine = value;\r
618                                 }\r
619                         }\r
620                 }\r
621         }\r
622 }\r
623 \r
624 \r
625 \r
626 \r
627 \r