ostinato/client/portgroup.cpp
Srivats P. 8251383351 - added PortStatsFilter
- added PacketDump (test code)
- added PacketTree (not complete)
- Protocol stuff (not complete)
2008-05-25 11:30:30 +00:00

170 lines
4.1 KiB
C++

#include "portgroup.h"
#include "../common/protocol.h"
quint32 PortGroup::mPortGroupAllocId = 0;
PortGroup::PortGroup(QHostAddress ip, quint16 port)
{
// Allocate an id for self
mPortGroupId = PortGroup::mPortGroupAllocId++;
// Init attributes for which we values were passed to us
mServerAddress = ip;
mServerPort = port;
// Init remaining attributes with defaults
mpSocket = new QTcpSocket(this);
// TODO: consider using QT's signal-slot autoconnect
connect(mpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(on_mpSocket_stateChanged()));
connect(mpSocket, SIGNAL(connected()), this, SLOT(when_connected()));
connect(mpSocket, SIGNAL(disconnected()), this, SLOT(when_disconnected()));
connect(mpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(when_error(QAbstractSocket::SocketError)));
connect(mpSocket, SIGNAL(readyRead()), this, SLOT(when_dataAvail()));
}
PortGroup::~PortGroup()
{
qDebug("PortGroup Destructor");
// Disconnect and free TCP mpSocketet etc.
PortGroup::disconnectFromHost();
delete mpSocket;
}
void PortGroup::connectToHost(QHostAddress ip, quint16 port)
{
mServerAddress = ip;
mServerPort = port;
PortGroup::connectToHost();
}
void PortGroup::connectToHost()
{
qDebug("PortGroup::connectToHost()");
mpSocket->connectToHost(mServerAddress, mServerPort);
}
void PortGroup::disconnectFromHost()
{
mpSocket->disconnectFromHost();
}
// --------------------------------------------
// Private Methods
// --------------------------------------------
void PortGroup::ProcessMsg(const char *msg, quint32 size)
{
tCommHdr *hdr;
// TODO: For now, assuming we'll get a complete msg
// but need to fix this as this is a TCP stream
hdr = (tCommHdr*) msg;
if (hdr->ver != 1) // FIXME:hardcoding
{
qDebug("Rcvd msg with invalid version %d\n", hdr->ver);
goto _exit;
}
qDebug("msgType - %x\n", NTOHS(hdr->msgType));
switch (NTOHS(hdr->msgType))
{
case e_MT_CapabilityInfo:
ProcessCapabilityInfo(msg+sizeof(tCommHdr),
NTOHS(hdr->msgLen)-sizeof(tCommHdr));
break;
default:
qDebug("Rcvd msg with unrecognized msgType %d\n", NTOHS(hdr->msgType));
}
_exit:
return;
}
void PortGroup::ProcessCapabilityInfo(const char *msg, qint32 size)
{
tTlvPortCapability *cap = (tTlvPortCapability*) msg;
Port *p;
emit portListAboutToBeChanged(mPortGroupId);
while (size)
{
qDebug("size = %d, tlvType = %d, tlvLen = %d\n",
size, NTOHS(cap->tlvType), NTOHS(cap->tlvLen));
if (NTOHS(cap->tlvType) != e_TT_PortCapability)
{
qDebug("Unrecognized TLV Type %d\n", NTOHS(cap->tlvType));
goto _next;
}
p = new Port(NTOHL(cap->portId), mPortGroupId);
p->setName(cap->portName);
p->setDescription(cap->portDesc);
p->insertDummyStreams(); // FIXME: only for testing
qDebug("before port append\n");
mPorts.append(*p);
_next:
size -= NTOHS(cap->tlvLen);
cap = (tTlvPortCapability*)((char *)(cap) + NTOHS(cap->tlvLen));
}
emit portListChanged(mPortGroupId);
return;
}
// ------------------------------------------------
// Slots
// ------------------------------------------------
void PortGroup::on_mpSocket_stateChanged()
{
qDebug("state changed");
emit portGroupDataChanged(this);
}
void PortGroup::when_connected()
{
qDebug("connected\n");
emit portGroupDataChanged(this);
// Ask for Port Capability
tCommHdr pkt;
pkt.ver = 1;
pkt.resv1 = 0;
pkt.resv2 = 0;
pkt.msgType = HTONS(e_MT_GetCapability);
pkt.msgLen = HTONS(8);
mpSocket->write((char*) &pkt, sizeof(pkt));
}
void PortGroup::when_disconnected()
{
qDebug("disconnected\n");
emit portListAboutToBeChanged(mPortGroupId);
mPorts.clear();
emit portListChanged(mPortGroupId);
emit portGroupDataChanged(this);
}
void PortGroup::when_error(QAbstractSocket::SocketError socketError)
{
qDebug("error\n");
emit portGroupDataChanged(this);
}
void PortGroup::when_dataAvail()
{
qDebug("dataAvail\n");
QByteArray msg = mpSocket->read(1024); // FIXME: hardcoding
ProcessMsg(msg.constData(), msg.size());
}