void IRC::handle_msg(const string& chan, const string& nick, const string& login, const string& host, const string& omsg) { string msg = omsg; if(chan.find_first_of("#&+!") == 0) { //Channel Message onMessage(chan, nick, login, host, msg); } else { //Private Messages if(msg.find("\x001") == 0 && msg.rfind("\x001") == msg.length() - 1) { //CTCP msg = msg.substr(1, msg.length() - 2); if(msg.compare("TIME") == 0) { onTime(nick,login,host,chan); } else if(msg.compare("VERSION") == 0) { onVersion(nick,login,host,chan); } else if(msg.substr(0, 4).compare("PING") == 0) { onPing(nick,login,host,chan,msg.substr(5)); } else if(msg.compare("FINGER") == 0) { onFinger(nick,login,host,chan); } else if(msg.substr(0, 6).compare("ACTION") == 0) { onAction(nick,login,host,chan,msg.substr(7)); } return; } onPrivateMessage(nick, login, host, msg); } }
void CDatagrams::onPacket(CEndPoint addr, G2Packet* pPacket) { try { if(pPacket->isType("PI")) { onPing(addr, pPacket); } else if(pPacket->isType("PO")) { onPong(addr, pPacket); } else if(pPacket->isType("CRAWLR")) { onCRAWLR(addr, pPacket); } else if(pPacket->isType("QKR")) { onQKR(addr, pPacket); } else if(pPacket->isType("QKA")) { onQKA(addr, pPacket); } else if(pPacket->isType("QA")) { onQA(addr, pPacket); } else if(pPacket->isType("QH2")) { onQH2(addr, pPacket); } else if(pPacket->isType("Q2")) { onQuery(addr, pPacket); } else { //systemLog.postLog(LogSeverity::Debug, QString("G2 UDP recieved unknown packet %1").arg(pPacket->GetType())); //qDebug() << "UDP RECEIVED unknown packet " << pPacket->GetType(); } } catch(...) { systemLog.postLog(LogSeverity::Debug, QString("malformed packet")); //qDebug() << "malformed packet"; } }
void ARControlConnection::onReadyRead() { Q_D(ARControlConnection); while(d->d2c->hasPendingDatagrams()) { QHostAddress remoteAddr; quint16 remotePort; // If we've not received enough data, then return and wait for more. if(d->d2c->pendingDatagramSize() < ARNETWORK_FRAME_HEADER_SIZE) break; QByteArray datagram(d->d2c->pendingDatagramSize(), 0x00); quint32 offset = 0; d->d2c->readDatagram(datagram.data(), datagram.size(), &remoteAddr, &remotePort); while(offset < datagram.size()) { ARControlFrame frame; frame.type = static_cast<quint8>(datagram[offset + 0]); frame.id = static_cast<quint8>(datagram[offset + 1]); frame.seq = static_cast<quint8>(datagram[offset + 2]); frame.size = qFromLittleEndian(*((quint32*)(datagram.constData() + offset + 3))); // Copy datagram data to frame if the frame size is larger than just the header. if(frame.size > ARNETWORK_FRAME_HEADER_SIZE) { const char *data = datagram.constData(); frame.payload.insert(0, data + offset + ARNETWORK_FRAME_HEADER_SIZE, frame.size - ARNETWORK_FRAME_HEADER_SIZE); } // Output comms debug info (if it's not a video data frame). if(frame.id != ARNET_D2C_VIDEO_DATA_ID) { DEBUG_T(QString("<< %1:%2 [%3]") .arg(remoteAddr.toString()) .arg(remotePort) .arg(QString(datagram.toHex()))); } // Process frame depending on buffer id. if(frame.id == ARNET_D2C_PING_ID) { onPing(frame); } else if(frame.id == ARNET_D2C_EVENT_ID || frame.id == ARNET_D2C_NAVDATA_ID) { onNavdata(frame); } else if(frame.id == ARNET_D2C_VIDEO_DATA_ID) { onVideoData(frame); } else { WARNING_T(QString("Unhandled frame id: %1").arg(frame.id)); } // Increment datagram offset to continue processing next frame. offset += frame.size; } } }