From: Sebastian Goth Date: Sun, 31 Jan 2010 18:05:16 +0000 (+0100) Subject: Refactoring of BasicHandler X-Git-Tag: 0.6-beta1~59 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=513c0edce6f4c69f16e6a00c144877e8d5940096 Refactoring of BasicHandler - BasicHandler moved from core/ to common/ We can use that in the client too (ClientInuptHandler etc.) - core/BasicHandler is now CoreBasicHandler --- diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index f8337cb8..30eed022 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -7,6 +7,7 @@ include(${QT_USE_FILE}) set(SOURCES aliasmanager.cpp backlogmanager.cpp + basichandler.cpp bufferinfo.cpp buffersyncer.cpp bufferviewconfig.cpp @@ -37,6 +38,7 @@ endif(CMAKE_HOST_UNIX) set(MOC_HDRS aliasmanager.h backlogmanager.h + basichandler.h buffersyncer.h bufferviewconfig.h bufferviewmanager.h diff --git a/src/common/basichandler.cpp b/src/common/basichandler.cpp new file mode 100644 index 00000000..59fba8a2 --- /dev/null +++ b/src/common/basichandler.cpp @@ -0,0 +1,84 @@ +/*************************************************************************** + * Copyright (C) 2005-10 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) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "basichandler.h" + +#include + +#include "logger.h" + +BasicHandler::BasicHandler(QObject *parent) + : QObject(parent), + defaultHandler(-1), + initDone(false) +{ +} + +QStringList BasicHandler::providesHandlers() { + return handlerHash().keys(); +} + +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 _handlerHash; +} + +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(); + + 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); +} diff --git a/src/common/basichandler.h b/src/common/basichandler.h new file mode 100644 index 00000000..5bfafe96 --- /dev/null +++ b/src/common/basichandler.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2005-10 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) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef BASICHANDLER_H +#define BASICHANDLER_H + +#include +#include +#include +#include +#include + +class BasicHandler : public QObject { + Q_OBJECT + +public: + BasicHandler(QObject *parent = 0); + + QStringList providesHandlers(); + +protected: + virtual void handle(const QString &member, QGenericArgument val0 = QGenericArgument(0), + QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), + QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), + QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), + QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument()); + +private: + const QHash &handlerHash(); + QHash _handlerHash; + int defaultHandler; + bool initDone; +}; +#endif diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index ccf5aec0..3b7e24e6 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -8,11 +8,11 @@ include(${QT_USE_FILE}) set(SOURCES abstractsqlstorage.cpp - basichandler.cpp core.cpp corealiasmanager.cpp coreapplication.cpp corebacklogmanager.cpp + corebasichandler.cpp corebuffersyncer.cpp corebufferviewconfig.cpp corebufferviewmanager.cpp @@ -37,11 +37,11 @@ set(SOURCES set(MOC_HDRS abstractsqlstorage.h - basichandler.h core.h corealiasmanager.h coreapplication.h corebacklogmanager.h + corebasichandler.h corebuffersyncer.h corebufferviewconfig.h corebufferviewmanager.h diff --git a/src/core/basichandler.cpp b/src/core/corebasichandler.cpp similarity index 51% rename from src/core/basichandler.cpp rename to src/core/corebasichandler.cpp index a053b522..d15a594f 100644 --- a/src/core/basichandler.cpp +++ b/src/core/corebasichandler.cpp @@ -17,107 +17,50 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "basichandler.h" - -#include +#include "corebasichandler.h" #include "util.h" #include "logger.h" -BasicHandler::BasicHandler(CoreNetwork *parent) - : QObject(parent), - defaultHandler(-1), - _network(parent), - initDone(false) +CoreBasicHandler::CoreBasicHandler(CoreNetwork *parent) + : BasicHandler(parent), + _network(parent) { connect(this, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, const QString &, const QString &, const QString &, Message::Flags)), network(), SLOT(displayMsg(Message::Type, BufferInfo::Type, const QString &, const QString &, const QString &, Message::Flags))); connect(this, SIGNAL(putCmd(QString, const QList &, const QByteArray &)), - network(), SLOT(putCmd(QString, const QList &, const QByteArray &))); + network(), SLOT(putCmd(QString, const QList &, const QByteArray &))); connect(this, SIGNAL(putRawLine(const QByteArray &)), network(), SLOT(putRawLine(const QByteArray &))); } -QStringList BasicHandler::providesHandlers() { - return handlerHash().keys(); -} - -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 _handlerHash; -} - -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(); - - 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) { +QString CoreBasicHandler::serverDecode(const QByteArray &string) { return network()->serverDecode(string); } -QStringList BasicHandler::serverDecode(const QList &stringlist) { +QStringList CoreBasicHandler::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) { +QString CoreBasicHandler::channelDecode(const QString &bufferName, const QByteArray &string) { return network()->channelDecode(bufferName, string); } -QStringList BasicHandler::channelDecode(const QString &bufferName, const QList &stringlist) { +QStringList CoreBasicHandler::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) { +QString CoreBasicHandler::userDecode(const QString &userNick, const QByteArray &string) { return network()->userDecode(userNick, string); } -QStringList BasicHandler::userDecode(const QString &userNick, const QList &stringlist) { +QStringList CoreBasicHandler::userDecode(const QString &userNick, const QList &stringlist) { QStringList list; foreach(QByteArray s, stringlist) list << network()->userDecode(userNick, s); return list; @@ -125,31 +68,31 @@ QStringList BasicHandler::userDecode(const QString &userNick, const QListserverEncode(string); } -QList BasicHandler::serverEncode(const QStringList &stringlist) { +QList CoreBasicHandler::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) { +QByteArray CoreBasicHandler::channelEncode(const QString &bufferName, const QString &string) { return network()->channelEncode(bufferName, string); } -QList BasicHandler::channelEncode(const QString &bufferName, const QStringList &stringlist) { +QList CoreBasicHandler::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) { +QByteArray CoreBasicHandler::userEncode(const QString &userNick, const QString &string) { return network()->userEncode(userNick, string); } -QList BasicHandler::userEncode(const QString &userNick, const QStringList &stringlist) { +QList CoreBasicHandler::userEncode(const QString &userNick, const QStringList &stringlist) { QList list; foreach(QString s, stringlist) list << network()->userEncode(userNick, s); return list; @@ -158,7 +101,7 @@ QList BasicHandler::userEncode(const QString &userNick, const QStrin // ==================== // protected: // ==================== -BufferInfo::Type BasicHandler::typeByTarget(const QString &target) const { +BufferInfo::Type CoreBasicHandler::typeByTarget(const QString &target) const { if(target.isEmpty()) return BufferInfo::StatusBuffer; @@ -168,13 +111,13 @@ BufferInfo::Type BasicHandler::typeByTarget(const QString &target) const { return BufferInfo::QueryBuffer; } -void BasicHandler::putCmd(const QString &cmd, const QByteArray ¶m, const QByteArray &prefix) { +void CoreBasicHandler::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, const QString &text, const QString &sender, Message::Flags flags) { +void CoreBasicHandler::displayMsg(Message::Type msgType, QString target, const QString &text, const QString &sender, Message::Flags flags) { if(!target.isEmpty() && network()->prefixes().contains(target[0])) target = target.mid(1); diff --git a/src/core/basichandler.h b/src/core/corebasichandler.h similarity index 77% rename from src/core/basichandler.h rename to src/core/corebasichandler.h index ad954b58..d04beed2 100644 --- a/src/core/basichandler.h +++ b/src/core/corebasichandler.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-10 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,28 +18,24 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef BASICHANDLER_H_ -#define BASICHANDLER_H_ +#ifndef COREBASICHANDLER_H +#define COREBASICHANDLER_H -#include #include #include -#include -#include +#include "basichandler.h" #include "message.h" #include "corenetwork.h" class CoreSession; -class BasicHandler : public QObject { +class CoreBasicHandler : public BasicHandler { Q_OBJECT public: - BasicHandler(CoreNetwork *parent = 0); - - QStringList providesHandlers(); + CoreBasicHandler(CoreNetwork *parent = 0); QString serverDecode(const QByteArray &string); QStringList serverDecode(const QList &stringlist); @@ -64,23 +60,12 @@ protected: void displayMsg(Message::Type, QString target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None); void putCmd(const QString &cmd, const QByteArray ¶m, const QByteArray &prefix = QByteArray()); - virtual void handle(const QString &member, QGenericArgument val0 = QGenericArgument(0), - QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), - QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), - QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), - QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument()); - - inline CoreNetwork *network() const { return _network; } inline CoreSession *coreSession() const { return _network->coreSession(); } BufferInfo::Type typeByTarget(const QString &target) const; private: - const QHash &handlerHash(); - QHash _handlerHash; - int defaultHandler; CoreNetwork *_network; - bool initDone; }; #endif diff --git a/src/core/coreuserinputhandler.cpp b/src/core/coreuserinputhandler.cpp index b7f1cc02..5764605a 100644 --- a/src/core/coreuserinputhandler.cpp +++ b/src/core/coreuserinputhandler.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-10 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -29,7 +29,7 @@ #include CoreUserInputHandler::CoreUserInputHandler(CoreNetwork *parent) - : BasicHandler(parent) + : CoreBasicHandler(parent) { } diff --git a/src/core/coreuserinputhandler.h b/src/core/coreuserinputhandler.h index 0634fa15..40490bea 100644 --- a/src/core/coreuserinputhandler.h +++ b/src/core/coreuserinputhandler.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-10 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -21,11 +21,11 @@ #ifndef COREUSERINPUTHANDLER_H #define COREUSERINPUTHANDLER_H -#include "basichandler.h" +#include "corebasichandler.h" class Server; -class CoreUserInputHandler : public BasicHandler { +class CoreUserInputHandler : public CoreBasicHandler { Q_OBJECT public: diff --git a/src/core/ctcphandler.cpp b/src/core/ctcphandler.cpp index 8b17de19..aab7cd17 100644 --- a/src/core/ctcphandler.cpp +++ b/src/core/ctcphandler.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-10 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -26,7 +26,7 @@ #include "coreignorelistmanager.h" CtcpHandler::CtcpHandler(CoreNetwork *parent) - : BasicHandler(parent), + : CoreBasicHandler(parent), XDELIM("\001"), _ignoreListManager(parent->ignoreListManager()) { diff --git a/src/core/ctcphandler.h b/src/core/ctcphandler.h index 35847c1f..e44321bd 100644 --- a/src/core/ctcphandler.h +++ b/src/core/ctcphandler.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-10 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -24,11 +24,11 @@ #include #include -#include "basichandler.h" +#include "corebasichandler.h" class CoreListIgnoreListManager; -class CtcpHandler : public BasicHandler { +class CtcpHandler : public CoreBasicHandler { Q_OBJECT public: diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 33445c2d..30f5e2ad 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-10 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -33,7 +33,7 @@ #include IrcServerHandler::IrcServerHandler(CoreNetwork *parent) - : BasicHandler(parent), + : CoreBasicHandler(parent), _whois(false) { connect(parent, SIGNAL(disconnected(NetworkId)), this, SLOT(destroyNetsplits())); diff --git a/src/core/ircserverhandler.h b/src/core/ircserverhandler.h index 4ad28dea..86eaff23 100644 --- a/src/core/ircserverhandler.h +++ b/src/core/ircserverhandler.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-10 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -21,10 +21,10 @@ #ifndef IRCSERVERHANDLER_H #define IRCSERVERHANDLER_H -#include "basichandler.h" +#include "corebasichandler.h" #include "netsplit.h" -class IrcServerHandler : public BasicHandler { +class IrcServerHandler : public CoreBasicHandler { Q_OBJECT public: