Monoソース学習ノート:Consoleクラス(五)
34758 ワード
CStreamReaderクラス(internal class)
次はmcs/class/corlib/system/CStreamReaderです.cs:
001: //
002: // System.CStreamReader
003: //
004: // Authors:
005: // Dietmar Maurer ([email protected])
006: // Miguel de Icaza ([email protected])
007: // Dick Porter ([email protected])
008: // Sebastien Pouliot <[email protected]>
009: //
010: // (C) Ximian, Inc. http://www.ximian.com
011: // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
012: //
013: // Permission is hereby granted, free of charge, to any person obtaining
014: // a copy of this software and associated documentation files (the
015: // "Software"), to deal in the Software without restriction, including
016: // without limitation the rights to use, copy, modify, merge, publish,
017: // distribute, sublicense, and/or sell copies of the Software, and to
018: // permit persons to whom the Software is furnished to do so, subject to
019: // the following conditions:
020: //
021: // The above copyright notice and this permission notice shall be
022: // included in all copies or substantial portions of the Software.
023: //
024: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
025: // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
026: // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
027: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
028: // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
029: // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
030: // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
031: //
032: #if !NET_2_1
033: using System.Text;
034: using System.Runtime.InteropServices;
035:
036: namespace System.IO {
037: class CStreamReader : StreamReader {
038: TermInfoDriver driver;
039:
040: public CStreamReader(Stream stream, Encoding encoding)
041: : base (stream, encoding)
042: {
043: driver = (TermInfoDriver) ConsoleDriver.driver;
044: }
045:
046: public override int Peek ()
047: {
048: try {
049: return base.Peek ();
050: } catch (IOException) {
051: }
052:
053: return -1;
054: }
055:
056: public override int Read ()
057: {
058: try {
059: ConsoleKeyInfo key = Console.ReadKey ();
060: return key.KeyChar;
061: } catch (IOException) {
062: }
063:
064: return(-1);
065: }
066:
067: public override int Read ([In, Out] char [] dest, int index, int count)
068: {
069: if (dest == null)
070: throw new ArgumentNullException ("dest");
071: if (index < 0)
072: throw new ArgumentOutOfRangeException ("index", "< 0");
073: if (count < 0)
074: throw new ArgumentOutOfRangeException ("count", "< 0");
075: // ordered to avoid possible integer overflow
076: if (index > dest.Length - count)
077: throw new ArgumentException ("index + count > dest.Length");
078:
079: try {
080: return driver.Read (dest, index, count);
081: } catch (IOException) {
082: }
083:
084: return 0;
085: }
086:
087: public override string ReadLine ()
088: {
089: try {
090: return driver.ReadLine ();
091: } catch (IOException) {
092: }
093:
094: return null;
095: }
096:
097: public override string ReadToEnd ()
098: {
099: try {
100: return (base.ReadToEnd ());
101: } catch (IOException) {
102: }
103:
104: return null;
105: }
106: }
107: }
108: #endif
上記のソースプログラムはCStreamReaderクラスを定義しています.このクラスはSystemにある.IOネーミングスペースでは、StreamReaderクラスから継承され、internalであり、このプログラムセット内でのみ使用できます.CStreamReaderという名前はConsole Stream Readerを意味すると思います.
2行目の注記「System.C StreamReader」が間違っている場合は、「System.IO.C StreamReader」に変更してください.また、CStreamReader.csをmcs/class/corlib/systemディレクトリの下に置くのも合理的ではありません.mcs/class/corlib/systemに置くべきです.IOディレクトリの下が正しいです.
38行目には、TermInfoDriverのタイプのプライベートインスタンスフィールドdriverが定義されています.
40行目から44行目の共通コンストラクション関数は、ベースクラスStreamReaderの対応するコンストラクション関数を2つのパラメータで呼び出し、driverフィールドに値を割り当てます.
46行目から54行目、97行目から105行目の2つの共通メソッドは、ベースクラスStreamReaderに対応するダミーメソッドを書き換え、ベースクラスに対応するダミーメソッドを簡単に呼び出し、IOException例外をキャプチャして無視する.
56行目から65行目のRead共通メソッドはベースクラスStreamReaderに対応するダミーメソッドを書き換え,Consoleクラスの共通静的メソッドReadKeyを呼び出すことで目的を達成し,同様にIOException異常をキャプチャし無視する.
67行目から95行目までの2つの共通メソッドは、基本クラスStreamReaderに対応するダミーメソッドを書き換え、プライベートインスタンスフィールドdriverによってTermInfoDriverクラスに対応する共通インスタンスメソッドを呼び出して目的を達成し、IOException例外をキャプチャして無視します.
Console.dllプロジェクトでCStreamReaderクラスはConsole.csで使用されます.
CStreamWriterクラス(internal class)
次はmcs/class/corlib/system/CStreamWriterです.cs:
001: //
002: // System.CStreamWriter
003: //
004: // Authors:
005: // Dietmar Maurer ([email protected])
006: // Paolo Molaro ([email protected])
007: // Dick Porter ([email protected])
008: //
009: // (c) 2006 Novell, Inc. http://www.novell.com
010: //
011:
012: //
013: // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
014: //
015: // Permission is hereby granted, free of charge, to any person obtaining
016: // a copy of this software and associated documentation files (the
017: // "Software"), to deal in the Software without restriction, including
018: // without limitation the rights to use, copy, modify, merge, publish,
019: // distribute, sublicense, and/or sell copies of the Software, and to
020: // permit persons to whom the Software is furnished to do so, subject to
021: // the following conditions:
022: //
023: // The above copyright notice and this permission notice shall be
024: // included in all copies or substantial portions of the Software.
025: //
026: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
027: // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
028: // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
029: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
030: // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
031: // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
032: // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
033: //
034: #if !NET_2_1
035: using System;
036: using System.Text;
037:
038: namespace System.IO {
039: class CStreamWriter : StreamWriter {
040: TermInfoDriver driver;
041:
042: public CStreamWriter (Stream stream, Encoding encoding)
043: : base (stream, encoding)
044: {
045: driver = (TermInfoDriver) ConsoleDriver.driver;
046: }
047:
048: public override void Write (char [] buffer, int index, int count)
049: {
050: if (count <= 0)
051: return;
052:
053: if (!driver.Initialized) {
054: try {
055: base.Write (buffer, index, count);
056: } catch (IOException) {
057: }
058:
059: return;
060: }
061:
062: lock (this) {
063: int last = index + count;
064: int i = index;
065: int n = 0;
066: char c;
067:
068: do {
069: c = buffer [i++];
070:
071: if (driver.IsSpecialKey (c)) {
072: // flush what we have
073: if (n > 0) {
074: try {
075: base.Write (buffer, index, n);
076: } catch (IOException) {
077: }
078:
079: n = 0;
080: }
081:
082: // write the special key
083: driver.WriteSpecialKey (c);
084:
085: index = i;
086: } else {
087: n++;
088: }
089: } while (i < last);
090:
091: if (n > 0) {
092: // write out the remainder of the buffer
093: try {
094: base.Write (buffer, index, n);
095: } catch (IOException) {
096: }
097: }
098: }
099: }
100:
101: public override void Write (char val)
102: {
103: lock (this) {
104: try {
105: if (driver.IsSpecialKey (val))
106: driver.WriteSpecialKey (val);
107: else
108: InternalWriteChar (val);
109: } catch (IOException) {
110: }
111: }
112: }
113:
114: public void WriteKey (ConsoleKeyInfo key)
115: {
116: lock (this) {
117: ConsoleKeyInfo copy = new ConsoleKeyInfo (key);
118: if (driver.IsSpecialKey (copy))
119: driver.WriteSpecialKey (copy);
120: else
121: InternalWriteChar (copy.KeyChar);
122: }
123: }
124:
125: public void InternalWriteString (string val)
126: {
127: try {
128: base.Write (val);
129: } catch (IOException) {
130: }
131: }
132:
133: public void InternalWriteChar (char val)
134: {
135: try {
136: base.Write (val);
137: } catch (IOException) {
138: }
139: }
140:
141: public void InternalWriteChars (char [] buffer, int n)
142: {
143: try {
144: base.Write (buffer, 0, n);
145: } catch (IOException) {
146: }
147: }
148:
149: public override void Write (char [] val)
150: {
151: Write (val, 0, val.Length);
152: }
153:
154: public override void Write (string val)
155: {
156: if (val == null)
157: return;
158:
159: if (driver.Initialized)
160: Write (val.ToCharArray ());
161: else {
162: try {
163: base.Write (val);
164: } catch (IOException){
165:
166: }
167: }
168: }
169: }
170: }
171: #endif
上記のソースプログラムはCStreamWriterクラスを定義しています.このクラスはSystemにある.IOネーミングスペースでは、StreamWriterクラスから継承され、internalであり、このプログラムセット内でのみ使用できます.CStreamWriterという名前はConsole Stream Writerを意味すると思います.
2行目の注記「System.C StreamWriter」が間違っている場合は、「System.IO.C StreamWriter」に変更してください.また、CStreamWriter.csをmcs/class/corlib/systemディレクトリの下に置くのも合理的ではありません.mcs/class/corlib/systemに置くべきです.IOディレクトリの下が正しいです.
40行目には、TermInfoDriverのタイプのプライベートインスタンスフィールドdriverが定義されています.
42行目から46行目の共通コンストラクション関数は、ベースクラスStreamWriterの対応するコンストラクション関数を2つのパラメータで呼び出し、driverフィールドに値を割り当てます.
48行目から99行目のWrite共通メソッドは、ベースクラスStreamWriterに対応するダミーメソッドを書き換えます.プライベートインスタンスフィールドdriverの最後の初期化がチェックされると、ベースクラスに対応するダミーメソッドを呼び出すことでその機能が実現され、IOException例外がキャプチャされ無視されます.そうでない場合は、driverフィールドで書き込む文字配列の特殊文字を特殊に処理します.
101行目から168行目までの7つの共通メソッドも、ベースクラスのメソッドを呼び出すときにIOException例外をキャプチャして無視します.必要に応じてdriverフィールドで特殊文字を特殊処理します.
Console.dllプロジェクトでCStreamWriterクラスはConsole.csとTermInfoDriver.csで使用されます.