/*-----------------------------------------------------------------------------
[名称]	AAHanger.cpp
[概要]	AA情報クラスの実装
[備考]	なし
[履歴]	2003-03-17	NC		新規作成(moralog)
-----------------------------------------------------------------------------*/


//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "hebope.h"
#include "AAHanger.h"

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


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CAAHanger::CAAHanger()
{

}


/*-----------------------------------------------------------------------------
[名称]	デストラクタ
[機能]	インスタンスの破棄。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CAAHanger::~CAAHanger()
{

}


/*-----------------------------------------------------------------------------
[名称]	ギコペデータの読み込み
[機能]	位置情報の構築。
[戻値]	なし
[備考]	メモリ使用量削減のため、AA自体を保持しない。
		AAの存在するファイルポインタを記録する。
-----------------------------------------------------------------------------*/
BOOL	CAAHanger::Load( CArchive& File )
{
	m_strFileName = File.GetFile()->GetFileTitle();
	m_strFilePathName = File.GetFile()->GetFilePath();

	long				idxLine = 0;
	CList<long, long>	listLinez;
	CStringList			listNamez;
	BOOL				bLineExist = TRUE;
	DWORD				dwFilePosition = 0;
	while( bLineExist )
	{
		CString		strLine;
		bLineExist = File.ReadString( strLine );
		if ( bLineExist )
		{
			if ( 0 == memcmp((LPCTSTR)f_strStart,  (LPCTSTR)strLine, f_strStart.GetLength() ) )
			{
				// 始端を発見した
				// AAを発見したので位置を登録する
				DWORD	dw = File.GetFile()->GetPosition();
				listLinez.AddTail( dwFilePosition );

				// AA名称取得
				CString		strAAName;
				{
					long	idxBracket = strLine.ReverseFind( f_charBracket );
					strAAName = strLine.Mid(
						f_strStart.GetLength(),
						idxBracket - f_strStart.GetLength()
					);
				}
				listNamez.AddTail( strAAName );

				// please! まじめにやるなら終端を探す必要があるが、まいいだろ
			}
			dwFilePosition += strLine.GetLength()+strlen(f_strCRLF);	// 改行を伴う行のバイト数
			idxLine++;
		}
	}

	// リストに受けたデータを属性の配列へ格納しなおす
	m_aLinez.RemoveAll();
	m_aLinez.SetSize( listLinez.GetCount() );
	m_astrNamez.RemoveAll();
	m_astrNamez.SetSize( listNamez.GetCount() );
	POSITION posLine = listLinez.GetHeadPosition();
	POSITION posAA = listNamez.GetHeadPosition();
	long	idxAA = 0;
	while( posLine != NULL )
	{
		m_aLinez.SetAt( idxAA, listLinez.GetNext( posLine ) );
		m_astrNamez.SetAt( idxAA, listNamez.GetNext( posAA ) );
		idxAA++;
	}

	return( TRUE );
}


/*-----------------------------------------------------------------------------
[名称]	AA名称取得
[機能]	AA名称の取得。
[戻値]	CString		AA名称 [-] (-)
[備考]	Load() が行われた後であること。
-----------------------------------------------------------------------------*/
CString	CAAHanger::GetName( long idxAA )
{
	if ( idxAA >= 0 )
	if ( idxAA < m_aLinez.GetSize() )
	{
		return( m_astrNamez[idxAA] );
	}

	// 引数が異常
	ASSERT( FALSE );
	return(_T(""));
}


// AA位置取得
long	CAAHanger::GetIndex( long idxAA )
{
	if ( idxAA >= 0 )
	if ( idxAA < m_aLinez.GetSize() )
	{
		return( m_aLinez[idxAA] );
	}

	// 引数が異常
	ASSERT( FALSE );
	return( -1 );
}

/*-----------------------------------------------------------------------------
[名称]	AA取得
[機能]	ファイルからAAを読んでくる。
[戻値]	CString		AA [-] (-)
[備考]	Load() が行われた後であること。
-----------------------------------------------------------------------------*/
CString	CAAHanger::GetAA( long idxAA )
{
	if ( idxAA >= 0 )
	if ( idxAA < m_aLinez.GetSize() )
	{
		CStdioFile	File( m_strFilePathName, CFile::modeRead );

		// AAの開始行まで飛ばす
		CString		strLine;
		File.Seek( m_aLinez[idxAA], CFile::begin );
		// 名称行読み飛ばし
		File.ReadString( strLine );

		// AAを読み込む
		CString		strAA;
		while( TRUE )
		{
			BOOL	bExist = File.ReadString( strLine );
			if ( !bExist )
			{
				break;
			}
			if( strLine == f_strEnd )
			{
				break;
			}
			strAA += strLine + f_strCRLF;
		}

		// AA部分の取り出し
		return( strAA );
	}

	// 引数が異常
//	ASSERT( FALSE );
	return(_T(""));
}

long	CAAHanger::AddAA(
	const CString&	strName,
	const long&		posLine
)
{
	m_aLinez.Add( posLine );
	m_astrNamez.Add( strName );
	return( m_astrNamez.GetSize() - 1);
}
