* Moved snowcrash to the applications directory * Removed the Release folder from SLIRC git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@133 52acb1d6-8a22-11de-b505-999d5b087335
218 lines
3.5 KiB
C++
218 lines
3.5 KiB
C++
#include "StdAfx.h"
|
|
#include ".\Message.h"
|
|
|
|
CMessage::CMessage(void)
|
|
{
|
|
m_lpBlocks = NULL;
|
|
m_lpszCommand = NULL;
|
|
}
|
|
|
|
CMessage::~CMessage(void)
|
|
{
|
|
FreeBlocks();
|
|
SAFE_FREE(m_lpszCommand);
|
|
}
|
|
|
|
void CMessage::FreeBlocks(void)
|
|
{
|
|
CBlockList *blocks = m_lpBlocks;
|
|
|
|
while (blocks)
|
|
{
|
|
if (blocks->m_lpNext)
|
|
{
|
|
blocks = blocks->m_lpNext;
|
|
|
|
if (blocks->m_lpPrev)
|
|
SAFE_DELETE(blocks->m_lpPrev);
|
|
}
|
|
else
|
|
SAFE_DELETE(blocks);
|
|
}
|
|
|
|
m_lpBlocks = NULL;
|
|
}
|
|
|
|
bool CMessage::AddBlock(char *lpszBlock, int nType, CBlock *lpBlock)
|
|
{
|
|
CBlockList *blocks = FindBlock(lpszBlock);
|
|
|
|
if (blocks)
|
|
{
|
|
return blocks->AddBlock(lpBlock);
|
|
}
|
|
else
|
|
{
|
|
if (m_lpBlocks)
|
|
{
|
|
blocks = m_lpBlocks;
|
|
|
|
while (blocks->m_lpNext)
|
|
blocks = blocks->m_lpNext;
|
|
|
|
blocks->m_lpNext = new CBlockList;
|
|
|
|
if (!blocks->m_lpNext) return false;
|
|
|
|
blocks->m_lpNext->m_lpNext = NULL;
|
|
blocks->m_lpNext->m_lpPrev = blocks;
|
|
blocks->m_lpNext->SetBlock(lpszBlock);
|
|
blocks->m_lpNext->SetType(nType);
|
|
blocks->m_lpNext->AddBlock(lpBlock);
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
blocks = new CBlockList;
|
|
|
|
if (!blocks) return false;
|
|
|
|
m_lpBlocks = blocks;
|
|
m_lpBlocks->m_lpNext = NULL;
|
|
m_lpBlocks->m_lpPrev = NULL;
|
|
m_lpBlocks->SetBlock(lpszBlock);
|
|
m_lpBlocks->SetType(nType);
|
|
m_lpBlocks->AddBlock(lpBlock);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
CBlock *CMessage::GetBlock(char *lpszBlock, int nIndex)
|
|
{
|
|
CBlockList *blocks = m_lpBlocks;
|
|
|
|
while (blocks)
|
|
{
|
|
if (blocks->m_lpszBlock && !stricmp(lpszBlock, blocks->m_lpszBlock))
|
|
{
|
|
CBlock *block = blocks->GetBlock(nIndex);
|
|
return block;
|
|
}
|
|
|
|
blocks = blocks->m_lpNext;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CBlockList *CMessage::FindBlock(char *lpszBlock)
|
|
{
|
|
CBlockList *blocks = m_lpBlocks;
|
|
|
|
while (blocks)
|
|
{
|
|
if (blocks->m_lpszBlock && !stricmp(lpszBlock, blocks->m_lpszBlock))
|
|
return blocks;
|
|
|
|
blocks = blocks->m_lpNext;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
int CMessage::CountBlock(char *lpszBlock)
|
|
{
|
|
CBlockList *blocks = FindBlock(lpszBlock);
|
|
|
|
if (blocks)
|
|
{
|
|
return blocks->CountBlock();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
bool CMessage::GetString(char *lpszBlock, int nIndex, char *lpszVar, char &lpszStr)
|
|
{
|
|
CBlock *block = GetBlock(lpszBlock, nIndex);
|
|
|
|
if (block)
|
|
{
|
|
CVar *var = block->FindVar(lpszVar);
|
|
|
|
if (var)
|
|
{
|
|
var->GetString(lpszStr);
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CMessage::GetBool(char *lpszBlock, int nIndex, char *lpszVar, bool &lpbBool)
|
|
{
|
|
CBlock *block = GetBlock(lpszBlock, nIndex);
|
|
|
|
if (block)
|
|
{
|
|
CVar *var = block->FindVar(lpszVar);
|
|
|
|
if (var)
|
|
{
|
|
var->GetBool(lpbBool);
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void CMessage::SetCommand(char *lpszCommand)
|
|
{
|
|
if (lpszCommand)
|
|
{
|
|
size_t stLen = strlen(lpszCommand);
|
|
|
|
if (stLen > 0)
|
|
{
|
|
SAFE_FREE(m_lpszCommand);
|
|
m_lpszCommand = (char *)malloc(stLen + 1);
|
|
|
|
if (m_lpszCommand)
|
|
{
|
|
strncpy(m_lpszCommand, lpszCommand, stLen);
|
|
m_lpszCommand[stLen] = '\0';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMessage::Dump(void)
|
|
{
|
|
if (m_lpszCommand)
|
|
dprintf("----- %s -----\n", m_lpszCommand);
|
|
|
|
CBlockList *blocks = m_lpBlocks;
|
|
|
|
while (blocks)
|
|
{
|
|
blocks->Dump();
|
|
blocks = blocks->m_lpNext;
|
|
}
|
|
}
|
|
|
|
int CMessage::Pack(LPBYTE lpData)
|
|
{
|
|
int nTotalWrote = 0;
|
|
int nWrote = 0;
|
|
LPBYTE lpPtr = lpData;
|
|
CBlockList *blocks = m_lpBlocks;
|
|
|
|
while (blocks)
|
|
{
|
|
nWrote = blocks->Pack(lpPtr);
|
|
lpPtr += nWrote;
|
|
nTotalWrote += nWrote;
|
|
blocks = blocks->m_lpNext;
|
|
}
|
|
|
|
return nTotalWrote;
|
|
} |