/*! Creates a new message from \a data and \a parent. */ IrcMessage* IrcMessage::fromData(const QByteArray& data, QObject* parent) { IrcMessage* message = 0; IrcParser parser; if (parser.parse(data)) { const QMetaObject* metaObject = irc_command_meta_object(parser.command()); Q_ASSERT(metaObject); message = qobject_cast<IrcMessage*>(metaObject->newInstance(Q_ARG(QObject*, parent))); Q_ASSERT(message); message->d_ptr->parser = parser; IrcSession* session = qobject_cast<IrcSession*>(parent); if (session) { IrcSender sender = message->sender(); if (sender.isValid() && sender.name() == session->nickName()) message->d_ptr->flags |= Own; if (session->d_ptr->capabilities.contains("identify-msg") && (message->d_ptr->type == Private || message->d_ptr->type == Notice)) { QString msg = message->property("message").toString(); if (msg.startsWith("+")) message->d_ptr->flags |= Identified; else if (msg.startsWith("-")) message->d_ptr->flags |= Unidentified; } } } return message; }
void IrcSessionPrivate::processLine(const QByteArray& line) { Q_Q(IrcSession); QString encoded = encoder.encode(line); static bool dbg = qgetenv("COMMUNI_DEBUG").toInt(); if (dbg) qDebug() << encoded; IrcMessage* msg = IrcMessage::fromString(encoded); if (msg) { switch (msg->type()) { case IrcMessage::Numeric: if (static_cast<IrcNumericMessage*>(msg)->code() == Irc::RPL_WELCOME) { setNick(msg->parameters().value(0)); connected = true; emit q->connected(); emit q->connectedChanged(true); } else if (static_cast<IrcNumericMessage*>(msg)->code() == Irc::RPL_ISUPPORT) { foreach (const QString& param, msg->parameters().mid(1)) { const QStringList keyValue = param.split("=", QString::SkipEmptyParts); info.insert(keyValue.value(0), keyValue.value(1)); } } 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()) { QString reply; QString request = privMsg->message().split(" ", QString::SkipEmptyParts).value(0).toUpper(); if (request == "PING") reply = privMsg->message(); else if (request == "TIME") reply = "TIME " + QLocale().toString(QDateTime::currentDateTime(), QLocale::ShortFormat); else if (request == "VERSION") reply = QString("VERSION Communi ") + Irc::version(); if (!reply.isNull()) q->sendCommand(IrcCommand::createCtcpReply(msg->sender().name(), reply)); } break; } case IrcMessage::Nick: if (msg->sender().name() == nickName) setNick(static_cast<IrcNickMessage*>(msg)->nick()); break; default: break; } emit q->messageReceived(msg); msg->deleteLater(); }