Код:
void WorldSocket::slotRead()
{
sLog.outDebug("Read client data...");
// For debug
sLog.outTrace(QString("Current thread: 0x%0").arg(QString::number(qint32(QThread::currentThreadId()), 16).toUpper()));
if (bytesAvailable() < 6)
{
sLog.outError("Packet haven't header!");
return;
}
_buffer.clear();
_buffer = readAll();
// Parse header
ClientPacketHeader header;
QBuffer buf(&_buffer);
buf.open(QIODevice::ReadOnly);
buf.read((char*)&header, sizeof(ClientPacketHeader));
m_Crypt.DecryptRecv((quint8*)&header, sizeof(ClientPacketHeader));
header.size = qbswap(header.size);
quint16 remaining = header.size - 4;
if (remaining)
{
if (_buffer.size() < remaining)
{
sLog.outError("Packet not full!");
return;
}
}
sLog.outWarn(QString("HEADER: Opcode = %0, Remaining Size = %1").arg(header.cmd).arg(remaining));
WorldPacket* rPacket;
rPacket = new WorldPacket(header.cmd);
if(!remaining)
sLog.outDebug("Empty packet...");
else
rPacket->setData(_buffer.right(remaining));
switch (rPacket->getOpcode())
{
case Opcodes::CMSG_AUTH_SESSION:
handleAuthSession(*rPacket);
break;
case Opcodes::CMSG_PING:
handlePing(*rPacket);
break;
default:
if (m_session)
{
emit signalPacketReceived(rPacket);
}
else
{
sLog.outError(QString("Opcode %0 (%1) received without session!")
.arg(sOpcodes.nameByValue(rPacket->getOpcode()))
.arg(rPacket->getOpcode()));
delete rPacket;
}
break;
}
}
Слот вызывается по получению сигнала readyRead(), вызов которого от меня толком не зависит.