/*=======================================================================================================================
//  )
// 2006.12.12
// Sun / Server / â / shogen

//Include ؾ  Ŭ

#include <WriteLogMng.h>

#include <ActionData.h>
#include <AdminData.h>
#include <ChatData.h>
#include <ExpData.h>
#include <ItemData.h>
#include <MoneyData.h>
#include <SessionData.h>
#include <SkillData.h>
#include <SnapShotData.h>

void PrintBaseData(BaseLogData* pObj);
fpos_t ReadLog( CWriteLogMng& LogMgr, DWORD dwCount );

int main()
{	
	CWriteLogMng LogMgr;    
	
	if(!(LogMgr.Open("SUN_FIELD__Date_20061218.wzl")) )
	{
		//޼ ó
		//-  
		//-α׸޴ Open()Լ ȣ  Close   
		return 0;
	}

	fpos_t Offset;
	
	//10 ŭ   ȯ
	cout << "/*10 */" << endl;
	Offset = ReadLog(LogMgr, 10);

	//ٽ ó µǴ Test	
	cout << "/*ó µǴ Test*/" << endl;
	LogMgr.SetLogFileOffset(0);
	ReadLog(LogMgr, 5);

	//ù°   ķ µǴ Test
	cout << "ó 10   ȯ º " << endl;
	LogMgr.SetLogFileOffset(Offset);
	ReadLog(LogMgr, 25);	
	
	//  ݵ Close ȣ ּ/
	//Open  ʰ Closeȣ  ȯ FALSEԴϴ.
	LogMgr.Close();

	return 0;	
}

//BaseDat ϴ Լ
void PrintBaseData(BaseLogData* pObj)
{
	cout << "BaseWriteTime:\t" << pObj->GetWriteTime() << endl;	
	cout << "BaseID:\t" << pObj->GetAccountID() << endl;
	cout << "BaseName:\t" << pObj->GetCharName() << endl;
	cout << "BaseIP:\t" << pObj->GetUserIP() << endl;
}

//dwCount ŭ   ȯ
fpos_t ReadLog( CWriteLogMng& LogMgr, DWORD dwCount )
{
	DWORD dwCnt = 0;
	//BaseLogData Ŭ θ Ŭ̸  DataŬ  Ŭ 
	BaseLogData* pObj;

	//ȯ NULL϶   鼭 Object ´.
	while( (pObj = LogMgr.Read()) != NULL )
	{
		//īװ    Ÿ ĳ Ͽ 
		//Data Get Method Ͽ   ֽϴ.
		//Test  ҽϴ.		
		dwCnt++;
		switch(pObj->GetCategory())
		{
		case LOG_SESSION:
			cout << "Category:\t" << "LOG_SESSION" << endl;
			PrintBaseData(pObj);
			cout << "LogType:\t" << ((SessionData*)pObj)->GetLogType() << endl;
			cout << "LoginTime:\t" << ((SessionData*)pObj)->GetLoginTime() << endl;
			cout << "UsedTime:\t" << ((SessionData*)pObj)->GetUsedTime() << endl;
			break;
		case LOG_ITEM:
			cout << "Category:\t" << "LOG_ITEM" << endl;
			PrintBaseData(pObj);
			cout << "MapCode:\t" << ((ItemData*)pObj)->GetMapCode() <<endl;
			cout << "MapX:\t" << ((ItemData*)pObj)->GetMapX() << endl;
			cout << "MapY:\t" << ((ItemData*)pObj)->GetMapY() << endl;
			cout << "MapZ:\t" << ((ItemData*)pObj)->GetMapZ() << endl;
			cout << "AccountID:\t" << ((ItemData*)pObj)->GetToAccountID() << endl;
			cout << "Name:\t" << ((ItemData*)pObj)->GetToCharName() << endl;
			cout << "ItemSerial:\t" << ((ItemData*)pObj)->GetItemSerial() << endl;
			cout << "ItemCode:\t" << ((ItemData*)pObj)->GetItemCode() << endl;
			cout << "ItemNum:\t" << (int)((ItemData*)pObj)->GetItemNum() << endl;
			cout << "ItemVersion:\t" << ((ItemData*)pObj)->GetItemStreamVersion() << endl;
			break;
		case LOG_EXP:
			cout << "Category:\t" << "LOG_EXP" << endl;
			PrintBaseData(pObj);
			cout << "NewLevel:\t" << ((ExpData*)pObj)->GetNewLevel() <<endl;
			cout << "OldLevel:\t" << ((ExpData*)pObj)->GetOldLevel() <<endl;
			cout << "NewExp:\t" << ((ExpData*)pObj)->GetNewExp() <<endl;
			cout << "OldExp:\t" << ((ExpData*)pObj)->GetOldExp() <<endl;
			cout << "DivideCount:\t" << ((ExpData*)pObj)->GetDivideCount() <<endl;			
			break;
		case LOG_ACTION:
			cout << "Category:\t" << "LOG_ACTION" << endl;
			PrintBaseData(pObj);
			cout << "MapCode:\t" << ((ActionData*)pObj)->GetMapCode() << endl;
			cout << "MapX:\t" << ((ActionData*)pObj)->GetMapX() << endl;
			cout << "MapY:\t" << ((ActionData*)pObj)->GetMapY() << endl;
			cout << "MapZ:\t" << ((ActionData*)pObj)->GetMapZ() << endl;
			break;
		case LOG_SKILL:
			cout << "Category:\t" << "LOG_SKILL" << endl;
			PrintBaseData(pObj);
			cout << "SkillLevel:\t" << ((SkillData*)pObj)->GetSkillLevel() << endl;
			cout << "SkillUseCnt:\t" << ((SkillData*)pObj)->GetSkillUseCnt() << endl;
			break;
		case LOG_SNAPSHOT:
			switch(pObj->GetLogType())
			{			
				case SNAPSHOT_REGULAR:
					cout << "Category:\t" << "LOG_SNAPSHOT" << endl;
					PrintBaseData(pObj);
					cout << "ItemBinaryVersion:\t" << ((SnapShotData*)pObj)->GetItemBinaryVersion() << endl;
					cout << "BasePlayerInfoVersion:\t" << ((SnapShotData*)pObj)->GetBasePlayerInfoBinaryVersion() << endl;					
					break;
				case SNAPSHOT_WAREHOUSE_OEPN:
				case SNAPSHOT_WAREHOUSE_CLOSE:
					cout << "Category:\t" << "LOG_SNAPSHOT" << endl;
					PrintBaseData(pObj);
					cout << "ItemBinaryVersion:\t" << ((WareHouseData*)pObj)->GetItemBinaryVersion() << endl;					
					break;
			}
			break;
		case LOG_CHAT:
			cout << "Category:\t" << "LOG_CHAT" << endl;
			PrintBaseData(pObj);
			cout << "Channel:\t" << ((ChatData*)pObj)->GetChannel() << endl;
			cout << "UserGuid:\t" << ((ChatData*)pObj)->GetUserGuid() << endl;
			cout << "ListenUserGuid:\t" << ((ChatData*)pObj)->GetListenUserGuid() << endl;
			cout << "ListenName:\t" << ((ChatData*)pObj)->GetListenCharName() << endl;
			cout << "Context:\t" << ((ChatData*)pObj)->GetContext() << endl;
			cout << "MapCode:\t" << ((ChatData*)pObj)->GetMapCode() << endl;
			cout << "RoonNo:\t" << ((ChatData*)pObj)->GetRoomNo() << endl;
			break;
		case LOG_EVENT:		
			break;
		case LOG_ADMIN:
			cout << "Category:\t" << "LOG_ADMIN" << endl;
			PrintBaseData(pObj);
			cout << "MapCode:\t" << ((AdminData*)pObj)->GetMapCode() << endl;
			cout << "MapX:\t" << ((AdminData*)pObj)->GetMapX() << endl;
			cout << "MapY:\t" << ((AdminData*)pObj)->GetMapY() << endl;
			cout << "MapZ:\t" << ((AdminData*)pObj)->GetMapZ() << endl;			
			cout << "CharName:\t" << ((AdminData*)pObj)->GetToCharName() << endl;
			break;
		case LOG_MONEY:
			cout << "Category:\t" << "LOG_MONEY" << endl;
			PrintBaseData(pObj);
			cout << "MapCode:\t" << ((MoneyData*)pObj)->GetMapCode() << endl;
			cout << "MapX:\t" << ((MoneyData*)pObj)->GetMapX() << endl;
			cout << "MapY:\t" << ((MoneyData*)pObj)->GetMapY() << endl;
			cout << "MapZ:\t" << ((MoneyData*)pObj)->GetMapZ() << endl;
			cout << "ToAccountID:\t" << ((MoneyData*)pObj)->GetToAccoundID() << endl;
			cout << "ToCharName:\t" << ((MoneyData*)pObj)->GetToCharName() << endl;
			cout << "Money:\t" << ((MoneyData*)pObj)->GetMoney() << endl;
			cout << "ToMoney:\t" << ((MoneyData*)pObj)->GetToMoney() << endl;
			cout << "RoomKey:\t" << ((MoneyData*)pObj)->GetRoomKey() << endl;
			break;
		default:		
			return NULL;		
		}
		cout << "/////////////////////////////////////////////////////////////////////////" << endl;
		//getch();
		if(dwCnt == dwCount)
			return LogMgr.GetLogFileOffset();
	}

	return 0;
}

/*//߰ 
//06 12 14 - ﾾ û â ߰

// ޼ҵ  Open() Ŀ Ͽ Ѵ.
//׷  
// - SetLogFileOffset() FALSE ȯ
// - GetLogFileOffset()  ó Ű 0 ȯ
BOOL	SetLogFileOffset(fpos_t Pos);
fpos_t	GetLogFileOffset();

//06 12 18

//  - SnapShot α    ߰( BASE_PLAYERINFO, INVENTORY  )
DWORD m_ItemBinaryVersion;				- GetItemBinaryVersion();
DWORD m_BasePlayerInfoBinaryVersion;	- GetBasePlayerInfoBinaryVersion();
//  - ItemData α    ߰( ItemStream )
DWORD m_ItemStreamVersion;				- GetItemStreamVersion();