void IrcSessionPrivate::receiveMessage(IrcMessage* msg) { Q_Q(IrcSession); switch (msg->type()) { case IrcMessage::Numeric: { IrcNumericMessage* numeric = static_cast<IrcNumericMessage*>(msg); if (numeric->code() == Irc::RPL_WELCOME) { setNick(msg->parameters().value(0)); setConnected(true); } else if (numeric->code() == Irc::RPL_ISUPPORT) { foreach (const QString& param, msg->parameters().mid(1)) { QStringList keyValue = param.split("=", QString::SkipEmptyParts); info.insert(keyValue.value(0), keyValue.value(1)); } emit q->sessionInfoReceived(IrcSessionInfo(q)); } break; } case IrcMessage::Ping: q->sendRaw("PONG " + static_cast<IrcPingMessage*>(msg)->argument()); break; case IrcMessage::Private: { IrcPrivateMessage* privMsg = static_cast<IrcPrivateMessage*>(msg); if (privMsg->isRequest()) { IrcCommand* reply = q->createCtcpReply(privMsg); if (reply) q->sendCommand(reply); } break; } case IrcMessage::Nick: if (msg->flags() & IrcMessage::Own) setNick(static_cast<IrcNickMessage*>(msg)->nick()); break; case IrcMessage::Capability: { IrcCapabilityMessage* capMsg = static_cast<IrcCapabilityMessage*>(msg); QString subCommand = capMsg->subCommand(); if (subCommand == "LS") { foreach (const QString& cap, capMsg->capabilities()) handleCapability(&availableCaps, cap); if (!connected) { QStringList params = capMsg->parameters(); if (params.value(params.count() - 1) != QLatin1String("*")) { QStringList request; emit q->capabilities(availableCaps.toList(), &request); if (!request.isEmpty()) q->sendCommand(IrcCommand::createCapability("REQ", request)); else q->sendData("CAP END"); } } } else if (subCommand == "ACK" || subCommand == "NAK") {
void tst_IrcMessage::testCapabilityMessage() { QFETCH(bool, valid); QFETCH(QByteArray, data); QFETCH(QString, subCommand); QFETCH(QStringList, capabilities); IrcConnection connection; IrcMessage* message = IrcMessage::fromData(data, &connection); QCOMPARE(message->type(), IrcMessage::Capability); QCOMPARE(message->command(), QString("CAP")); QCOMPARE(message->property("valid").toBool(), valid); QCOMPARE(message->property("subCommand").toString(), subCommand); QCOMPARE(message->property("capabilities").toStringList(), capabilities); IrcCapabilityMessage* capabilityMessage = qobject_cast<IrcCapabilityMessage*>(message); QVERIFY(capabilityMessage); QCOMPARE(capabilityMessage->isValid(), valid); QCOMPARE(capabilityMessage->subCommand(), subCommand); QCOMPARE(capabilityMessage->capabilities(), capabilities); }
void IrcSessionPrivate::processLine(const QByteArray& line) { Q_Q(IrcSession); static bool dbg = qgetenv("COMMUNI_DEBUG").toInt(); if (dbg) qDebug() << line; IrcMessage* msg = IrcMessage::fromData(line, encoding, q); if (msg) { switch (msg->type()) { case IrcMessage::Numeric: if (static_cast<IrcNumericMessage*>(msg)->code() == Irc::RPL_WELCOME) { setNick(msg->parameters().value(0)); setConnected(true); } break; case IrcMessage::Ping: q->sendRaw("PONG " + static_cast<IrcPingMessage*>(msg)->argument()); break; case IrcMessage::Private: { IrcPrivateMessage* privMsg = static_cast<IrcPrivateMessage*>(msg); if (privMsg->isRequest()) { IrcCommand* reply = q->createCtcpReply(privMsg); if (reply) q->sendCommand(reply); } break; } case IrcMessage::Nick: if (msg->isOwn()) setNick(static_cast<IrcNickMessage*>(msg)->nick()); break; case IrcMessage::Capability: if (!connected) { IrcCapabilityMessage* capMsg = static_cast<IrcCapabilityMessage*>(msg); QString subCommand = capMsg->subCommand(); if (subCommand == "LS") { foreach (const QString& cap, capMsg->capabilities()) capabilities.insert(cap); QStringList params = capMsg->parameters(); if (params.value(params.count() - 1) != QLatin1String("*")) { QStringList request; emit q->capabilities(capabilities.toList(), &request); if (!request.isEmpty()) q->sendCommand(IrcCommand::createCapability("REQ", request)); else q->sendData("CAP END"); } } else if (subCommand == "ACK" || subCommand == "NAK") { q->sendData("CAP END"); } }