1// Copyright (C) 2021 Ford Motor Company
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QCONNECTIONFACTORIES_H
6#define QCONNECTIONFACTORIES_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is part of the QtRO internal API and is not meant to be used
13// in applications. It contains "internal" components, which are exported
14// to allow new QIODevice channels to be added to extend QtRO. Usage of these
15// APIs may make your code source and binary incompatible with future versions
16// of Qt.
17//
18
19#include <QtNetwork/qabstractsocket.h>
20
21#include <QtRemoteObjects/qtremoteobjectglobal.h>
22#include <QtRemoteObjects/qremoteobjectnode.h>
23
24QT_BEGIN_NAMESPACE
25
26class QtROIoDeviceBasePrivate;
27class QtROClientIoDevicePrivate;
28class QtROExternalIoDevicePrivate;
29
30class Q_REMOTEOBJECTS_EXPORT QtROIoDeviceBase : public QObject
31{
32 Q_OBJECT
33 Q_DISABLE_COPY(QtROIoDeviceBase)
34
35public:
36 explicit QtROIoDeviceBase(QObject *parent = nullptr);
37 ~QtROIoDeviceBase() override;
38
39 bool read(QtRemoteObjects::QRemoteObjectPacketTypeEnum &, QString &);
40
41 virtual void write(const QByteArray &data);
42 virtual void write(const QByteArray &data, qint64);
43 virtual bool isOpen() const;
44 virtual void close();
45 virtual qint64 bytesAvailable() const;
46 virtual QIODevice *connection() const = 0;
47 void initializeDataStream();
48 bool isClosing() const;
49 void addSource(const QString &);
50 void removeSource(const QString &);
51 QSet<QString> remoteObjects() const;
52
53Q_SIGNALS:
54 void readyRead();
55 void disconnected();
56
57protected:
58 explicit QtROIoDeviceBase(QtROIoDeviceBasePrivate &, QObject *parent);
59 virtual QString deviceType() const = 0;
60 virtual void doClose() = 0;
61
62private:
63 Q_DECLARE_PRIVATE(QtROIoDeviceBase)
64 friend class QRemoteObjectNodePrivate;
65 friend class QConnectedReplicaImplementation;
66 friend class QRemoteObjectSourceIo;
67};
68
69class Q_REMOTEOBJECTS_EXPORT QtROServerIoDevice : public QtROIoDeviceBase
70{
71 Q_OBJECT
72 Q_DISABLE_COPY(QtROServerIoDevice)
73
74public:
75 explicit QtROServerIoDevice(QObject *parent = nullptr);
76
77protected:
78 QString deviceType() const override;
79};
80
81class Q_REMOTEOBJECTS_EXPORT QConnectionAbstractServer : public QObject
82{
83 Q_OBJECT
84 Q_DISABLE_COPY(QConnectionAbstractServer)
85
86public:
87 explicit QConnectionAbstractServer(QObject *parent = nullptr);
88 ~QConnectionAbstractServer() override;
89
90 virtual bool hasPendingConnections() const = 0;
91 QtROServerIoDevice* nextPendingConnection();
92 virtual QUrl address() const = 0;
93 virtual bool listen(const QUrl &address) = 0;
94 virtual QAbstractSocket::SocketError serverError() const = 0;
95 virtual void close() = 0;
96
97protected:
98 virtual QtROServerIoDevice* configureNewConnection() = 0;
99
100Q_SIGNALS:
101 void newConnection();
102};
103
104class Q_REMOTEOBJECTS_EXPORT QtROClientIoDevice : public QtROIoDeviceBase
105{
106 Q_OBJECT
107 Q_DISABLE_COPY(QtROClientIoDevice)
108
109public:
110 explicit QtROClientIoDevice(QObject *parent = nullptr);
111 ~QtROClientIoDevice() override;
112
113 void disconnectFromServer();
114 virtual void connectToServer() = 0;
115
116 QUrl url() const;
117
118Q_SIGNALS:
119 void shouldReconnect(QtROClientIoDevice*);
120 void setError(QRemoteObjectNode::ErrorCode);
121
122protected:
123 virtual void doDisconnectFromServer() = 0;
124 QString deviceType() const override;
125 void setUrl(const QUrl &url);
126
127private:
128 Q_DECLARE_PRIVATE(QtROClientIoDevice)
129 friend class QtROClientFactory;
130};
131
132class QtROServerFactory
133{
134public:
135 Q_REMOTEOBJECTS_EXPORT static QtROServerFactory *instance();
136
137 QConnectionAbstractServer *create(const QUrl &url, QObject *parent = nullptr)
138 {
139 auto creatorFunc = m_creatorFuncs.value(key: url.scheme());
140 return creatorFunc ? (*creatorFunc)(parent) : nullptr;
141 }
142
143 template<typename T>
144 void registerType(const QString &id)
145 {
146 m_creatorFuncs[id] = [](QObject *parent) -> QConnectionAbstractServer * {
147 return new T(parent);
148 };
149 }
150
151 bool isValid(const QUrl &url)
152 {
153 return m_creatorFuncs.contains(key: url.scheme());
154 }
155
156private:
157 friend class QtROFactoryLoader;
158 QtROServerFactory();
159
160 using CreatorFunc = QConnectionAbstractServer * (*)(QObject *);
161 QHash<QString, CreatorFunc> m_creatorFuncs;
162};
163
164class QtROClientFactory
165{
166public:
167 Q_REMOTEOBJECTS_EXPORT static QtROClientFactory *instance();
168
169 /// creates an object from a string
170 QtROClientIoDevice *create(const QUrl &url, QObject *parent = nullptr)
171 {
172 auto creatorFunc = m_creatorFuncs.value(key: url.scheme());
173 if (!creatorFunc)
174 return nullptr;
175
176 QtROClientIoDevice *res = (*creatorFunc)(parent);
177 if (res)
178 res->setUrl(url);
179 return res;
180 }
181
182 template<typename T>
183 void registerType(const QString &id)
184 {
185 m_creatorFuncs[id] = [](QObject *parent) -> QtROClientIoDevice * {
186 return new T(parent);
187 };
188 }
189
190 bool isValid(const QUrl &url)
191 {
192 return m_creatorFuncs.contains(key: url.scheme());
193 }
194
195private:
196 friend class QtROFactoryLoader;
197 QtROClientFactory();
198
199 using CreatorFunc = QtROClientIoDevice * (*)(QObject *);
200 QHash<QString, CreatorFunc> m_creatorFuncs;
201};
202
203template <typename T>
204inline void qRegisterRemoteObjectsClient(const QString &id)
205{
206 QtROClientFactory::instance()->registerType<T>(id);
207}
208
209template <typename T>
210inline void qRegisterRemoteObjectsServer(const QString &id)
211{
212 QtROServerFactory::instance()->registerType<T>(id);
213}
214
215QT_END_NAMESPACE
216
217#endif // QCONNECTIONFACTORIES_H
218

source code of qtremoteobjects/src/remoteobjects/qconnectionfactories.h