Files
libremetaverse/applications/snowcrash/snowflake/Message.cpp
John Hurliman a22cc1de4c * Updated all the keywords/protocol files for 1.11.3.1
* 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
2006-08-09 19:06:41 +00:00

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;
}