* 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
161 lines
2.8 KiB
C++
161 lines
2.8 KiB
C++
#include "StdAfx.h"
|
|
#include ".\SequenceList.h"
|
|
|
|
CSequenceList::CSequenceList(void)
|
|
{
|
|
m_lpSequences = NULL;
|
|
}
|
|
|
|
CSequenceList::~CSequenceList(void)
|
|
{
|
|
FreeSequences();
|
|
}
|
|
|
|
void CSequenceList::FreeSequences(void)
|
|
{
|
|
CSequence *sequence = m_lpSequences;
|
|
|
|
while (sequence)
|
|
{
|
|
if (sequence->m_lpNext)
|
|
{
|
|
sequence = sequence->m_lpNext;
|
|
|
|
if (sequence->m_lpPrev)
|
|
SAFE_DELETE(sequence->m_lpPrev);
|
|
}
|
|
else
|
|
SAFE_DELETE(sequence);
|
|
}
|
|
|
|
m_lpSequences = NULL;
|
|
}
|
|
|
|
bool CSequenceList::AddSequence(CSequence *lpSequence)
|
|
{
|
|
CSequence *sequence = NULL;
|
|
|
|
if (m_lpSequences)
|
|
{
|
|
sequence = m_lpSequences;
|
|
|
|
while (sequence->m_lpNext)
|
|
sequence = sequence->m_lpNext;
|
|
|
|
sequence->m_lpNext = lpSequence;
|
|
|
|
if (!sequence->m_lpNext) return false;
|
|
|
|
sequence->m_lpNext->m_lpNext = NULL;
|
|
sequence->m_lpNext->m_lpPrev = sequence;
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
sequence = lpSequence;
|
|
|
|
if (!sequence) return false;
|
|
|
|
m_lpSequences = sequence;
|
|
m_lpSequences->m_lpNext = NULL;
|
|
m_lpSequences->m_lpPrev = NULL;
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void CSequenceList::RemoveSequence(CSequence *lpSequence)
|
|
{
|
|
if (lpSequence->m_lpNext)
|
|
{
|
|
if (lpSequence->m_lpPrev)
|
|
{
|
|
lpSequence->m_lpPrev->m_lpNext = lpSequence->m_lpNext;
|
|
lpSequence->m_lpNext->m_lpPrev = lpSequence->m_lpPrev;
|
|
}
|
|
else
|
|
{
|
|
lpSequence->m_lpNext->m_lpPrev = NULL;
|
|
m_lpSequences = lpSequence->m_lpNext;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (lpSequence->m_lpPrev)
|
|
{
|
|
lpSequence->m_lpPrev->m_lpNext = NULL;
|
|
}
|
|
else
|
|
{
|
|
m_lpSequences = NULL;
|
|
}
|
|
}
|
|
|
|
SAFE_DELETE(lpSequence);
|
|
}
|
|
|
|
CSequence *CSequenceList::FindSequenceByKey(WORD wKey)
|
|
{
|
|
CSequence *sequence = m_lpSequences;
|
|
|
|
while (sequence)
|
|
{
|
|
if (sequence->m_wKey == wKey)
|
|
return sequence;
|
|
sequence = sequence->m_lpNext;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
CSequence *CSequenceList::FindSequenceByValue(WORD wValue)
|
|
{
|
|
CSequence *sequence = m_lpSequences;
|
|
|
|
while (sequence)
|
|
{
|
|
if (sequence->m_wValue == wValue)
|
|
return sequence;
|
|
sequence = sequence->m_lpNext;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void CSequenceList::WalkSequences(void)
|
|
{
|
|
CSequence *sequence = m_lpSequences;
|
|
|
|
while (sequence)
|
|
{
|
|
dprintf("SEQ WALK: %hu ==> %hu\n", sequence->m_wKey, sequence->m_wValue);
|
|
sequence = sequence->m_lpNext;
|
|
}
|
|
}
|
|
|
|
BYTE CSequenceList::WriteAckedSequences(char *buf)
|
|
{
|
|
CSequence *sequence = m_lpSequences;
|
|
BYTE cAcked = 0;
|
|
|
|
while (sequence)
|
|
{
|
|
if (sequence->m_wState == SEQ_STATE_ACKED)
|
|
{
|
|
DWORD dwID = (DWORD)sequence->m_wKey;
|
|
dprintf("WROTE ACKED SEQ: %lu\n", dwID);
|
|
memcpy(&buf[cAcked * sizeof(dwID)], &dwID, sizeof(dwID));
|
|
cAcked++;
|
|
CSequence *remove = sequence;
|
|
sequence = sequence->m_lpNext;
|
|
RemoveSequence(remove);
|
|
}
|
|
else
|
|
sequence = sequence->m_lpNext;
|
|
}
|
|
|
|
return cAcked;
|
|
} |