From 36df8345e41bde95de170cd105d5d2ba1459a1b3 Mon Sep 17 00:00:00 2001
From: Dennis Beier <nanovim@gmail.com>
Date: Sun, 16 Sep 2018 12:41:19 +0200
Subject: [PATCH] implemented subscriper in meteorDDP class

---
 api/messagelistener.h       | 16 ++++++++++++++++
 api/meteorddp.cpp           | 10 ++++++++++
 api/meteorddp.h             |  5 ++++-
 engine.pro                  |  3 ++-
 rocketchatserver.cpp        | 10 ++++++++--
 rocketchatserver.h          |  5 ++++-
 services/messageservice.cpp |  1 -
 7 files changed, 44 insertions(+), 6 deletions(-)
 create mode 100644 api/messagelistener.h

diff --git a/api/messagelistener.h b/api/messagelistener.h
new file mode 100644
index 0000000..7e2fb20
--- /dev/null
+++ b/api/messagelistener.h
@@ -0,0 +1,16 @@
+#ifndef MESSAGELISTENER_H
+#define MESSAGELISTENER_H
+
+#include <QJsonObject>
+#include <QMutexLocker>
+#include <QObject>
+
+
+class MessageListener: public QObject{
+Q_OBJECT
+public:
+    virtual bool handlesMessage(QJsonObject object) = 0;
+};
+
+#endif // MESSAGELISTENER_H
+
diff --git a/api/meteorddp.cpp b/api/meteorddp.cpp
index 56c8f7e..4505a53 100755
--- a/api/meteorddp.cpp
+++ b/api/meteorddp.cpp
@@ -58,6 +58,16 @@ void MeteorDDP::init( const QString &pUri )
     mLastPing = currentTime;
 }
 
+void MeteorDDP::registerMessageHandler(MessageListener &listener)
+{
+    connect(this, &MeteorDDP::messageReceived , &listener, &MessageListener::handlesMessage);
+}
+
+void MeteorDDP::registerMessageHandler(MessageListener *listener)
+{
+    connect(this, &MeteorDDP::messageReceived , listener, &MessageListener::handlesMessage);
+}
+
 void MeteorDDP::connectWithServer()
 {
     QJsonObject msgObj;
diff --git a/api/meteorddp.h b/api/meteorddp.h
index c584a7b..5d22aae 100755
--- a/api/meteorddp.h
+++ b/api/meteorddp.h
@@ -29,6 +29,7 @@
 #include <QtWebSockets/QtWebSockets>
 #include "websocket/websocket.h"
 #include "ddpRequests/ddprequest.h"
+#include "messagelistener.h"
 
 
 /**
@@ -59,7 +60,8 @@ class MeteorDDP : public QObject
         void setUserId( const QString &pUserId );
 
         void init( const QString &pServer );
-
+        void registerMessageHandler(MessageListener &);
+        void registerMessageHandler(MessageListener *);
 
     private:
         QJsonParseError *mError;
@@ -88,6 +90,7 @@ class MeteorDDP : public QObject
         uint mMaxTimeout = 0;
         QSet<QString> mReceivedEvents;
 
+
     signals:
         void websocketConnected();
         void ddpConnected();
diff --git a/engine.pro b/engine.pro
index b9dddf1..2e76b8e 100644
--- a/engine.pro
+++ b/engine.pro
@@ -202,7 +202,8 @@ HEADERS += \
     ddpRequests/rocketchatgetroombyid.h \
     ddpRequests/rocketchatjoinroomrequest.h \
     ddpRequests/rocketchatgetroomidbynameorid.h \
-    ddpRequests/rocketchatspotlightrequest.h
+    ddpRequests/rocketchatspotlightrequest.h \
+    api/messagelistener.h
 
 linux{
 
diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp
index 2372d8a..5dfb32f 100755
--- a/rocketchatserver.cpp
+++ b/rocketchatserver.cpp
@@ -70,7 +70,7 @@ void RocketChatServerData::init()
 
     QMetaObject::invokeMethod( mRestApi, "init" );
 
-    connect( mDdpApi, &MeteorDDP::messageReceived, this, &RocketChatServerData::onDDPMessageReceived, Qt::UniqueConnection );
+    mDdpApi->registerMessageHandler(this);
     connect( mDdpApi, &MeteorDDP::ddpConnected, this, &RocketChatServerData::onDDPConnected, Qt::UniqueConnection );
     connect( mDdpApi, &MeteorDDP::ddpDisconnected, this, &RocketChatServerData::onDDPDisonnected, Qt::UniqueConnection );
 
@@ -95,7 +95,6 @@ void RocketChatServerData::init()
     mChannelService = new RocketChatChannelService( this, mMessageService );
     mChannelService->setDdp( mDdpApi );
     mChannelService->setChannels( mChannels );
-
     connect( mChannelService, &RocketChatChannelService::channelsLoaded, this, &RocketChatServerData::onChannelsLoaded, Qt::UniqueConnection );
     connect( mChannelService, &RocketChatChannelService::usersLoaded, this, &RocketChatServerData::onUsersLoaded, Qt::UniqueConnection );
     connect( mChannelService, &RocketChatChannelService::directChannelReady, this, &RocketChatServerData::switchChannelByName, Qt::UniqueConnection );
@@ -509,6 +508,13 @@ void RocketChatServerData::onUnreadCountChanged()
     emit unreadCountChanged( QStringLiteral( "default" ), number );
 }
 
+bool RocketChatServerData::handlesMessage(QJsonObject message)
+{
+    qDebug() << "RocketChatServerData message handler";
+    onDDPMessageReceived(message);
+    return true;
+}
+
 EmojiRepo *RocketChatServerData::getEmojiRepo() const
 {
     return mEmojiRepo;
diff --git a/rocketchatserver.h b/rocketchatserver.h
index e7a6359..b835cc4 100755
--- a/rocketchatserver.h
+++ b/rocketchatserver.h
@@ -108,7 +108,7 @@ enum class ConnectionState {
     ONLINE
 };
 
-class RocketChatServerData : public QObject
+class RocketChatServerData : public MessageListener
 {
 
         Q_OBJECT
@@ -349,6 +349,9 @@ class RocketChatServerData : public QObject
         void loggingIn();
         void historyReady();
 
+        // MessageListener interface
+public:
+        bool handlesMessage(QJsonObject object);
 };
 
 #endif // ROCKETCHATSERVER_H
diff --git a/services/messageservice.cpp b/services/messageservice.cpp
index d26b06f..510e360 100644
--- a/services/messageservice.cpp
+++ b/services/messageservice.cpp
@@ -170,7 +170,6 @@ QSharedPointer<RocketChatMessage> MessageService::parseMessage( const QJsonObjec
 
         if ( Q_LIKELY( timestampObject.contains( QStringLiteral( "$date" ) ) ) ) {
             timestamp = timestampObject[QStringLiteral( "$date" )].toDouble();
-
         }
 
         QDateTime date = QDateTime::fromMSecsSinceEpoch( timestamp );
-- 
GitLab