Files
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

770 lines
21 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include <Pattern/Singleton.h>
#include <Utility/Math/Math.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Creature/CreatureManager.h>
#include <Creature/Character/Character.h>
#include <Item/Item.h>
#include <Item/ItemMgr.h>
#include <Item/ItemFactory.h>
#include "ItemContainer.h"
namespace Item
{
class CNullItem : public CItem, public CSingleton<CNullItem>
{
public:
virtual ~CNullItem() { }
private:
CNullItem(const ItemInfo& itemInfo) : CItem(itemInfo) { }
static ItemInfo ms_thisiteminfo;
static CNullItem ms_this;
};
};
Item::ItemInfo Item::CNullItem::ms_thisiteminfo(0xFFFF);
Item::CNullItem Item::CNullItem::ms_this(Item::CNullItem::ms_thisiteminfo);
size_t LogErrorItem(unsigned long dwCID, const char* szDetail, const char* szBuffer)
{
const int MIN_BUFFER = 64;
char szItemUID[MIN_BUFFER];
const Item::ItemData* lpItemData = reinterpret_cast<const Item::ItemData*>(szBuffer);
Math::Convert::Hex64ToStr(szItemUID, lpItemData->m_dwUID);
ERRLOG4(g_Log, "CID:%10u %s. UID:%s, ProtoTypeID:%d",
dwCID, szDetail, szItemUID, lpItemData->m_usProtoTypeID);
return lpItemData->m_cItemSize;
}
// ----------------------------------------------------------------------------------------
// CItemContainer
Item::CItemContainer::CItemContainer()
: m_dwCID(0), m_nMaxSize(0), m_lpNullItem(&CNullItem::GetInstance()),
m_lppItems(NULL), m_usFlags(0)
{
}
Item::CItemContainer::~CItemContainer()
{
Destroy();
}
bool Item::CItemContainer::Initialize(unsigned long dwCID, unsigned short nMaxSize)
{
Destroy();
m_dwCID = dwCID;
m_nMaxSize = nMaxSize;
m_lppItems = new CItem*[m_nMaxSize];
if(NULL != m_lppItems)
{
std::fill_n(m_lppItems, m_nMaxSize, reinterpret_cast<CItem*>(NULL));
return true;
}
return false;
}
void Item::CItemContainer::ClearItems()
{
if(NULL != m_lppItems)
{
CItem** lppItem = m_lppItems;
CItem** lppItemPastEnd = m_lppItems + m_nMaxSize;
// edith 2010.01.23 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// for (; lppItem != lppItemPastEnd; ++lppItem)
for (int i = 0; i < m_nMaxSize; ++i, ++lppItem)
{
CItem* lpItem = *lppItem;
if(NULL != lpItem && m_lpNullItem != lpItem)
{
DELETE_ITEM(lpItem);
}
}
std::fill_n(m_lppItems, m_nMaxSize, reinterpret_cast<CItem*>(NULL));
}
}
void Item::CItemContainer::Destroy()
{
if(NULL != m_lppItems)
{
ClearItems();
delete [] m_lppItems;
m_lppItems = NULL;
}
}
void Item::CItemContainer::DumpItemInfo()
{
const int MIN_BUFFER = 32;
const int MAX_BUFFER = 256;
char szUID[MIN_BUFFER];
char szBuffer[MAX_BUFFER];
CItem** lppItem = m_lppItems;
CItem** lppItemPastEnd = m_lppItems + m_nMaxSize;
// edith 2010.01.23 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// for (; lppItem != lppItemPastEnd; ++lppItem)
for (int i = 0; i < m_nMaxSize; ++i, ++lppItem)
{
const CItem* lpItem = *lppItem;
if(NULL != lpItem && m_lpNullItem != lpItem)
{
Math::Convert::Hex64ToStr(szUID, lpItem->GetUID());
const ItemPos itemPos = lpItem->GetPos();
const DetailData& detailData = lpItem->GetItemInfo().m_DetailData;
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
_snprintf(szBuffer, MAX_BUFFER, "CID:%10u <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>. UID: %s <20><><EFBFBD><EFBFBD>ID : %5d,"
" <20><>ǥ:(%d - %2d,%2d,%2d), ũ<><C5A9>:(%2d, %2d), <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>):%2d",
m_dwCID, szUID, lpItem->GetPrototypeID(), itemPos.m_cIndex, cX, cY, cTab,
detailData.m_cXSize, detailData.m_cXSize, lpItem->GetNumOrDurability());
ERRLOG1(g_Log, "%s", szBuffer);
}
}
}
void Item::CItemContainer::DumpMoneyInfo(unsigned long dwDepositMoney)
{
}
bool Item::CItemContainer::SerializeOut(char* szItemBuffer_Out, unsigned long& dwBufferSize_InOut) const
{
CItem** lppItem = m_lppItems;
CItem** lppItemPastEnd = m_lppItems + m_nMaxSize;
size_t nRemainBufferSize = static_cast<size_t>(dwBufferSize_InOut);
size_t nWritten = 0;
// edith 2010.01.23 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// for (; lppItem != lppItemPastEnd; ++lppItem)
for (int i = 0; i < m_nMaxSize; ++i, ++lppItem)
{
CItem* lpItem = *lppItem;
if(NULL != lpItem && m_lpNullItem != lpItem)
{
size_t nItemSize = nRemainBufferSize;
// 3<><33> <20><EFBFBD><EBB7B1> <20><>ġ (S<>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѽ<EFBFBD> <20><><EFBFBD><EFBFBD>)
lpItem->RevisionLimit();
if(!lpItem->SerializeOut(szItemBuffer_Out + nWritten, nItemSize))
{
ERRLOG3(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SerializeOut<75><74> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20><> ũ<><C5A9>:%d, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9>:%d",
m_dwCID, nWritten, nRemainBufferSize);
return false;
}
nWritten += nItemSize;
nRemainBufferSize -= nItemSize;
}
}
dwBufferSize_InOut = static_cast<unsigned long>(nWritten);
return true;
}
// ----------------------------------------------------------------------------------------
// CArrayContainer
Item::CArrayContainer::CArrayContainer()
{
}
Item::CArrayContainer::~CArrayContainer()
{
}
bool Item::CArrayContainer::Initialize(unsigned long dwCID, unsigned char nXSize, unsigned char nYSize, unsigned char nTabNum)
{
m_dwCID = dwCID;
m_nXSize = nXSize;
m_nYSize = nYSize;
m_nTabNum = nTabNum;
m_nSizePerTab = nXSize * nYSize;
return CItemContainer::Initialize(dwCID, nXSize * nYSize * nTabNum);
}
Item::CItem* Item::CArrayContainer::GetItem(Item::ItemPos itemPos)
{
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
if(m_nXSize <= cX || m_nYSize <= cY || m_nTabNum <= cTab)
{
ERRLOG7(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. X:%d/%d, Y:%d/%d, Tab:%d/%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum);
return NULL;
}
CItem* lpItem = m_lppItems[m_nSizePerTab * cTab + m_nXSize * cY + cX];
return (lpItem != m_lpNullItem) ? lpItem : NULL;
}
bool Item::CArrayContainer::SetItem(Item::ItemPos itemPos, Item::CItem* lpItem)
{
if(NULL == lpItem)
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL<4C>Դϴ<D4B4>.", m_dwCID);
return false;
}
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
unsigned char cXSize = lpItem->GetItemInfo().m_DetailData.m_cXSize;
unsigned char cYSize = lpItem->GetItemInfo().m_DetailData.m_cYSize;
if(m_nXSize < static_cast<size_t>(cX + cXSize) ||
m_nYSize < static_cast<size_t>(cY + cYSize) || m_nTabNum <= cTab)
{
ERRLOG9(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><> ũ<><20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. "
"X:%d/%d, Y:%d/%d, Tab:%d/%d, Xũ<58><C5A9>:%d, Yũ<59><C5A9>:%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum, cXSize, cYSize);
return false;
}
CItem** lppItemYIndexPastEnd = m_lppItems + m_nSizePerTab * cTab + m_nXSize * (cY + cYSize);
CItem **lppItemYIndex, **lppItemXIndex, **lppItemXIndexPastEnd;
for (lppItemYIndex = m_lppItems + m_nSizePerTab * cTab + cY * m_nXSize;
lppItemYIndex != lppItemYIndexPastEnd; lppItemYIndex += m_nXSize)
{
lppItemXIndexPastEnd = lppItemYIndex + cX + cXSize;
for (lppItemXIndex = lppItemYIndex + cX;
lppItemXIndex != lppItemXIndexPastEnd; ++lppItemXIndex)
{
if(0 != *lppItemXIndex)
{
ERRLOG4(g_Log, "CID:%10u (%d,%d,%d) <20>̹<EFBFBD> <20><> <20><><EFBFBD>ҿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.",
m_dwCID, cX, cY, cTab);
return false;
}
}
}
for (lppItemYIndex = m_lppItems + m_nSizePerTab * cTab + cY * m_nXSize;
lppItemYIndex != lppItemYIndexPastEnd; lppItemYIndex += m_nXSize)
{
lppItemXIndexPastEnd = lppItemYIndex + cX + cXSize;
for (lppItemXIndex = lppItemYIndex + cX;
lppItemXIndex != lppItemXIndexPastEnd; ++lppItemXIndex)
{
*lppItemXIndex = m_lpNullItem;
}
}
m_lppItems[m_nSizePerTab * cTab + m_nXSize * cY + cX] = lpItem;
lpItem->MoveItem(itemPos);
return true;
}
bool Item::CArrayContainer::RemoveItem(Item::ItemPos itemPos)
{
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
if(m_nXSize <= cX || m_nYSize <= cY || m_nTabNum <= cTab)
{
ERRLOG7(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><> ũ<><20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. X:%d/%d, Y:%d/%d, Tab:%d/%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum);
return false;
}
CItem* lpItem = m_lppItems[m_nSizePerTab * cTab + m_nXSize * cY + cX];
if(NULL == lpItem || m_lpNullItem == lpItem)
{
ERRLOG4(g_Log, "CID:%10u <20><> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. X:%d, Y:%d, Tab:%d", m_dwCID, cX, cY, cTab);
return false;
}
unsigned char cXSize = lpItem->GetItemInfo().m_DetailData.m_cXSize;
unsigned char cYSize = lpItem->GetItemInfo().m_DetailData.m_cYSize;
if(m_nXSize < static_cast<size_t>(cX + cXSize) ||
m_nYSize < static_cast<size_t>(cY + cYSize))
{
ERRLOG9(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><> ũ<><20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. "
"X:%d/%d, Y:%d/%d, Tab:%d/%d, Xũ<58><C5A9>:%d, Yũ<59><C5A9>:%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum, cXSize, cYSize);
return false;
}
CItem** lppItemYIndexPastEnd = m_lppItems + m_nSizePerTab * cTab + m_nXSize * (cY + cYSize);
CItem **lppItemYIndex, **lppItemXIndex, **lppItemXIndexPastEnd;
for (lppItemYIndex = m_lppItems + m_nSizePerTab * cTab + cY * m_nXSize;
lppItemYIndex != lppItemYIndexPastEnd; lppItemYIndex += m_nXSize)
{
lppItemXIndexPastEnd = lppItemYIndex + cX + cXSize;
for (lppItemXIndex = lppItemYIndex + cX;
lppItemXIndex != lppItemXIndexPastEnd; ++lppItemXIndex)
{
*lppItemXIndex = NULL;
}
}
return true;
}
unsigned short Item::CArrayContainer::GetItemNum(unsigned short usProtoTypeID)
{
unsigned short wCount = 0;
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
const CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
if (NULL == lpItem) { continue; }
if (usProtoTypeID == lpItem->GetPrototypeID())
{
wCount += (lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1;
}
}
}
}
return wCount;
}
bool Item::CArrayContainer::DisappearItem(unsigned short wItemID, unsigned short wItemNum,
vector<Item::ItemGarbage>& vecItemGarbage)
{
unsigned short tempItemNum = GetItemNum(wItemID);
if (wItemNum > tempItemNum)
{
DETLOG3(g_Log, "DisappearItem = <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. ItemID:%d, ItemNum:%d/%d", wItemID, tempItemNum, wItemNum);
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> short <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ
short itemNum = static_cast<short>(wItemNum);
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
if (NULL == lpItem) { continue; }
if (wItemID == lpItem->GetPrototypeID())
{
itemNum -= (lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1;
if (0 < itemNum)
{
vecItemGarbage.push_back(ItemGarbage(lpItem, 0));
}
else if (0 == itemNum)
{
vecItemGarbage.push_back(ItemGarbage(lpItem, 0));
return true;
}
else if (0 > itemNum)
{
unsigned char cRemainNum = static_cast<unsigned char>( -itemNum );
vecItemGarbage.push_back(ItemGarbage(lpItem, cRemainNum));
return true;
}
}
}
}
}
return false;
}
bool Item::CArrayContainer::DisappearItem(unsigned short wItemID, unsigned short wItemNum)
{
if (wItemNum > GetItemNum(wItemID))
{
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> short <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ
short itemNum = static_cast<short>(wItemNum);
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
if (NULL == lpItem) { continue; }
if (wItemID == lpItem->GetPrototypeID())
{
itemNum -= (lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1;
CCharacter* lpOwner = CCreatureManager::GetInstance().GetCharacter(m_dwCID);
if (NULL == lpOwner) { return false; }
CGameClientDispatch* lpDispatch = lpOwner->GetDispatcher();
if (0 < itemNum)
{
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharDisappearItem(lpDispatch->GetSendStream(),
m_dwCID, lpItem->GetPos(), 0, PktDisappearItem::DIC_LINKED_QUEST, PktBase::NO_SERVER_ERR);
}
RemoveItem(lpItem->GetPos());
DELETE_ITEM(lpItem);
}
else if (0 == itemNum)
{
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharDisappearItem(lpDispatch->GetSendStream(),
m_dwCID, lpItem->GetPos(), 0, PktDisappearItem::DIC_LINKED_QUEST, PktBase::NO_SERVER_ERR);
}
RemoveItem(lpItem->GetPos());
DELETE_ITEM(lpItem);
return true;
}
else if (0 > itemNum)
{
unsigned char cRemainNum = static_cast<unsigned char>( -itemNum );
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharDisappearItem(lpDispatch->GetSendStream(),
m_dwCID, lpItem->GetPos(), cRemainNum, PktDisappearItem::DIC_LINKED_QUEST, PktBase::NO_SERVER_ERR);
}
lpItem->SetNumOrDurability(cRemainNum);
return true;
}
}
}
}
}
return false;
}
void Item::CArrayContainer::DumpItemInfo()
{
const int MAX_LINE = 1024;
char szLine[MAX_LINE];
int nBufferPos = 0;
ERRLOG1(g_Log, "CID:%10u <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׸<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", m_dwCID);
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
ERRLOG2(g_Log, "CID:%10u <20><> <20><> %d<><64> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.", m_dwCID, nTab);
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
nBufferPos = _snprintf(szLine, MAX_LINE, "CID:%10u <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>. ", m_dwCID);
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
const CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
nBufferPos += _snprintf(szLine + nBufferPos, MAX_LINE, " %5d ",
((0 != lpItem) ? lpItem->GetPrototypeID() : 0));
}
ERRLOG0(g_Log, szLine);
}
}
CItemContainer::DumpItemInfo();
}
void Item::CArrayContainer::DumpMoneyInfo(unsigned long dwDepositMoney)
{
CItemContainer::DumpMoneyInfo(dwDepositMoney);
}
bool Item::CArrayContainer::SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In)
{
size_t nBufferSize = static_cast<size_t>(dwBufferSize_In);
size_t nUsed = 0;
Item::CItemFactory& ItemFactory = CItemFactory::GetInstance();
while(nBufferSize > 0)
{
size_t nItemSize = nBufferSize;
Item::CItem* lpItem = ItemFactory.CreateItem(szItemBuffer_In + nUsed, nItemSize);
// edith 2008.08.26 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE><EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if(NULL == lpItem)
{
nItemSize = LogErrorItem(m_dwCID, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", szItemBuffer_In + nUsed);
break; // <20>ּ<EFBFBD>..
}
else if(!CArrayContainer::SetItem(lpItem->GetPos(), lpItem))
{
nItemSize = LogErrorItem(m_dwCID, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", szItemBuffer_In + nUsed);
DELETE_ITEM(lpItem);
break;
}
nUsed += nItemSize;
nBufferSize -= nItemSize;
}
return true;
}
// ----------------------------------------------------------------------------------------
// CListContainer
Item::CListContainer::CListContainer()
{
}
Item::CListContainer::~CListContainer()
{
}
Item::CItem* Item::CListContainer::GetItem(Item::ItemPos itemPos)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
CItem* lpItem = m_lppItems[itemPos.m_cIndex];
return (lpItem != m_lpNullItem) ? lpItem : NULL;
}
return NULL;
}
bool Item::CListContainer::SetItem(Item::ItemPos itemPos, Item::CItem* lpItem)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
if(NULL == m_lppItems[itemPos.m_cIndex])
{
m_lppItems[itemPos.m_cIndex] = lpItem;
lpItem->MoveItem(itemPos);
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", m_dwCID);
}
}
return false;
}
bool Item::CListContainer::RemoveItem(Item::ItemPos itemPos)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
if(NULL != m_lppItems[itemPos.m_cIndex])
{
m_lppItems[itemPos.m_cIndex] = NULL;
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.", m_dwCID);
}
}
return false;
}
bool Item::CListContainer::SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In)
{
size_t nBufferSize = static_cast<size_t>(dwBufferSize_In);
size_t nUsed = 0;
Item::CItemFactory& ItemFactory = CItemFactory::GetInstance();
while(nBufferSize > 0)
{
size_t nItemSize = nBufferSize;
Item::CItem* lpItem = ItemFactory.CreateItem(szItemBuffer_In + nUsed, nItemSize);
if(NULL == lpItem)
{
nItemSize = LogErrorItem(m_dwCID, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", szItemBuffer_In + nUsed);
}
else if(!CListContainer::SetItem(lpItem->GetPos(), lpItem))
{
nItemSize = LogErrorItem(m_dwCID, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", szItemBuffer_In + nUsed);
DELETE_ITEM(lpItem);
}
nUsed += nItemSize;
nBufferSize -= nItemSize;
}
return true;
}
// ----------------------------------------------------------------------------------------
// CSEQListContainer
Item::CSEQListContainer::CSEQListContainer() : m_ListCount(0)
{
}
Item::CSEQListContainer::~CSEQListContainer()
{
}
Item::CItem* Item::CSEQListContainer::GetItem(ItemPos itemPos)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
CItem* lpItem = m_lppItems[itemPos.m_cIndex];
return (lpItem != m_lpNullItem) ? lpItem : NULL;
}
return NULL;
}
bool Item::CSEQListContainer::SetItem(ItemPos itemPos, Item::CItem* lpItem)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
if(NULL == m_lppItems[itemPos.m_cIndex])
{
m_lppItems[itemPos.m_cIndex] = lpItem;
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", m_dwCID);
}
}
return false;
}
bool Item::CSEQListContainer::RemoveItem(Item::ItemPos itemPos)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
if(NULL != m_lppItems[itemPos.m_cIndex])
{
m_lppItems[itemPos.m_cIndex] = NULL;
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.", m_dwCID);
}
}
return false;
}
bool Item::CSEQListContainer::SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In)
{
size_t nBufferSize = static_cast<size_t>(dwBufferSize_In);
size_t nUsed = 0;
Item::CItemFactory& ItemFactory = CItemFactory::GetInstance();
m_ListCount = 0;
while(nBufferSize > 0)
{
size_t nItemSize = nBufferSize;
// ȭ<><C8AD>/<2F><>Ʈ
unsigned short ProtoTypeID = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_usProtoTypeID;
if(ProtoTypeID >= 4001 && ProtoTypeID <= 4033)
{
nItemSize = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_cItemSize;
if(20 != nItemSize)
{
ERRLOG1(g_Log, "CID:%10u <20>̻<EFBFBD><CCBB><EFBFBD> ȭ<><C8AD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
nUsed += nItemSize;
nBufferSize -= nItemSize;
continue;
}
}
Item::CItem* lpItem = ItemFactory.CreateItem(szItemBuffer_In + nUsed, nItemSize);
if(NULL == lpItem)
{
nItemSize = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_cItemSize;
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
}
else if(!CSEQListContainer::SetItem(ItemPos(0, m_ListCount), lpItem))
{
nItemSize = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_cItemSize;
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
DELETE_ITEM(lpItem);
}
nUsed += nItemSize;
nBufferSize -= nItemSize;
++m_ListCount;
}
return true;
}