Add a timestamp to events
authorManuel Nickschas <sputnick@quassel-irc.org>
Thu, 7 Oct 2010 07:45:33 +0000 (09:45 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 13 Oct 2010 23:06:33 +0000 (01:06 +0200)
This is not set automatically for now, as I'm not sure if it's worth the overhead
of querying the system clock for every event we create.

The timestamp is set on reception of data on the socket (i.e. a bit earlier in the chain
than in the old message handling) and carried over into IrcEvents by the IrcParser.
EventStringifier will carry over the timestamp to MessageEvents.

src/common/event.h
src/common/ircevent.h
src/common/messageevent.cpp
src/common/messageevent.h
src/core/corenetwork.cpp
src/core/eventstringifier.cpp
src/core/ircparser.cpp

index 82cd1ac..4e4abac 100644 (file)
@@ -21,6 +21,7 @@
 #ifndef EVENT_H
 #define EVENT_H
 
+#include <QDateTime>
 #include <QDebug>
 
 #include "eventmanager.h"
@@ -35,12 +36,14 @@ public:
 
   inline void setFlag(EventManager::EventFlag flag) { _flags |= flag; }
   inline void setFlags(EventManager::EventFlags flags) { _flags = flags; }
-
   inline EventManager::EventFlags flags() const { return _flags; }
 
   inline void stop() { setFlag(EventManager::Stopped); }
   inline bool isStopped() { return _flags.testFlag(EventManager::Stopped); }
 
+  inline void setTimestamp(const QDateTime &time) { _timestamp = time; }
+  inline QDateTime timestamp() const { return _timestamp; }
+
   //inline void setData(const QVariant &data) { _data = data; }
   //inline QVariant data() const { return _data; }
 
@@ -51,6 +54,7 @@ protected:
 private:
   EventManager::EventType _type;
   EventManager::EventFlags _flags;
+  QDateTime _timestamp;
   //QVariant _data;
 
   friend QDebug operator<<(QDebug dbg, Event *e);
index e8e21ac..18e4402 100644 (file)
@@ -85,10 +85,14 @@ private:
 
 class IrcEventRawMessage : public IrcEvent {
 public:
-  explicit IrcEventRawMessage(EventManager::EventType type, Network *network, const QString &prefix, const QString &target, const QByteArray &rawMessage)
+  explicit inline IrcEventRawMessage(EventManager::EventType type, Network *network,
+                                     const QByteArray &rawMessage, const QString &prefix, const QString &target,
+                                     const QDateTime &timestamp = QDateTime())
     : IrcEvent(type, network, prefix, QStringList() << target),
       _rawMessage(rawMessage)
-  {}
+  {
+    setTimestamp(timestamp);
+  }
 
   inline QString target() const { return params().at(0); }
   inline void setTarget(const QString &target) { setParams(QStringList() << target); }
index 83afcac..70857d8 100644 (file)
@@ -21,7 +21,8 @@
 #include "messageevent.h"
 
 
-MessageEvent::MessageEvent(Message::Type msgType, Network *net, const QString &msg, const QString &sender, const QString &target, Message::Flags flags)
+MessageEvent::MessageEvent(Message::Type msgType, Network *net, const QString &msg, const QString &sender, const QString &target,
+                           Message::Flags flags, const QDateTime &timestamp)
     : NetworkEvent(EventManager::MessageEvent, net),
       _msgType(msgType),
       _text(msg),
@@ -39,6 +40,8 @@ MessageEvent::MessageEvent(Message::Type msgType, Network *net, const QString &m
   }
 
   _bufferType = bufferTypeByTarget(_target);
+
+  setTimestamp(timestamp);
 }
 
 BufferInfo::Type MessageEvent::bufferTypeByTarget(const QString &target) const {
index 6938db7..f2bc6d1 100644 (file)
@@ -35,7 +35,8 @@ public:
                         const QString &msg,
                         const QString &sender = QString(),
                         const QString &target = QString(),
-                        Message::Flags msgFlags = Message::None
+                        Message::Flags msgFlags = Message::None,
+                        const QDateTime &timestamp = QDateTime()
                         );
 
   inline Message::Type msgType() const { return _msgType; }
index 05da413..42b090f 100644 (file)
@@ -329,7 +329,13 @@ void CoreNetwork::socketHasData() {
     QByteArray s = socket.readLine().trimmed();
     ircServerHandler()->handleServerMsg(s); // FIXME remove with events
 
-    coreSession()->eventManager()->sendEvent(new NetworkDataEvent(EventManager::NetworkIncoming, this, s));
+    NetworkDataEvent *event = new NetworkDataEvent(EventManager::NetworkIncoming, this, s);
+#if QT_VERSION >= 0x040700
+    event->setTimestamp(QDateTime::currentDateTimeUtc());
+#else
+    event->setTimestamp(QDateTime::currentDateTime().toUTC());
+#endif
+    coreSession()->eventManager()->sendEvent(event);
   }
 }
 
index c29a457..c5b2f44 100644 (file)
@@ -42,6 +42,7 @@ void EventStringifier::displayMsg(NetworkEvent *event, Message::Type msgType, co
 MessageEvent *EventStringifier::createMessageEvent(NetworkEvent *event, Message::Type msgType, const QString &msg, const QString &sender,
                         const QString &target, Message::Flags msgFlags) {
   MessageEvent *msgEvent = new MessageEvent(msgType, event->network(), msg, sender, target, msgFlags);
+  msgEvent->setTimestamp(event->timestamp());
   return msgEvent;
 }
 
index 34e693d..2a06811 100644 (file)
@@ -174,7 +174,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) {
 
         msg = decrypt(net, target, msg);
 
-        events << new IrcEventRawMessage(EventManager::IrcEventRawPrivmsg, net, prefix, target, msg);
+        events << new IrcEventRawMessage(EventManager::IrcEventRawPrivmsg, net, msg, prefix, target, e->timestamp());
         //events << new MessageEvent(Message::Plain, net, net->channelDecode(target, msg), target, prefix);
       }
     }
@@ -200,7 +200,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) {
             CoreIrcChannel *chan = static_cast<CoreIrcChannel *>(net->ircChannel(channelname)); // we only have CoreIrcChannels in the core, so this cast is safe
             if(chan && !chan->receivedWelcomeMsg()) {
               chan->setReceivedWelcomeMsg();
-              events << new MessageEvent(Message::Notice, net, decMsg, channelname, prefix);
+              events << new MessageEvent(Message::Notice, net, decMsg, prefix, channelname, Message::None, e->timestamp());
               continue;
             }
           }
@@ -214,7 +214,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) {
           if(!net->isChannelName(target))
             target = nickFromMask(prefix);
         }
-        events << new IrcEventRawMessage(EventManager::IrcEventRawNotice, net, prefix, target, msg);
+        events << new IrcEventRawMessage(EventManager::IrcEventRawNotice, net, msg, prefix, target, e->timestamp());
       }
     }
     break;
@@ -290,6 +290,7 @@ void IrcParser::processNetworkIncoming(NetworkDataEvent *e) {
     else
       event = new IrcEvent(type, net, prefix);
     event->setParams(decParams);
+    event->setTimestamp(e->timestamp());
     events << event;
   }