X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fircparser.cpp;h=cd59e53de8d576d3ee689d4f267ce0f6d9012ae1;hp=75ac2c99f7d7e19e6e2ccb15581689c4728f317c;hb=4ae8f86c1ce452582d6fe576956c7c1bc1460adf;hpb=7c45e37945b0fa3baa5e8190991c9a2e24d357ba diff --git a/src/core/ircparser.cpp b/src/core/ircparser.cpp index 75ac2c99..cd59e53d 100644 --- a/src/core/ircparser.cpp +++ b/src/core/ircparser.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2010 by the Quassel Project * + * Copyright (C) 2005-2012 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -34,7 +34,7 @@ IrcParser::IrcParser(CoreSession *session) : QObject(session), _coreSession(session) { - + connect(this, SIGNAL(newEvent(Event *)), coreSession()->eventManager(), SLOT(postEvent(Event *))); } bool IrcParser::checkParamCount(const QString &cmd, const QList ¶ms, int minParams) { @@ -50,12 +50,18 @@ QByteArray IrcParser::decrypt(Network *network, const QString &bufferName, const if(message.isEmpty()) return message; + if(!Cipher::neededFeaturesAvailable()) + return message; + Cipher *cipher = qobject_cast(network)->cipher(bufferName); if(!cipher) return message; return isTopic? cipher->decryptTopic(message) : cipher->decrypt(message); #else + Q_UNUSED(network); + Q_UNUSED(bufferName); + Q_UNUSED(isTopic); return message; #endif } @@ -130,16 +136,18 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) { QList events; EventManager::EventType type = EventManager::Invalid; - // numeric replies have the target as first param (RFC 2812 - 2.4). this is usually our own nick. Remove this! uint num = cmd.toUInt(); if(num > 0) { + // numeric reply if(params.count() == 0) { qWarning() << "Message received from server violates RFC and is ignored!" << msg; return; } + // numeric replies have the target as first param (RFC 2812 - 2.4). this is usually our own nick. Remove this! target = net->serverDecode(params.takeFirst()); type = EventManager::IrcEventNumeric; } else { + // any other irc command QString typeName = QLatin1String("IrcEvent") + cmd.at(0).toUpper() + cmd.mid(1).toLower(); type = eventManager()->eventTypeByName(typeName); if(type == EventManager::Invalid) { @@ -174,8 +182,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) { msg = decrypt(net, target, msg); - events << new IrcEventRawMessage(EventManager::IrcEventRawPrivmsg, net, prefix, target, msg); - //events << new MessageEvent(Message::Plain, net, net->channelDecode(target, msg), target, prefix); + events << new IrcEventRawMessage(EventManager::IrcEventRawPrivmsg, net, msg, prefix, target, e->timestamp()); } } break; @@ -200,7 +207,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) { CoreIrcChannel *chan = static_cast(net->ircChannel(channelname)); // we only have CoreIrcChannels in the core, so this cast is safe if(chan && !chan->receivedWelcomeMsg()) { chan->setReceivedWelcomeMsg(); - events << new MessageEvent(Message::Notice, net, decMsg, channelname, prefix); + events << new MessageEvent(Message::Notice, net, decMsg, prefix, channelname, Message::None, e->timestamp()); continue; } } @@ -214,7 +221,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) { if(!net->isChannelName(target)) target = nickFromMask(prefix); } - events << new IrcEventRawMessage(EventManager::IrcEventRawNotice, net, prefix, target, msg); + events << new IrcEventRawMessage(EventManager::IrcEventRawNotice, net, params[1], prefix, target, e->timestamp()); } } break; @@ -242,10 +249,10 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) { break; case EventManager::IrcEventTopic: - if(params.count() >= 2) { + if(params.count() >= 1) { QString channel = net->serverDecode(params.at(0)); decParams << channel; - decParams << net->channelDecode(channel, decrypt(net, channel, params.at(1), true)); + decParams << (params.count() >= 2? net->channelDecode(channel, decrypt(net, channel, params.at(1), true)) : QString()); } break; @@ -268,7 +275,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) { break; case 333: /* Topic set by... */ - if(params.count() >= 2) { + if(params.count() >= 3) { QString channel = net->serverDecode(params.at(0)); decParams << channel << net->serverDecode(params.at(1)); decParams << net->channelDecode(channel, params.at(2)); @@ -290,10 +297,11 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) { else event = new IrcEvent(type, net, prefix); event->setParams(decParams); + event->setTimestamp(e->timestamp()); events << event; } foreach(Event *event, events) { - coreSession()->eventManager()->sendEvent(event); + emit newEvent(event); } }