Quassel IRC  Pre-Release
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
eventmanager.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2005-2015 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 #ifndef EVENTMANAGER_H
22 #define EVENTMANAGER_H
23 
24 #include <QMetaEnum>
25 
26 #include "types.h"
27 
28 class Event;
29 class Network;
30 
31 class EventManager : public QObject
32 {
33  Q_OBJECT
34  Q_FLAGS(EventFlag EventFlags)
35  Q_ENUMS(EventType)
36 
37 public :
38 
39  enum RegistrationMode {
40  Prepend,
41  Append
42  };
43 
44  enum Priority {
50  };
51 
52  enum EventFlag {
53  Self = 0x01,
54  Fake = 0x08,
55  Netsplit = 0x10,
56  Backlog = 0x20,
57  Silent = 0x40,
58  Stopped = 0x80
59  };
61 
62  /*
63 
64  */
65  /* These values make sense! Don't change without knowing what you do! */
66  enum EventType {
67  Invalid = 0xffffffff,
68  GenericEvent = 0x00000000,
69 
70  // for event group handlers (handleIrcEvent() will handle all IrcEvent* enums)
71  // event groups are specified by bits 20-24
72  EventGroupMask = 0x00ff0000,
73 
74  NetworkEvent = 0x00010000,
75  NetworkConnecting,
76  NetworkInitializing,
77  NetworkInitialized,
78  NetworkReconnecting,
79  NetworkDisconnecting,
80  NetworkDisconnected,
81  NetworkSplitJoin,
82  NetworkSplitQuit,
83  NetworkIncoming,
84 
85  IrcServerEvent = 0x00020000,
86  IrcServerIncoming,
87  IrcServerParseError,
88 
89  IrcEvent = 0x00030000,
90  IrcEventAuthenticate,
91  IrcEventCap,
92  IrcEventInvite,
93  IrcEventJoin,
94  IrcEventKick,
95  IrcEventMode,
96  IrcEventNick,
97  IrcEventNotice,
98  IrcEventPart,
99  IrcEventPing,
100  IrcEventPong,
101  IrcEventPrivmsg,
102  IrcEventQuit,
103  IrcEventTopic,
104  IrcEventWallops,
105  IrcEventRawPrivmsg,
106  IrcEventRawNotice,
107  IrcEventUnknown,
108 
109  IrcEventNumeric = 0x00031000, /* needs 1000 (0x03e8) consecutive free values! */
110  IrcEventNumericMask = 0x00000fff, /* for checking if an event is numeric */
111 
112  MessageEvent = 0x00040000,
113 
114  CtcpEvent = 0x00050000,
115  CtcpEventFlush,
116 
117  KeyEvent = 0x00060000
118  };
119 
120  EventManager(QObject *parent = 0);
121 
122  static EventType eventTypeByName(const QString &name);
123  static EventType eventGroupByName(const QString &name);
124  static QString enumName(EventType type);
125  static QString enumName(int type); // for sanity tests
126 
127  Event *createEvent(const QVariantMap &map);
128 
129 public slots:
130  void registerObject(QObject *object, Priority priority = NormalPriority,
131  const QString &methodPrefix = "process",
132  const QString &filterPrefix = "filter");
133  void registerEventHandler(EventType event, QObject *object, const char *slot,
134  Priority priority = NormalPriority, bool isFilter = false);
135  void registerEventHandler(QList<EventType> events, QObject *object, const char *slot,
136  Priority priority = NormalPriority, bool isFilter = false);
137 
138  void registerEventFilter(EventType event, QObject *object, const char *slot);
139  void registerEventFilter(QList<EventType> events, QObject *object, const char *slot);
140 
142 
146  void postEvent(Event *event);
147 
148 protected:
149  virtual Network *networkById(NetworkId id) const = 0;
150  virtual void customEvent(QEvent *event);
151 
152 private:
153  struct Handler {
154  QObject *object;
157 
158  explicit Handler(QObject *obj = 0, int method = 0, Priority prio = NormalPriority)
159  {
160  object = obj;
161  methodIndex = method;
162  priority = prio;
163  }
164  };
165 
166  typedef QHash<uint, QList<Handler> > HandlerHash;
167 
168  inline const HandlerHash &registeredHandlers() const { return _registeredHandlers; }
170 
171  inline const HandlerHash &registeredFilters() const { return _registeredFilters; }
173 
175  void insertHandlers(const QList<Handler> &newHandlers, QList<Handler> &existing, bool checkDupes = false);
177  void insertFilters(const QList<Handler> &newFilters, QHash<QObject *, Handler> &existing);
178 
179  int findEventType(const QString &methodSignature, const QString &methodPrefix) const;
180 
181  void processEvent(Event *event);
182  void dispatchEvent(Event *event);
183 
185  static QMetaEnum eventEnum();
186 
189  QList<Event *> _eventQueue;
190  static QMetaEnum _enum;
191 };
192 
193 
194 Q_DECLARE_OPERATORS_FOR_FLAGS(EventManager::EventFlags);
195 
196 #endif