ImagingTools Core SDK
CSubscriptionManagerComp.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QTimer>
7#include <QtCore/QMutex>
8#include <QReadWriteLock>
9
10// ACF includes
11#include <ilog/TLoggerCompWrap.h>
12#include <imod/IModel.h>
13#include <imod/CSingleModelObserverBase.h>
14
15// ImtCore includes
16#include <imtcom/IConnectionStatusProvider.h>
17#include <imtrest/ITransport.h>
18#include <imtrest/IResponseDispatcher.h>
19#include <imtrest/IRequestServlet.h>
20#include <imtrest/IProtocolEngine.h>
21#include <imtgql/CGqlRequest.h>
22#include <imtclientgql/IGqlClient.h>
23#include <imtclientgql/IGqlSubscriptionManager.h>
24
25
26namespace imtclientgql
27{
28
29
30class CSubscriptionManagerComp:
31 public QObject,
32 public ilog::CLoggerComponentBase,
33 public imod::CSingleModelObserverBase,
34 virtual public IGqlSubscriptionManager,
35 virtual public imtrest::IRequestServlet,
36 virtual public IGqlClient
37{
38 Q_OBJECT
39public:
40 typedef ilog::CLoggerComponentBase BaseClass;
41
42 I_BEGIN_COMPONENT(CSubscriptionManagerComp);
43 I_REGISTER_INTERFACE(IGqlSubscriptionManager);
44 I_REGISTER_INTERFACE(IGqlClient);
45 I_REGISTER_INTERFACE(imtrest::IRequestServlet);
46 I_ASSIGN(m_subscriptionSenderCompPtr, "SubscriptionSender", "Subscription sender", false, "SubscriptionSender");
47 I_ASSIGN(m_requestManagerCompPtr, "RequestManager", "Response dispatcher for sending a request", false, "RequestManager");
48 I_ASSIGN(m_engineCompPtr, "ProtocolEngine", "Protocol engine for subscription", true, "ProtocolEngine");
49 I_ASSIGN(m_connectionStatusProviderCompPtr, "WebLoginStatus", "Web login status", false, "WebLoginStatus");
50 I_ASSIGN_TO(m_connectionStatusProviderModelCompPtr, m_connectionStatusProviderCompPtr, true);
51 I_END_COMPONENT;
52
53 // reimplemented (imtclientgql::IGqlSubscriptionManager)
54 virtual QByteArray RegisterSubscription(const imtgql::IGqlRequest& subscriptionRequest, imtclientgql::IGqlSubscriptionClient * subscriptionClientPtr) override;
55 virtual bool UnregisterSubscription(const QByteArray& subscriptionId) override;
56
57 // reimplemented (imod::CSingleModelObserverBase)
58 virtual void OnUpdate(const istd::IChangeable::ChangeSet& changeSet) override;
59
60 // reimplemented (imtrest::IRequestServlet)
61 virtual bool IsCommandSupported(const QByteArray& commandId) const override;
62 virtual imtrest::ConstResponsePtr ProcessRequest(const imtrest::IRequest& request, const QByteArray& subCommandId = QByteArray()) const override;
63
64 // reimplemented (IGqlClient)
65 virtual GqlResponsePtr SendRequest(GqlRequestPtr requestPtr, imtbase::IUrlParam* urlParamPtr = nullptr) const override;
66
67protected:
68 virtual void SubscriptionRegister(const imtgql::CGqlRequest& subscriptionRequest, const QByteArray& subscriptionId) const;
69 virtual bool SendRequestInternal(const imtgql::IGqlRequest& request, imtrest::ConstRequestPtr& requestPtr) const;
70
71 // reimplemented (icomp::CComponentBase)
72 virtual void OnComponentCreated() override;
73
74Q_SIGNALS:
75 void OnQueryDataReceived(int resultCode = 1) const;
76
77private:
78 virtual imtrest::ConstResponsePtr CreateErrorResponse(const QByteArray& errorMessage, const imtrest::IRequest& request) const;
79
80private:
81 I_REF(imtrest::ITransport, m_subscriptionSenderCompPtr);
82 I_REF(imtrest::IResponseDispatcher, m_requestManagerCompPtr);
83 I_REF(imtcom::IConnectionStatusProvider, m_connectionStatusProviderCompPtr);
84 I_REF(imod::IModel, m_connectionStatusProviderModelCompPtr);
85 I_REF(imtrest::IProtocolEngine, m_engineCompPtr);
86
87 class SubscriptionHelper
88 {
89 public:
90 imtgql::CGqlRequest m_request;
91 QByteArray m_clientId;
92 IGqlSubscriptionClient::SubscriptionStatus m_status;
93 QList<IGqlSubscriptionClient*> m_clients;
94 };
95
96 class NetworkOperation
97 {
98 public:
99 NetworkOperation() = delete;
100 NetworkOperation(int timeout, const CSubscriptionManagerComp* parent);
101 ~NetworkOperation();
102
103 QEventLoop connectionLoop;
104 bool timerFlag;
105 QTimer timer;
106 };
107
108 mutable QMap <QByteArray, SubscriptionHelper> m_registeredClients;
109 mutable QMap<QString, QByteArray> m_queryDataMap;
110 mutable QMutex m_registeredClientsMutex;
111 mutable QReadWriteLock m_queryDataMapLock;
112};
113
114
115} // namespace imtclientgql
116
117
Interface for monitoring network connection status with observable state changes.