1 | /*************************************************************************** |
2 | * Copyright (C) 2005-2014 by the Quassel Project * |
3 | * devel@quassel-irc.org * |
4 | * * |
5 | * This program is free software; you can redistribute it and/or modify * |
6 | * it under the terms of the GNU General Public License as published by * |
7 | * the Free Software Foundation; either version 2 of the License, or * |
8 | * (at your option) version 3. * |
9 | * * |
10 | * This program is distributed in the hope that it will be useful, * |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
13 | * GNU General Public License for more details. * |
14 | * * |
15 | * You should have received a copy of the GNU General Public License * |
16 | * along with this program; if not, write to the * |
17 | * Free Software Foundation, Inc., * |
18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * |
19 | ***************************************************************************/ |
20 | |
21 | #include "basichandler.h" |
22 | |
23 | #include <QMetaMethod> |
24 | |
25 | #include "logger.h" |
26 | |
27 | BasicHandler::BasicHandler(QObject *parent) |
28 | : QObject(parent), |
29 | _defaultHandler(-1), |
30 | _initDone(false), |
31 | _methodPrefix("handle" ) |
32 | { |
33 | } |
34 | |
35 | |
36 | BasicHandler::BasicHandler(const QString &methodPrefix, QObject *parent) |
37 | : QObject(parent), |
38 | _defaultHandler(-1), |
39 | _initDone(false), |
40 | _methodPrefix(methodPrefix) |
41 | { |
42 | } |
43 | |
44 | |
45 | QStringList BasicHandler::providesHandlers() |
46 | { |
47 | return handlerHash().keys(); |
48 | } |
49 | |
50 | |
51 | const QHash<QString, int> &BasicHandler::handlerHash() |
52 | { |
53 | if (!_initDone) { |
54 | for (int i = metaObject()->methodOffset(); i < metaObject()->methodCount(); i++) { |
55 | #if QT_VERSION >= 0x050000 |
56 | QString methodSignature = metaObject()->method(i).methodSignature(); |
57 | #else |
58 | QString methodSignature = metaObject()->method(i).signature(); |
59 | #endif |
60 | if (methodSignature.startsWith("defaultHandler" )) { |
61 | _defaultHandler = i; |
62 | continue; |
63 | } |
64 | |
65 | if (!methodSignature.startsWith(_methodPrefix)) |
66 | continue; |
67 | |
68 | methodSignature = methodSignature.section('(', 0, 0); // chop the attribute list |
69 | methodSignature = methodSignature.mid(_methodPrefix.length()); // strip "handle" or whatever the prefix is |
70 | _handlerHash[methodSignature] = i; |
71 | } |
72 | _initDone = true; |
73 | } |
74 | return _handlerHash; |
75 | } |
76 | |
77 | |
78 | void BasicHandler::handle(const QString &member, QGenericArgument val0, |
79 | QGenericArgument val1, QGenericArgument val2, |
80 | QGenericArgument val3, QGenericArgument val4, |
81 | QGenericArgument val5, QGenericArgument val6, |
82 | QGenericArgument val7, QGenericArgument val8) |
83 | { |
84 | // Now we try to find a handler for this message. BTW, I do love the Trolltech guys ;-) |
85 | // and now we even have a fast lookup! Thanks thiago! |
86 | |
87 | QString handler = member.toLower(); |
88 | handler[0] = handler[0].toUpper(); |
89 | |
90 | if (!handlerHash().contains(handler)) { |
91 | if (_defaultHandler == -1) { |
92 | qWarning() << QString("No such Handler: %1::%2%3" ).arg(metaObject()->className(), _methodPrefix, handler); |
93 | return; |
94 | } |
95 | else { |
96 | void *param[] = { 0, Q_ARG(QString, member).data(), val0.data(), val1.data(), val2.data(), val3.data(), val4.data(), |
97 | val5.data(), val6.data(), val7.data(), val8.data(), val8.data() }; |
98 | qt_metacall(QMetaObject::InvokeMetaMethod, _defaultHandler, param); |
99 | return; |
100 | } |
101 | } |
102 | |
103 | void *param[] = { 0, val0.data(), val1.data(), val2.data(), val3.data(), val4.data(), |
104 | val5.data(), val6.data(), val7.data(), val8.data(), val8.data(), 0 }; |
105 | qt_metacall(QMetaObject::InvokeMetaMethod, handlerHash()[handler], param); |
106 | } |
107 | |