Allow the core to use expired certificates.
[quassel.git] / src / common / event.cpp
index 826af7c..19b56a7 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2010 by the Quassel Project                        *
+ *   Copyright (C) 2005-2012 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
-#include "event.h"
+#include "ctcpevent.h"
+#include "ircevent.h"
+#include "networkevent.h"
+#include "messageevent.h"
+
+Event::Event(EventManager::EventType type)
+  : _type(type)
+  , _valid(true)
+{
+
+}
+
+
+Event::Event(EventManager::EventType type, QVariantMap &map)
+  : _type(type)
+  , _valid(true)
+{
+  if(!map.contains("flags") || !map.contains("timestamp")) {
+    qWarning() << "Received invalid serialized event:" << map;
+    setValid(false);
+    return;
+  }
+
+  setFlags(static_cast<EventManager::EventFlags>(map.take("flags").toInt())); // TODO sanity check?
+  setTimestamp(QDateTime::fromTime_t(map.take("timestamp").toUInt()));
+}
+
+
+void Event::toVariantMap(QVariantMap &map) const {
+  map["type"] = static_cast<int>(type());
+  map["flags"] = static_cast<int>(flags());
+  map["timestamp"] = timestamp().toTime_t();
+}
+
+
+QVariantMap Event::toVariantMap() const {
+  QVariantMap map;
+  toVariantMap(map);
+  return map;
+}
+
+
+Event *Event::fromVariantMap(QVariantMap &map, Network *network) {
+  int inttype = map.take("type").toInt();
+  // sanity check if we have a valid enum value
+  if(EventManager::enumName(inttype).isEmpty()) {
+    qWarning() << "Received a serialized event with unknown type" << inttype;
+    return 0;
+  }
+
+  EventManager::EventType type = static_cast<EventManager::EventType>(inttype);
+  if(type == EventManager::Invalid || type == EventManager::GenericEvent)
+    return 0;
+
+  EventManager::EventType group = static_cast<EventManager::EventType>(type & EventManager::EventGroupMask);
+
+  Event *e = 0;
+
+  // we use static create() functions to keep group-specific special cases in the files they belong
+  // e.g. IrcEventRawMessage
+  switch(group) {
+  case EventManager::NetworkEvent:
+    e = NetworkEvent::create(type, map, network);
+    break;
+  case EventManager::IrcServerEvent:
+    // not in use!
+    break;
+  case EventManager::IrcEvent:
+    e = IrcEvent::create(type, map, network);
+    break;
+  case EventManager::MessageEvent:
+    e = MessageEvent::create(type, map, network);
+    break;
+  case EventManager::CtcpEvent:
+    e = CtcpEvent::create(type, map, network);
+    break;
+  default:
+    break;
+  }
+
+  if(!e) {
+    qWarning() << "Can't create event of type" << type;
+    return 0;
+  }
+
+  if(!map.isEmpty()) {
+    qWarning() << "Event creation from map did not consume all data:" << map;
+  }
+
+  return e;
+}
+
+
+QDebug operator<<(QDebug dbg, Event *e) {
+  dbg.nospace() << qPrintable(e->className()) << "("
+                << "type = 0x" << qPrintable(QString::number(e->type(), 16));
+  e->debugInfo(dbg);
+                //<< ", data = " << e->data(); // we don't use data anywhere yet
+  dbg.nospace() << ", flags = 0x" << qPrintable(QString::number(e->flags(), 16))
+                << ")";
+  return dbg.space();
+}
+