ImagingTools Core SDK
CWebSocketServerComp.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 <QtWebSockets/QWebSocket>
7#include <QtCore/QSharedPointer>
8
9// ACF includes
10#include <ilog/TLoggerCompWrap.h>
11#include <ibase/TRuntimeStatusHanderCompWrap.h>
12#include <iprm/IParamsSet.h>
13#include <iprm/IOptionsList.h>
14#include <imod/CMultiModelDispatcherBase.h>
15
16// ImtCore includes
17#include <imtrest/IRequestServlet.h>
18#include <imtrest/IProtocolEngine.h>
19#include <imtrest/ISubscriberEngine.h>
20#include <imtrest/IResponseDispatcher.h>
21#include <imtrest/CWebSocketSender.h>
22#include <imtrest/IServer.h>
23#include <imtcom/IServerConnectionInterface.h>
24#include <imtcom/IConnectionStatusProvider.h>
25#include <imtcom/ISslConfigurationManager.h>
26
27
28namespace imtrest
29{
30
31
32class CWebSocketThread;
33
34
40 public QObject,
41 public ibase::TRuntimeStatusHanderCompWrap<ilog::CLoggerComponentBase>,
42 private imod::CMultiModelDispatcherBase,
43 virtual public IResponseDispatcher,
45 virtual public IServer
46{
47 Q_OBJECT
48public:
49 typedef ibase::TRuntimeStatusHanderCompWrap<ilog::CLoggerComponentBase> BaseClass;
50 typedef imod::CMultiModelDispatcherBase BaseClass2;
51
52 I_BEGIN_COMPONENT(CWebSocketServerComp);
53 I_REGISTER_INTERFACE(IResponseDispatcher)
54 I_REGISTER_INTERFACE(imtcom::IConnectionStatusProvider)
55 I_REGISTER_INTERFACE(IServer)
56 I_ASSIGN(m_requestServerHandlerCompPtr, "RequestServerHandler", "Request handler registered for the server", false, "RequestServerHandler");
57 I_ASSIGN(m_requestClientHandlerCompPtr, "RequestClientHandler", "Request handler registered for the client", false, "RequestClientHandler");
58 I_ASSIGN(m_protocolEngineCompPtr, "ProtocolEngine", "Protocol engine used in the server", true, "ProtocolEngine");
59 I_ASSIGN(m_httpProtocolEngineCompPtr, "HttpProtocolEngine", "Http Protocol engine used in the server", false, "HttpProtocolEngine");
60 I_ASSIGN(m_subscriberEngineCompPtr, "SubscriberEngine", "Subscriber engine used in the server", false, "SubscriberEngine");
61 I_ASSIGN(m_startServerOnCreateAttrPtr, "StartServerOnCreate", "If enabled, the server will be started on after component creation", true, true);
62 I_ASSIGN(m_webServerInterfaceCompPtr, "WebServerConnectionInterface", "Parameter providing the WebSocket-server port to be listened", true, "WebServerConnectionInterface");
63 I_ASSIGN(m_sslConfigurationCompPtr, "SslConfiguration", "SSL Configuration is used by networking classes to relay information about an open SSL connection and to allow the server to control certain features of that connection.", false, "SslConfiguration")
64 I_ASSIGN_TO(m_sslConfigurationModelCompPtr, m_sslConfigurationCompPtr, false)
65 I_ASSIGN(m_sslConfigurationManagerCompPtr, "SslConfigurationManager", "SSL configuration manager, used to create an SSL configuration for server", false, "SslConfigurationManager")
66 I_ASSIGN(m_productId, "ProductId", "Product-ID used with corresponded GraphQL-requests", false, "");
67 I_ASSIGN(m_subprotocolListCompPtr, "SupportedSubprotocols", "Supported Web Socket subprotocols", false, "SupportedSubprotocols");
68 I_END_COMPONENT
69
70 IProtocolEngine* GetProtocolEngine();
71 IProtocolEngine* GetHttpProtocolEngine();
72 imtrest::IRequestServlet* GetRequestServerServlet();
73 imtrest::IRequestServlet* GetRequestClientServlet();
74 QByteArray GetProductId();
75 void SetConnectionStatus(const QByteArray& clientId);
76
77 // reimplemented (ilog::CLoggerComponentBase)
78 bool SendInfoMessage(
79 int id,
80 const QString& message,
81 const QString& messageSource = QString(),
82 int flags = 0) const;
83
84 bool SendErrorMessage(
85 int id,
86 const QString& message,
87 const QString& messageSource = QString(),
88 int flags = 0) const;
89
90 void SendVerboseMessage(const QString& message, const QString& messageSource = QString()) const;
91 void RegisterSender(const QByteArray& clientId, QWebSocket* webSocketPtr);
92
93
94 // reimplemented (imtrest::IResponseDispatcher)
95 virtual bool SendResponse(const QByteArray& requestId, ConstResponsePtr& response) const override;
96 virtual bool SendRequest(const QByteArray& requestId, ConstRequestPtr& request) const override;
97
98protected:
99 // reimplemented (imod::CMultiModelDispatcherBase)
100 virtual void OnModelChanged(int modelId, const istd::IChangeable::ChangeSet& changeSet) override;
101
102 // reimplemented (ibase::TRuntimeStatusHanderCompWrap)
103 virtual void OnSystemShutdown() override;
104
105 // reimplemented (icomp::CComponentBase)
106 virtual void OnComponentCreated() override;
107 virtual void OnComponentDestroyed() override;
108
109 // reimplemented (imtcom::IConnectionStatusProvider)
110 virtual ConnectionStatus GetConnectionStatus() const override;
111
112 // reimplemented (imtrest::IServer)
113 virtual bool StartServer() override;
114 virtual bool StopServer() override;
115 virtual ServerStatus GetServerStatus() const override;
116
117private:
118 bool EnsureServerStarted();
119 bool StartListening(const QHostAddress& address = QHostAddress::Any, quint16 port = 0);
120
121private Q_SLOTS:
122 void HandleNewConnections();
123 void OnSocketDisconnected();
124 void OnTimeout();
125 void OnAcceptError(QAbstractSocket::SocketError socketError);
126 void OnSslErrors(const QList<QSslError> &errors);
127
128protected:
129 QTimer m_timer;
130 istd::TDelPtr<QWebSocketServer> m_webSocketServerPtr;
131 QList<CWebSocketThread*> m_webSocketThreadList;
132 QMap <QByteArray, QSharedPointer<CWebSocketSender>> m_senders;
133 QMap <QByteArray, imtcom::IConnectionStatusProvider::ConnectionStatus> m_senderLoginStatusMap;
134 mutable QReadWriteLock m_sendersLock;
135private:
136 I_REF(imtrest::IRequestServlet, m_requestServerHandlerCompPtr);
137 I_REF(imtrest::IRequestServlet, m_requestClientHandlerCompPtr);
138 I_REF(IProtocolEngine, m_protocolEngineCompPtr);
139 I_REF(ISubscriberEngine, m_subscriberEngineCompPtr);
140 I_ATTR(bool, m_startServerOnCreateAttrPtr);
141 I_REF(imtcom::IServerConnectionInterface, m_webServerInterfaceCompPtr);
142 I_REF(iprm::IParamsSet, m_sslConfigurationCompPtr);
143 I_REF(imod::IModel, m_sslConfigurationModelCompPtr);
144 I_REF(imtcom::ISslConfigurationManager, m_sslConfigurationManagerCompPtr);
145 I_REF(IProtocolEngine, m_httpProtocolEngineCompPtr);
146 I_ATTR(QByteArray, m_productId);
147 I_REF(iprm::IOptionsList, m_subprotocolListCompPtr);
148
149 bool m_isInitialized = false;
150};
151
152
153} // namespace imtrest
154
155
Interface for monitoring network connection status with observable state changes.
ConnectionStatus
Connection status enumeration.
Interface for describing server connection configuration with multi-protocol support.