////////////////////////////////////////////////////////////////////////////
// CFileReader クラスのインプリメンテーション
//
////////////////////////////////////////////////////////////////////////////

#include "FileReader.h"
#include "TaEditShell.h"

////////////////////////////////////////////////////////////////////////////
// 構築/破棄
////////////////////////////////////////////////////////////////////////////

CFileReader::CFileReader() :
	pData( NULL ),
	EnableExitFlg( false ),
	IsModifiedFlg( false ),
	InterruptFlg( false ),
	ErrorInfo(),
	CProcesingObj()
{

}

CFileReader::~CFileReader()
{

}

////////////////////////////////////////////////////////////////////////////
// メソッド
////////////////////////////////////////////////////////////////////////////

// 情報を設定
void CFileReader::SetInfo( const string &argFileName, T_LineData *argData )
{
	FileName = argFileName;
	pData = argData;
	EnableExitFlg = false;
	IsModifiedFlg = false;
	InterruptFlg = false;
}

// 読み込み用スレッドのエントリポイント
void CFileReader::run()
{
	wchar_t wc[ TA_MAX_LINE_SIZE + 1 ];
	VClsPtr< CConfigInfo > pConf = m_TaEditShell->GetConfigInfo();
	bool NewLineFlg; // 最後に読み込んだ行に改行コードが含まれていたか否かを保持する

	EnableExitFlg = false;
	IsModifiedFlg = false;
	InterruptFlg = false;
	ErrorInfo = true;

	// ファイルのオープン
	FILE *infile = fopen( FileName.c_str(), "r" );
	if ( NULL == infile ) {
		ErrorInfo = CErrorBool( pConf->RefFaultFileOpenMsg() );
		EnableExitFlg = true;
		return ;
	}

	pData->clear();	// データをクリアする
	IsModifiedFlg = true;
	NewLineFlg = false;
	while ( !feof( infile ) && !ferror( infile ) && !InterruptFlg ) {

		// 一行読み込む
		if ( !fgetws( wc, TA_MAX_LINE_SIZE + 1, infile ) ) break;

		size_t wc_len = wslen( wc );	// 文字列長を求める

		// 読み込んだ行の末尾に改行コードがついているか否か
		if ( L'\n' == wc[ wc_len - 1 ] ) {
			wc[ wc_len - 1 ] = L'\0';	// 改行コードがついていたら除去する
			NewLineFlg = true;		// フラグを設定する
			wc_len--;
		}
		else
			NewLineFlg = false;

		// 行の長さの確認
		if ( wc_len >= TA_MAX_LINE_SIZE ) {
			ErrorInfo = CErrorBool( pConf->RefBrokenLineMsg() );
			break;
		}

		// リストに行を追加
		pData->push_back( wc );
	}
	if ( ferror( infile ) )
		ErrorInfo = CErrorBool( pConf->RefIOErrorMsg( errno ) );

	fclose( infile );

	// 最後に読み込んだ行に改行コードが含まれていた場合、
	// もしくは一行も読み込んでいない場合には
	// 空の行を一つ付け加える必要がある
	if ( NewLineFlg || pData->size() == 0 ) pData->push_back( L"" );

	EnableExitFlg = true;
}

// 終了可能か否か
bool CFileReader::EnableExit() const
{
	return EnableExitFlg;
}

// 割り込み
void CFileReader::Interrupt()
{
	InterruptFlg = true;
}

// エラー情報を取得
CErrorBool CFileReader::GetErrorInfo() const
{
	return ErrorInfo;
}

// 変更したか否かを取得
bool CFileReader::IsModified() const
{
	return IsModifiedFlg;
}

