'Classes/System/IO/StreamReader.ab

'ToDo: コンソールで入力待ちになる問題への対処

Namespace System
Namespace IO

/*
@brief ストリームから読み取りを行うTextReaderの実装。
@date 2008/02/25
@auther Egtra
*/
Class StreamReader
	Inherits TextReader
Public
	/*
	@date 2008/02/25
	@auther Egtra
	*/
	Sub StreamReader(path As String)
		init(New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
	End Sub

	/*
	@date 2008/02/25
	@auther Egtra
	*/
	Sub StreamReader(stream As Stream)
		init(stream)
	End Sub

Public
	/*
	@brief 基になるストリームを取得する
	@date 2008/09/02
	@auther NoWest
	*/
	Function BaseStream () As Stream
		Return s
	End Function

Protected
	/*
	@date 2008/02/25
	@auther Egtra
	*/
	Override Sub Dispose(disposing As Boolean)
		If disposing Then
			If Not ActiveBasic.IsNothing(s) Then
				s.Dispose(True)
			End If
		End If
		s = Nothing
	End Sub

	/*
	@date 2008/12/27
	@auther Egtra
	*/
	Override Function Underflow() As Boolean
		Dim buf = Buffer
		Dim tmp = New Collections.Generic.List<WCHAR>
		Underflow = decoder.Decode(tmp, s)
		'ToDo: 非UNICODEのとき、
		' サロゲートペアや結合文字列 (Combining Character Sequence)の途中でバッファが途切れている場合に対応する
		Dim s = New String(tmp.Data, tmp.Count)
		buf.Append(s)
	End Function
Private

	/*
	@date 2008/02/25
	@auther Egtra
	*/
	Sub init(str As Stream)
		s = str
		decoder = New Text.Detail.WindowsCodePageDecoder(CP_ACP)
	End Sub

	s As Stream
	decoder As Text.Decoder
End Class

End Namespace
End Namespace
