ostinato/common/protocollistiterator.cpp
Srivats P. 0094f618d3 Protocol Framework related
--------------------------
	- AbstractProtocol Constructor and Factory function now take an optional (default NULL) "parent" abstract protocol in addition to the stream; this "parent" protocol is non-NULL for protocols which are aggregated in a ComboProtocol
	- All subclasses of AbstractProtocol modified as per the above interface change
	- ProtocolManager also modifed as per the above interface change
	- new data members in AbstractProtocol - prev, next; the AbstractProtocol implementation now uses these members to traverse protocols on the list instead of ProtocolListIterator; this change required for ComboProtocol
	- ProtocolListIterator updates these new members - prev/next on insert/remove/replace
	- ComboProtocol and ProtocolListIterator classes made friends of AbstractProtocol
	- ComboProtocol implemented as a template class (completed)
	- Dot2LLc implemented as a combo of Dot3Raw and LLC
	- Dot2Snap implemented as a combo of Dot2Llc and SNAP
	- VlanStack implemented as a combo of VLAN + VLAN
	- ProtocolManager now uses the ProtocolId enums rather than hardcoded values

Stream Config Dialog
--------------------
	- "None" radio button added to all protocol levels
	- Protocol Level 1 added with 'mac' as the only valid protocol in the "simple" mode widget
	- With Dot2Llc, Dot2Snap and VlanStack implemented as "combo" protocols, the protocol choice radiobuttons in the "simple" mode are now 1:1 with a protocol; this has the following implications/advantages:
		- Updates of the "simple" mode widget from/to stream's protocolList is simpler; this code has now been rewritten to take advantage of 1:1
		- This paves the way for exporting tunneled protocols 4over4, 4over6, 6over4 etc. in the "simple" mode
		- This should also (hopefully) require less changes when adding a new protocol; more work needs to be done to reach this goal

Fixes
-----
	- Dot3Protocol now derives "length" correctly for VLAN tagged packets
	- StreamBase now uses the ProtocolListIterator to append the default protocols in a stream instead of directly manipulating ProtocolList; also in protoDataCopyFrom()

Others (Client/Server)
----------------------
	- Port Packet Capture implemented; "view capture" is pending (hack put in place now for testing)
2009-10-14 15:16:56 +00:00

115 lines
2.2 KiB
C++

#include "protocollistiterator.h"
#include "protocollist.h"
#include "abstractprotocol.h"
ProtocolListIterator::ProtocolListIterator(ProtocolList &list)
{
_iter = new QMutableLinkedListIterator<AbstractProtocol*>(list);
}
ProtocolListIterator::~ProtocolListIterator()
{
delete _iter;
}
bool ProtocolListIterator::findNext(const AbstractProtocol* value) const
{
return _iter->findNext((AbstractProtocol*)((uint)value));
}
bool ProtocolListIterator::findPrevious(const AbstractProtocol* value)
{
return _iter->findPrevious((AbstractProtocol*)((uint)value));
}
bool ProtocolListIterator::hasNext() const
{
return _iter->hasNext();
}
bool ProtocolListIterator::hasPrevious() const
{
return _iter->hasPrevious();
}
void ProtocolListIterator::insert(AbstractProtocol* value)
{
if (_iter->hasPrevious())
{
value->prev = _iter->peekPrevious();
value->prev->next = value;
}
else
value->prev = NULL;
if (_iter->hasNext())
{
value->next = _iter->peekNext();
value->next->prev = value;
}
else
value->next = NULL;
_iter->insert((AbstractProtocol*)((uint)value));
}
AbstractProtocol* ProtocolListIterator::next()
{
return _iter->next();
}
AbstractProtocol* ProtocolListIterator::peekNext() const
{
return _iter->peekNext();
}
AbstractProtocol* ProtocolListIterator::peekPrevious() const
{
return _iter->peekPrevious();
}
AbstractProtocol* ProtocolListIterator::previous()
{
return _iter->previous();
}
void ProtocolListIterator::remove()
{
if (_iter->value()->prev)
_iter->value()->prev->next = _iter->value()->next;
if (_iter->value()->next)
_iter->value()->next->prev = _iter->value()->prev;
_iter->remove();
}
void ProtocolListIterator::setValue(AbstractProtocol* value) const
{
if (_iter->value()->prev)
_iter->value()->prev->next = value;
if (_iter->value()->next)
_iter->value()->next->prev = value;
value->prev = _iter->value()->prev;
value->next = _iter->value()->next;
_iter->setValue((AbstractProtocol*)((uint)value));
}
void ProtocolListIterator::toBack()
{
_iter->toBack();
}
void ProtocolListIterator::toFront()
{
_iter->toFront();
}
const AbstractProtocol* ProtocolListIterator::value() const
{
return _iter->value();
}
AbstractProtocol* ProtocolListIterator::value()
{
return _iter->value();
}