Quassel IRC  Pre-Release
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
event.cpp
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 #include "ctcpevent.h"
22 #include "ircevent.h"
23 #include "networkevent.h"
24 #include "messageevent.h"
25 
26 Event::Event(EventManager::EventType type)
27  : _type(type)
28  , _valid(true)
29 {
30 }
31 
32 
33 Event::Event(EventManager::EventType type, QVariantMap &map)
34  : _type(type)
35  , _valid(true)
36 {
37  if (!map.contains("flags") || !map.contains("timestamp")) {
38  qWarning() << "Received invalid serialized event:" << map;
39  setValid(false);
40  return;
41  }
42 
43  setFlags(static_cast<EventManager::EventFlags>(map.take("flags").toInt())); // TODO sanity check?
44  setTimestamp(QDateTime::fromTime_t(map.take("timestamp").toUInt()));
45 }
46 
47 
48 void Event::toVariantMap(QVariantMap &map) const
49 {
50  map["type"] = static_cast<int>(type());
51  map["flags"] = static_cast<int>(flags());
52  map["timestamp"] = timestamp().toTime_t();
53 }
54 
55 
56 QVariantMap Event::toVariantMap() const
57 {
58  QVariantMap map;
59  toVariantMap(map);
60  return map;
61 }
62 
63 
64 Event *Event::fromVariantMap(QVariantMap &map, Network *network)
65 {
66  int inttype = map.take("type").toInt();
67  // sanity check if we have a valid enum value
68  if (EventManager::enumName(inttype).isEmpty()) {
69  qWarning() << "Received a serialized event with unknown type" << inttype;
70  return 0;
71  }
72 
73  EventManager::EventType type = static_cast<EventManager::EventType>(inttype);
74  if (type == EventManager::Invalid || type == EventManager::GenericEvent)
75  return 0;
76 
77  EventManager::EventType group = static_cast<EventManager::EventType>(type & EventManager::EventGroupMask);
78 
79  Event *e = 0;
80 
81  // we use static create() functions to keep group-specific special cases in the files they belong
82  // e.g. IrcEventRawMessage
83  switch (group) {
84  case EventManager::NetworkEvent:
85  e = NetworkEvent::create(type, map, network);
86  break;
87  case EventManager::IrcServerEvent:
88  // not in use!
89  break;
90  case EventManager::IrcEvent:
91  e = IrcEvent::create(type, map, network);
92  break;
93  case EventManager::MessageEvent:
94  e = MessageEvent::create(type, map, network);
95  break;
96  case EventManager::CtcpEvent:
97  e = CtcpEvent::create(type, map, network);
98  break;
99  default:
100  break;
101  }
102 
103  if (!e) {
104  qWarning() << "Can't create event of type" << type;
105  return 0;
106  }
107 
108  if (!map.isEmpty()) {
109  qWarning() << "Event creation from map did not consume all data:" << map;
110  }
111 
112  return e;
113 }
114 
115 
116 QDebug operator<<(QDebug dbg, Event *e)
117 {
118  dbg.nospace() << qPrintable(e->className()) << "("
119  << "type = 0x" << qPrintable(QString::number(e->type(), 16));
120  e->debugInfo(dbg);
121  //<< ", data = " << e->data(); // we don't use data anywhere yet
122  dbg.nospace() << ", flags = 0x" << qPrintable(QString::number(e->flags(), 16))
123  << ")";
124  return dbg.space();
125 }