2003-11-14 Ben Maurer <bmaurer@users.sourceforge.net>
[mono.git] / mcs / class / corlib / System.IO / TextReader.cs
1 //\r
2 // System.IO.TextReader\r
3 //\r
4 // Authors:\r
5 //   Marcin Szczepanski (marcins@zipworld.com.au)\r
6 //   Miguel de Icaza (miguel@gnome.org)\r
7 //\r
8 \r
9 using System;\r
10 using System.Runtime.InteropServices;\r
11 \r
12 namespace System.IO {\r
13 \r
14         [Serializable]\r
15         public abstract class TextReader : MarshalByRefObject, IDisposable {\r
16                 \r
17                 protected TextReader() { }\r
18                 \r
19                 public static readonly TextReader Null;\r
20                 \r
21                 public virtual void Close()\r
22                 { \r
23                         Dispose(true);\r
24                 }\r
25 \r
26                 void System.IDisposable.Dispose()\r
27                 {\r
28                         Dispose(true);\r
29                 }\r
30 \r
31                 protected virtual void Dispose( bool disposing )\r
32                 {\r
33                         return;\r
34                 }\r
35                 \r
36                 public virtual int Peek()\r
37                 {\r
38                         return -1;\r
39                 }\r
40                 \r
41                 public virtual int Read()\r
42                 {\r
43                         return -1;\r
44                 }\r
45                 \r
46
47                 public virtual int Read ([In, Out] char[] buffer, int index, int count)\r
48                 {\r
49                         int c, i;\r
50                         \r
51                         for (i = 0; i < count; i++) {\r
52                                 if ((c = Read ()) == -1)\r
53                                         return i;\r
54                                 buffer [index + i] = (char)c;\r
55                         }\r
56                         \r
57                         return i;\r
58                 }\r
59                 \r
60                 public virtual int ReadBlock ([In, Out] char [] buffer, int index, int count)\r
61                 {\r
62                         int total_read_count = 0;\r
63                         int current_read_count = 0;\r
64 \r
65                         do {\r
66                                 current_read_count = Read (buffer, index, count);\r
67                                 index += current_read_count;\r
68                                 total_read_count += current_read_count;\r
69                                 count -= current_read_count;\r
70                         } while (current_read_count != 0 && count > 0);\r
71 \r
72                         return total_read_count;\r
73                 }\r
74 \r
75                 public virtual string ReadLine()\r
76                 { \r
77                         return String.Empty;\r
78                 }\r
79 \r
80                 public virtual string ReadToEnd()\r
81                 { \r
82                         return String.Empty;\r
83                 }\r
84 \r
85                 public static TextReader Synchronized (TextReader reader)\r
86                 {\r
87                         if (reader == null)\r
88                                 throw new ArgumentNullException ("reader is null");\r
89                         if (reader is SynchronizedReader)\r
90                                 return reader;\r
91 \r
92                         return new SynchronizedReader (reader);\r
93                 }       \r
94         }\r
95 \r
96         //\r
97         // Synchronized Reader implementation, used internally.\r
98         //\r
99         [Serializable]\r
100         internal class SynchronizedReader : TextReader {\r
101                 TextReader reader;\r
102                 \r
103                 public SynchronizedReader (TextReader reader)\r
104                 {\r
105                         this.reader = reader;\r
106                 }\r
107 \r
108                 public override void Close ()\r
109                 {\r
110                         lock (this){\r
111                                 reader.Close ();\r
112                         }\r
113                 }\r
114 \r
115                 public override int Peek ()\r
116                 {\r
117                         lock (this){\r
118                                 return reader.Peek ();\r
119                         }\r
120                 }\r
121 \r
122                 public override int ReadBlock (char [] buffer, int index, int count)\r
123                 {\r
124                         lock (this){\r
125                                 return reader.ReadBlock (buffer, index, count);\r
126                         }\r
127                 }\r
128 \r
129                 public override string ReadLine ()\r
130                 {\r
131                         lock (this){\r
132                                 return reader.ReadLine ();\r
133                         }\r
134                 }\r
135 \r
136                 public override string ReadToEnd ()\r
137                 {\r
138                         lock (this){\r
139                                 return reader.ReadToEnd ();\r
140                         }\r
141                 }\r
142 #region Read Methods\r
143                 public override int Read ()\r
144                 {\r
145                         lock (this){\r
146                                 return reader.Read ();\r
147                         }\r
148                 }\r
149 \r
150                 public override int Read (char [] buffer, int index, int count)\r
151                 {\r
152                         lock (this){\r
153                                 return reader.Read (buffer, index, count);\r
154                         }\r
155                 }\r
156 #endregion\r
157                 \r
158         }\r
159 }\r