X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fbasichandler.cpp;h=4df9ea259319da165999adf729026d622e706c9d;hp=87c7e0855eaf186bbe1f4a7a89a88b44805ffa78;hb=a5dfcc8ecf8b81025d24b3c5c816169e3e030ea4;hpb=902c95728306e5ba115de84800fc8d5d239c9d62 diff --git a/src/core/basichandler.cpp b/src/core/basichandler.cpp index 87c7e085..4df9ea25 100644 --- a/src/core/basichandler.cpp +++ b/src/core/basichandler.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * Copyright (C) 2005-07 by The Quassel Team * + * Copyright (C) 2005-08 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * + * (at your option) version 3. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -21,57 +21,166 @@ #include -#include "server.h" +#include "util.h" +#include "logger.h" -BasicHandler::BasicHandler(Server *parent) +BasicHandler::BasicHandler(CoreNetwork *parent) : QObject(parent), - server(parent) { - - connect(this, SIGNAL(displayMsg(Message::Type, QString, QString, QString, quint8)), - server, SIGNAL(displayMsg(Message::Type, QString, QString, QString, quint8))); + defaultHandler(-1), + _network(parent), + initDone(false) +{ + connect(this, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, Message::Flags)), + network(), SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, Message::Flags))); - connect(this, SIGNAL(putCmd(QString, QStringList, QString)), - server, SLOT(putCmd(QString, QStringList, QString))); + connect(this, SIGNAL(putCmd(QString, const QList &, const QByteArray &)), + network(), SLOT(putCmd(QString, const QList &, const QByteArray &))); - connect(this, SIGNAL(putRawLine(QString)), - server, SLOT(putRawLine(QString))); + connect(this, SIGNAL(putRawLine(const QByteArray &)), + network(), SLOT(putRawLine(const QByteArray &))); } -QStringList BasicHandler::providesHandlers() const { - QStringList handlers; - for(int i=0; i < metaObject()->methodCount(); i++) { - QString methodSignature(metaObject()->method(i).signature()); - if(!methodSignature.startsWith("handle")) - continue; +QStringList BasicHandler::providesHandlers() { + return handlerHash().keys(); +} - methodSignature = methodSignature.section('(',0,0); // chop the attribute list - methodSignature = methodSignature.mid(6); // strip "handle" - handlers << methodSignature; +const QHash &BasicHandler::handlerHash() { + if(!initDone) { + for(int i = metaObject()->methodOffset(); i < metaObject()->methodCount(); i++) { + QString methodSignature(metaObject()->method(i).signature()); + if(methodSignature.startsWith("defaultHandler")) { + defaultHandler = i; + continue; + } + + if(!methodSignature.startsWith("handle")) + continue; + + methodSignature = methodSignature.section('(',0,0); // chop the attribute list + methodSignature = methodSignature.mid(6); // strip "handle" + _handlerHash[methodSignature] = i; + } + initDone = true; } - return handlers; + return _handlerHash; } - -void BasicHandler::handle(const QString &member, const QGenericArgument &val0, - const QGenericArgument &val1, const QGenericArgument &val2, - const QGenericArgument &val3, const QGenericArgument &val4, - const QGenericArgument &val5, const QGenericArgument &val6, - const QGenericArgument &val7, const QGenericArgument &val8) { - +void BasicHandler::handle(const QString &member, QGenericArgument val0, + QGenericArgument val1, QGenericArgument val2, + QGenericArgument val3, QGenericArgument val4, + QGenericArgument val5, QGenericArgument val6, + QGenericArgument val7, QGenericArgument val8) { // Now we try to find a handler for this message. BTW, I do love the Trolltech guys ;-) + // and now we even have a fast lookup! Thanks thiago! + QString handler = member.toLower(); handler[0] = handler[0].toUpper(); - handler = "handle" + handler; - if(!QMetaObject::invokeMethod(this, handler.toAscii(), val0, val1, val2, val3, val4, val5, val6, val7, val8)) - // Ok. Default handler it is. - QMetaObject::invokeMethod(this, "defaultHandler", Q_ARG(QString, member), val0, val1, val2, val3, val4, val5, val6, val7, val8); - + if(!handlerHash().contains(handler)) { + if(defaultHandler == -1) { + qWarning() << QString("No such Handler: %1::handle%2").arg(metaObject()->className(), handler); + return; + } else { + void *param[] = {0, Q_ARG(QString, member).data(), val0.data(), val1.data(), val2.data(), val3.data(), val4.data(), + val5.data(), val6.data(), val7.data(), val8.data(), val8.data()}; + qt_metacall(QMetaObject::InvokeMetaMethod, defaultHandler, param); + return; + } + } + + void *param[] = {0, val0.data(), val1.data(), val2.data(), val3.data(), val4.data(), + val5.data(), val6.data(), val7.data(), val8.data(), val8.data(), 0}; + qt_metacall(QMetaObject::InvokeMetaMethod, handlerHash()[handler], param); +} + +QString BasicHandler::serverDecode(const QByteArray &string) { + return network()->serverDecode(string); +} + +QStringList BasicHandler::serverDecode(const QList &stringlist) { + QStringList list; + foreach(QByteArray s, stringlist) list << network()->serverDecode(s); + return list; +} + +QString BasicHandler::channelDecode(const QString &bufferName, const QByteArray &string) { + return network()->channelDecode(bufferName, string); +} + +QStringList BasicHandler::channelDecode(const QString &bufferName, const QList &stringlist) { + QStringList list; + foreach(QByteArray s, stringlist) list << network()->channelDecode(bufferName, s); + return list; +} + +QString BasicHandler::userDecode(const QString &userNick, const QByteArray &string) { + return network()->userDecode(userNick, string); +} + +QStringList BasicHandler::userDecode(const QString &userNick, const QList &stringlist) { + QStringList list; + foreach(QByteArray s, stringlist) list << network()->userDecode(userNick, s); + return list; +} + +/*** ***/ + +QByteArray BasicHandler::serverEncode(const QString &string) { + return network()->serverEncode(string); +} + +QList BasicHandler::serverEncode(const QStringList &stringlist) { + QList list; + foreach(QString s, stringlist) list << network()->serverEncode(s); + return list; +} + +QByteArray BasicHandler::channelEncode(const QString &bufferName, const QString &string) { + return network()->channelEncode(bufferName, string); +} + +QList BasicHandler::channelEncode(const QString &bufferName, const QStringList &stringlist) { + QList list; + foreach(QString s, stringlist) list << network()->channelEncode(bufferName, s); + return list; +} + +QByteArray BasicHandler::userEncode(const QString &userNick, const QString &string) { + return network()->userEncode(userNick, string); +} + +QList BasicHandler::userEncode(const QString &userNick, const QStringList &stringlist) { + QList list; + foreach(QString s, stringlist) list << network()->userEncode(userNick, s); + return list; } // ==================== // protected: // ==================== -NetworkInfo *BasicHandler::networkInfo() const { - return server->networkInfo(); +BufferInfo::Type BasicHandler::typeByTarget(const QString &target) const { + if(target.isEmpty()) + return BufferInfo::StatusBuffer; + + if(network()->isChannelName(target)) + return BufferInfo::ChannelBuffer; + + return BufferInfo::QueryBuffer; +} + +void BasicHandler::putCmd(const QString &cmd, const QByteArray ¶m, const QByteArray &prefix) { + QList list; + list << param; + emit putCmd(cmd, list, prefix); +} + +void BasicHandler::displayMsg(Message::Type msgType, QString target, QString text, QString sender, Message::Flags flags) { + if(!target.isEmpty() && network()->prefixes().contains(target[0])) + target = target.mid(1); + + IrcChannel *channel = network()->ircChannel(target); + if(!channel && (target.startsWith('$') || target.startsWith('#'))) + target = nickFromMask(sender); + + emit displayMsg(msgType, typeByTarget(target), target, text, sender, flags); }