X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fbasichandler.cpp;h=3c981515590efbc12c818e65c2f77c43de23be04;hb=5b083e1f67c77ceb7d1d134e976cd6081b70bf12;hp=87c7e0855eaf186bbe1f4a7a89a88b44805ffa78;hpb=902c95728306e5ba115de84800fc8d5d239c9d62;p=quassel.git diff --git a/src/core/basichandler.cpp b/src/core/basichandler.cpp index 87c7e085..3c981515 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,14 +21,16 @@ #include -#include "server.h" +#include "networkconnection.h" -BasicHandler::BasicHandler(Server *parent) +BasicHandler::BasicHandler(NetworkConnection *parent) : QObject(parent), - server(parent) { - - connect(this, SIGNAL(displayMsg(Message::Type, QString, QString, QString, quint8)), - server, SIGNAL(displayMsg(Message::Type, QString, QString, QString, quint8))); + server(parent), + defaultHandler(-1), + initDone(false) +{ + connect(this, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)), + server, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8))); connect(this, SIGNAL(putCmd(QString, QStringList, QString)), server, SLOT(putCmd(QString, QStringList, QString))); @@ -37,41 +39,72 @@ BasicHandler::BasicHandler(Server *parent) server, SLOT(putRawLine(QString))); } -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); } // ==================== // protected: // ==================== -NetworkInfo *BasicHandler::networkInfo() const { - return server->networkInfo(); +Network *BasicHandler::network() const { + return server->network(); +} + +BufferInfo::Type BasicHandler::typeByTarget(const QString &target) const { + if(target.isEmpty()) + return BufferInfo::StatusBuffer; + + if(network()->isChannelName(target)) + return BufferInfo::ChannelBuffer; + + return BufferInfo::QueryBuffer; }