protocol: Implement 64-bit message timestamps
[quassel.git] / src / common / message.cpp
index a0e480a..34990c6 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2016 by the Quassel Project                        *
+ *   Copyright (C) 2005-2018 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -21,8 +21,8 @@
 #include "message.h"
 
 #include "util.h"
-#include "signalproxy.h"
 #include "peer.h"
+#include "signalproxy.h"
 
 #include <QDataStream>
 
@@ -52,15 +52,24 @@ Message::Message(const QDateTime &ts, const BufferInfo &bufferInfo, Type type, c
 
 QDataStream &operator<<(QDataStream &out, const Message &msg)
 {
+    Q_ASSERT(SignalProxy::current());
+    Q_ASSERT(SignalProxy::current()->targetPeer());
+
     // We do not serialize the sender prefixes until we have a new protocol or client-features implemented
-    out << msg.msgId()
-        << (quint32) msg.timestamp().toTime_t()
-        << (quint32) msg.type()
+    out << msg.msgId();
+
+    if (SignalProxy::current()->targetPeer()->hasFeature(Quassel::Feature::LongMessageTime)) {
+        out << (quint64) msg.timestamp().toMSecsSinceEpoch();
+    } else {
+        out << (quint32) msg.timestamp().toTime_t();
+    }
+
+    out << (quint32) msg.type()
         << (quint8) msg.flags()
         << msg.bufferInfo()
         << msg.sender().toUtf8();
 
-    if (SignalProxy::current()->targetPeer()->features().testFlag(Quassel::Feature::SenderPrefixes))
+    if (SignalProxy::current()->targetPeer()->hasFeature(Quassel::Feature::SenderPrefixes))
         out << msg.senderPrefixes().toUtf8();
 
     out << msg.contents().toUtf8();
@@ -70,11 +79,20 @@ QDataStream &operator<<(QDataStream &out, const Message &msg)
 
 QDataStream &operator>>(QDataStream &in, Message &msg)
 {
+    Q_ASSERT(SignalProxy::current());
+    Q_ASSERT(SignalProxy::current()->sourcePeer());
+
     in >> msg._msgId;
 
-    quint32 timeStamp;
-    in >> timeStamp;
-    msg._timestamp = QDateTime::fromTime_t(timeStamp);
+    if (SignalProxy::current()->sourcePeer()->hasFeature(Quassel::Feature::LongMessageTime)) {
+        quint64 timeStamp;
+        in >> timeStamp;
+        msg._timestamp = QDateTime::fromMSecsSinceEpoch(timeStamp);
+    } else {
+        quint32 timeStamp;
+        in >> timeStamp;
+        msg._timestamp = QDateTime::fromTime_t(timeStamp);
+    }
 
     quint32 type;
     in >> type;
@@ -91,7 +109,7 @@ QDataStream &operator>>(QDataStream &in, Message &msg)
     msg._sender = QString::fromUtf8(sender);
 
     QByteArray senderPrefixes;
-    if (SignalProxy::current()->sourcePeer()->features().testFlag(Quassel::Feature::SenderPrefixes))
+    if (SignalProxy::current()->sourcePeer()->hasFeature(Quassel::Feature::SenderPrefixes))
         in >> senderPrefixes;
     msg._senderPrefixes = QString::fromUtf8(senderPrefixes);