// ★コメント未記入
// FliperDefine.cpp: CFliperDefine クラスのインプリメンテーション
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "shitarabian.h"
#include "FliperDefine.h"
#include "Common.h"
#include "ExeCommon.h"
#include "SettingPath.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// 構築/消滅
//////////////////////////////////////////////////////////////////////

CFliperDefine::CFliperDefine()
{

}

CFliperDefine::~CFliperDefine()
{

}

BOOL CFliperDefine::Write()
{
	try
	{
		CString		strFilename = CSettingPath::GetInstance()->GetFolderPath() + m_strFinename;
		CStdioFile	file( strFilename, CFile::modeCreate | CFile::modeWrite );

		// バージョンの書きだし
		CString		strVersion;
		strVersion.LoadString( IDS_RELEASE_VERSION );
		file.WriteString( strVersion + "\n" );

		// 読み替えフラグ
		file.WriteString( ::BoolToString( m_bEnable ) + "\n" );

		// 読み替えキャラクタ
		int	idxItem;
		for( idxItem=0 ; idxItem<m_atFlipz.GetSize() ; idxItem++ )
		{
			file.WriteString( m_atFlipz[idxItem].strLeft + "\n" );
			file.WriteString( m_atFlipz[idxItem].strRight + "\n" );
		}

		return( TRUE );
	}
	catch( CFileException* e )
	{
		e->Delete();
		ErrorLog( "ファイル出力", "CFliperDefine::Write()" );
		return( FALSE );
	}
}

BOOL CFliperDefine::Read()
{
	CString		strGeneralFilename = CSettingPath::GetInstance()->GetFolderPath() + m_strFinename;

	CFileStatus	status;
	BOOL	bExists = CFile::GetStatus( strGeneralFilename, status );
	if ( !bExists )
	{
		// ファイル自体が無い
		return( FALSE );
	}

	try
	{
		CStdioFile	file( strGeneralFilename, CFile::modeRead | CFile::shareDenyNone );

		BOOL	bSuccess = TRUE;

		// バージョンの読み込み
		CString		strVersion;
		bSuccess = file.ReadString( strVersion );
		if ( !bSuccess )
		{
			return( FALSE );
		}

		// 読み替えフラグ
		CString		str;
		bSuccess = file.ReadString( str );
		m_bEnable = ::StringToBool( str );

		// 読み替えキャラクタ
		m_atFlipz.RemoveAll();
		while( TRUE )
		{
			TFlip	tFlip;
			bSuccess = file.ReadString( tFlip.strLeft );
			bSuccess &= file.ReadString( tFlip.strRight );
			if ( !bSuccess )
			{
				break;
			}
			m_atFlipz.Add( tFlip );
		}

		return( TRUE );
	}
	catch( CFileException* e )
	{
		e->Delete();
		 ErrorLog( "ファイル入力", "CFliperDefine::Read()" );
		return( FALSE );
	}

	return( TRUE );
}


CString	CFliperDefine::Flip( CString& strSrc )
{
	CString	strReverse;

	int		iByteSize = 1;
	int		idxByte = 0;
	for( idxByte=0 ; idxByte<strSrc.GetLength() ; idxByte+=iByteSize )
	{
		strReverse += FlipChar( ((LPCTSTR)strSrc)+idxByte, &iByteSize );
	}
	return( strReverse );
}


CString	CFliperDefine::FlipChar( const char* pstrSrc, int* pByteSize )
{
	CString	strReverse;

	int		iLength = strlen( pstrSrc );

	// 反転定義に含まれるか
	*pByteSize = 0;
	if( m_bEnable )
	for( int idxItem=0 ; idxItem<m_atFlipz.GetSize() ; idxItem++ )
	{
		if ( iLength >= m_atFlipz[idxItem].strLeft.GetLength() )
		if ( 0 == memcmp( pstrSrc, ((LPCTSTR)m_atFlipz[idxItem].strLeft), m_atFlipz[idxItem].strLeft.GetLength() ) )
		{
			strReverse = m_atFlipz[idxItem].strRight;
			*pByteSize = m_atFlipz[idxItem].strLeft.GetLength();
			break;
		}

		if ( iLength >= m_atFlipz[idxItem].strRight.GetLength() )
		if ( 0 == memcmp( pstrSrc, ((LPCTSTR)m_atFlipz[idxItem].strRight), m_atFlipz[idxItem].strRight.GetLength() ) )
		{
			strReverse = m_atFlipz[idxItem].strLeft;
			*pByteSize = m_atFlipz[idxItem].strRight.GetLength();
			break;
		}
	}
	// 反転文字に含まれなければ戻り値を元の文字列から切り出し
	if ( *pByteSize == 0 )
	{
		int	iByteSize;
		// マルチバイト判別
		if ( _istleadbyte( pstrSrc[0] ) != 0 )
		{
			iByteSize = 2;
		}
		else
		{
			iByteSize = 1;
		}

		strReverse = CString( pstrSrc, iByteSize );
		*pByteSize = iByteSize;
	}

	// 読み替えた文字を返す
	return( strReverse );
}