#include "stdafx.h"
#include "../SearchBase.h"
#include "../ExtractBase.h"
#include "../Ogg.h"
#include "OggSearch.h"

COggSearch::COggSearch()
{
	//InitHed("\x4F\x67\x67\x53\x00\x02", 6);
}

void COggSearch::OnInit(SOption* pOption)
{
	if (pOption->bHighSearchOgg == TRUE)
		InitHed("\x4F\x67\x67\x53\x00\x02", 6);
	else
		InitHed("\x4F\x67\x67\x53", 4);
}

void COggSearch::Mount(CArcFile* pclArc)
{
	COgg ogg;
	ogg.Init(pclArc);

	SFileInfo infFile;

	// 開始アドレス取得
	infFile.start = pclArc->GetArcPointer();

	// 最初のヘッダ読み込み時のシリアルナンバー記憶
	DWORD SerialNo;
	pclArc->Seek(14, FILE_CURRENT);
	pclArc->Read(&SerialNo, 4);

	pclArc->Seek(infFile.start, FILE_BEGIN);
	DWORD ReadCount = 0;
	infFile.sizeOrg = 0;

	while (1) {
		ReadCount++;

		// OGGヘッダ読み込み
		DWORD PageSize = ogg.ReadHed();
		VH vheader = ogg.GetHed();

		// シリアルナンバーが異なったら終了
		if (vheader.serialno != SerialNo) {
			ogg.BackHed();
			break;
		}
		// OggSじゃなくなったら終了
		if (memcmp(vheader.pattern, GetHed(), 4) != 0) {
			ogg.BackHed();
			break;
		}
		// 次のOGGの先頭ヘッダまできたら終了
		if ((ReadCount > 1) && (memcmp(vheader.pattern, GetHed(), 4) == 0) && (vheader.type == 2)) {
			ogg.BackHed();
			break;
		}
		// ファイルの終端まできたら終了
		if (PageSize == 0)
			break;

		// ファイルサイズに加算
		infFile.sizeOrg += PageSize;

		// 次のOggSまで進める
		ogg.NextPage();

		pclArc->GetProg()->UpdatePercent(PageSize);
	}

	if (infFile.sizeOrg == 0)
		return;

	infFile.sizeCmp = infFile.sizeOrg;
	// 終了アドレス取得
	infFile.end = infFile.start + infFile.sizeOrg;

	pclArc->AddFileInfo(infFile, GetCtFile(), _T(".ogg"));
}