X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fevent.cpp;h=2306adc97f7a9c66ab451342236c62631e41ce9f;hp=01d9642623574bf3e9963e76afac259b102c62e2;hb=921e54680da16fcf2adb7a90506875aceb6633a4;hpb=80cd03dc284fecbac2b7db1ede215f82023b72d9 diff --git a/src/common/event.cpp b/src/common/event.cpp index 01d96426..2306adc9 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2010 by the Quassel Project * + * Copyright (C) 2005-2015 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,24 +15,111 @@ * 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. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#include "event.h" +#include "ctcpevent.h" +#include "ircevent.h" +#include "networkevent.h" +#include "messageevent.h" Event::Event(EventManager::EventType type) - : _type(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(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(type()); + map["flags"] = static_cast(flags()); + map["timestamp"] = timestamp().toTime_t(); +} + + +QVariantMap Event::toVariantMap() const +{ + QVariantMap map; + toVariantMap(map); + return map; } -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(); + +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(inttype); + if (type == EventManager::Invalid || type == EventManager::GenericEvent) + return 0; + + EventManager::EventType group = static_cast(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(); +}