diff options
author | Brett Stottlemyer <bstottle@ford.com> | 2020-07-08 09:38:40 -0400 |
---|---|---|
committer | Sona Kurazyan <sona.kurazyan@qt.io> | 2021-05-27 18:18:07 +0200 |
commit | cab52cc47d5688b64bf8c0d8bf6cafdd4055b540 (patch) | |
tree | e442a3ded307908327cb96cc04d7a92c6bf7c5d8 | |
parent | 72b5ed2e32c52c98e2070988f5fd8eaf85821bb7 (diff) |
Move classes for adding a custom transport protocol to a public header
Although these classes weren't documented, they could be used externally
to specify a custom transport via inheriting from them and registering
the custom classes using qRegisterRemoteObjectsClient() and
qRegisterRemoteObjectsServer() methods.
Change-Id: Id4cfddf77cd5b55278b5780f4fca447f0706d464
Reviewed-by: Brett Stottlemyer <bstottle@ford.com>
Reviewed-by: Michael Brasser <michael.brasser@live.com>
-rw-r--r-- | src/remoteobjects/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/remoteobjects/qconnectionfactories.cpp | 37 | ||||
-rw-r--r-- | src/remoteobjects/qconnectionfactories.h | 247 | ||||
-rw-r--r-- | src/remoteobjects/qconnectionfactories_p.h | 198 |
4 files changed, 274 insertions, 210 deletions
diff --git a/src/remoteobjects/CMakeLists.txt b/src/remoteobjects/CMakeLists.txt index 9105783..3b12302 100644 --- a/src/remoteobjects/CMakeLists.txt +++ b/src/remoteobjects/CMakeLists.txt @@ -8,7 +8,7 @@ qt_internal_add_module(RemoteObjects SOURCES qconnection_local_backend.cpp qconnection_local_backend_p.h qconnection_tcpip_backend.cpp qconnection_tcpip_backend_p.h - qconnectionfactories.cpp qconnectionfactories_p.h + qconnectionfactories.cpp qconnectionfactories.h qconnectionfactories_p.h qremoteobjectabstractitemmodeladapter.cpp qremoteobjectabstractitemmodeladapter_p.h qremoteobjectabstractitemmodelreplica.cpp qremoteobjectabstractitemmodelreplica.h qremoteobjectabstractitemmodelreplica_p.h qremoteobjectabstractitemmodeltypes.h diff --git a/src/remoteobjects/qconnectionfactories.cpp b/src/remoteobjects/qconnectionfactories.cpp index af674d0..3a6b668 100644 --- a/src/remoteobjects/qconnectionfactories.cpp +++ b/src/remoteobjects/qconnectionfactories.cpp @@ -37,10 +37,8 @@ ** ****************************************************************************/ -#include <QtCore/private/qobject_p.h> - -#include "qconnectionfactories_p.h" #include "qconnectionfactories_p.h" +#include "qremoteobjectpacket_p.h" // BEGIN: Backends #if defined(Q_OS_QNX) @@ -63,34 +61,6 @@ public: Q_GLOBAL_STATIC(QtROFactoryLoader, loader) -class IoDeviceBasePrivate : public QObjectPrivate -{ -public: - IoDeviceBasePrivate() : QObjectPrivate() { m_dataStream.setVersion(dataStreamVersion); } - ~IoDeviceBasePrivate() = default; - bool m_isClosing = false; - quint32 m_curReadSize = 0; - QDataStream m_dataStream; - QSet<QString> m_remoteObjects; - Q_DECLARE_PUBLIC(IoDeviceBase) -}; - -class ClientIoDevicePrivate : public IoDeviceBasePrivate -{ -public: - ClientIoDevicePrivate() : IoDeviceBasePrivate() { } - QUrl m_url; - Q_DECLARE_PUBLIC(ClientIoDevice) -}; - -class ExternalIoDevicePrivate : public IoDeviceBasePrivate -{ -public: - ExternalIoDevicePrivate(QIODevice *device) : IoDeviceBasePrivate(), m_device(device) { } - QPointer<QIODevice> m_device; - Q_DECLARE_PUBLIC(ExternalIoDevice) -}; - inline bool fromDataStream(QDataStream &in, QRemoteObjectPacketTypeEnum &type, QString &name) { quint16 _type; @@ -418,3 +388,8 @@ QtROClientFactory *QtROClientFactory::instance() */ QT_END_NAMESPACE + +IoDeviceBasePrivate::IoDeviceBasePrivate() : QObjectPrivate() +{ + m_dataStream.setVersion(dataStreamVersion); +} diff --git a/src/remoteobjects/qconnectionfactories.h b/src/remoteobjects/qconnectionfactories.h new file mode 100644 index 0000000..777a32c --- /dev/null +++ b/src/remoteobjects/qconnectionfactories.h @@ -0,0 +1,247 @@ +/**************************************************************************** +** +** Copyright (C) 2021 Ford Motor Company +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtRemoteObjects module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCONNECTIONFACTORIES_H +#define QCONNECTIONFACTORIES_H + +// +// N O T E +// ------- +// +// This file includes "internal" components. They are exported +// to allow new QIODevice channels to be added to extend QtRO. +// + +#include <QtNetwork/qabstractsocket.h> + +#include <QtRemoteObjects/qtremoteobjectglobal.h> + + +QT_BEGIN_NAMESPACE + +class IoDeviceBasePrivate; +class ClientIoDevicePrivate; +class ExternalIoDevicePrivate; + +class Q_REMOTEOBJECTS_EXPORT IoDeviceBase : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(IoDeviceBase) + +public: + explicit IoDeviceBase(QObject *parent = nullptr); + ~IoDeviceBase() override; + + bool read(QtRemoteObjects::QRemoteObjectPacketTypeEnum &, QString &); + + virtual void write(const QByteArray &data); + virtual void write(const QByteArray &data, qint64); + virtual bool isOpen() const; + virtual void close(); + virtual qint64 bytesAvailable() const; + virtual QIODevice *connection() const = 0; + void initializeDataStream(); + // TODO Remove stream() + QDataStream &stream(); + bool isClosing() const; + void addSource(const QString &); + void removeSource(const QString &); + QSet<QString> remoteObjects() const; + +Q_SIGNALS: + void readyRead(); + void disconnected(); + +protected: + explicit IoDeviceBase(IoDeviceBasePrivate &, QObject *parent); + virtual QString deviceType() const = 0; + virtual void doClose() = 0; + +private: + Q_DECLARE_PRIVATE(IoDeviceBase) +}; + +class Q_REMOTEOBJECTS_EXPORT ServerIoDevice : public IoDeviceBase +{ + Q_OBJECT + Q_DISABLE_COPY(ServerIoDevice) + +public: + explicit ServerIoDevice(QObject *parent = nullptr); + +protected: + QString deviceType() const override; +}; + +class Q_REMOTEOBJECTS_EXPORT QConnectionAbstractServer : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(QConnectionAbstractServer) + +public: + explicit QConnectionAbstractServer(QObject *parent = nullptr); + ~QConnectionAbstractServer() override; + + virtual bool hasPendingConnections() const = 0; + ServerIoDevice* nextPendingConnection(); + virtual QUrl address() const = 0; + virtual bool listen(const QUrl &address) = 0; + virtual QAbstractSocket::SocketError serverError() const = 0; + virtual void close() = 0; + +protected: + virtual ServerIoDevice* configureNewConnection() = 0; + +Q_SIGNALS: + void newConnection(); +}; + +class Q_REMOTEOBJECTS_EXPORT ClientIoDevice : public IoDeviceBase +{ + Q_OBJECT + Q_DISABLE_COPY(ClientIoDevice) + +public: + explicit ClientIoDevice(QObject *parent = nullptr); + ~ClientIoDevice() override; + + void disconnectFromServer(); + virtual void connectToServer() = 0; + + QUrl url() const; + +Q_SIGNALS: + void shouldReconnect(ClientIoDevice*); + +protected: + virtual void doDisconnectFromServer() = 0; + QString deviceType() const override; + void setUrl(const QUrl &url); + +private: + Q_DECLARE_PRIVATE(ClientIoDevice) + friend class QtROClientFactory; +}; + +class QtROServerFactory +{ +public: + Q_REMOTEOBJECTS_EXPORT static QtROServerFactory *instance(); + + QConnectionAbstractServer *create(const QUrl &url, QObject *parent = nullptr) + { + auto creatorFunc = m_creatorFuncs.value(url.scheme()); + return creatorFunc ? (*creatorFunc)(parent) : nullptr; + } + + template<typename T> + void registerType(const QString &id) + { + m_creatorFuncs[id] = [](QObject *parent) -> QConnectionAbstractServer * { + return new T(parent); + }; + } + + bool isValid(const QUrl &url) + { + return m_creatorFuncs.contains(url.scheme()); + } + +private: + friend class QtROFactoryLoader; + QtROServerFactory(); + + using CreatorFunc = QConnectionAbstractServer * (*)(QObject *); + QHash<QString, CreatorFunc> m_creatorFuncs; +}; + +class QtROClientFactory +{ +public: + Q_REMOTEOBJECTS_EXPORT static QtROClientFactory *instance(); + + /// creates an object from a string + ClientIoDevice *create(const QUrl &url, QObject *parent = nullptr) + { + auto creatorFunc = m_creatorFuncs.value(url.scheme()); + if (!creatorFunc) + return nullptr; + + ClientIoDevice *res = (*creatorFunc)(parent); + if (res) + res->setUrl(url); + return res; + } + + template<typename T> + void registerType(const QString &id) + { + m_creatorFuncs[id] = [](QObject *parent) -> ClientIoDevice * { + return new T(parent); + }; + } + + bool isValid(const QUrl &url) + { + return m_creatorFuncs.contains(url.scheme()); + } + +private: + friend class QtROFactoryLoader; + QtROClientFactory(); + + using CreatorFunc = ClientIoDevice * (*)(QObject *); + QHash<QString, CreatorFunc> m_creatorFuncs; +}; + +template <typename T> +inline void qRegisterRemoteObjectsClient(const QString &id) +{ + QtROClientFactory::instance()->registerType<T>(id); +} + +template <typename T> +inline void qRegisterRemoteObjectsServer(const QString &id) +{ + QtROServerFactory::instance()->registerType<T>(id); +} + +QT_END_NAMESPACE + +#endif // QCONNECTIONFACTORIES_H diff --git a/src/remoteobjects/qconnectionfactories_p.h b/src/remoteobjects/qconnectionfactories_p.h index a5f7a78..c9bde88 100644 --- a/src/remoteobjects/qconnectionfactories_p.h +++ b/src/remoteobjects/qconnectionfactories_p.h @@ -51,12 +51,13 @@ // We mean it. // -#include <QtNetwork/qabstractsocket.h> #include <QtCore/qdatastream.h> #include <QtCore/qiodevice.h> #include <QtCore/qpointer.h> +#include <QtCore/private/qobject_p.h> #include <QtRemoteObjects/qtremoteobjectglobal.h> +#include <QtRemoteObjects/qconnectionfactories.h> QT_BEGIN_NAMESPACE @@ -67,109 +68,6 @@ static const QLatin1String protocolVersion("QtRO 1.3"); } -class IoDeviceBasePrivate; -class ClientIoDevicePrivate; -class ExternalIoDevicePrivate; -class Q_REMOTEOBJECTS_EXPORT IoDeviceBase : public QObject -{ - Q_OBJECT - Q_DISABLE_COPY(IoDeviceBase) - -public: - explicit IoDeviceBase(QObject *parent = nullptr); - ~IoDeviceBase() override; - - bool read(QtRemoteObjects::QRemoteObjectPacketTypeEnum &, QString &); - - virtual void write(const QByteArray &data); - virtual void write(const QByteArray &data, qint64); - virtual bool isOpen() const; - virtual void close(); - virtual qint64 bytesAvailable() const; - virtual QIODevice *connection() const = 0; - void initializeDataStream(); - // TODO Remove stream() - QDataStream &stream(); - bool isClosing() const; - void addSource(const QString &); - void removeSource(const QString &); - QSet<QString> remoteObjects() const; - -Q_SIGNALS: - void readyRead(); - void disconnected(); - -protected: - explicit IoDeviceBase(IoDeviceBasePrivate &, QObject *parent); - virtual QString deviceType() const = 0; - virtual void doClose() = 0; - -private: - Q_DECLARE_PRIVATE(IoDeviceBase) -}; - -class Q_REMOTEOBJECTS_EXPORT ServerIoDevice : public IoDeviceBase -{ - Q_OBJECT - Q_DISABLE_COPY(ServerIoDevice) - -public: - explicit ServerIoDevice(QObject *parent = nullptr); - -protected: - QString deviceType() const override; -}; - -class Q_REMOTEOBJECTS_EXPORT QConnectionAbstractServer : public QObject -{ - Q_OBJECT - Q_DISABLE_COPY(QConnectionAbstractServer) - -public: - explicit QConnectionAbstractServer(QObject *parent = nullptr); - ~QConnectionAbstractServer() override; - - virtual bool hasPendingConnections() const = 0; - ServerIoDevice* nextPendingConnection(); - virtual QUrl address() const = 0; - virtual bool listen(const QUrl &address) = 0; - virtual QAbstractSocket::SocketError serverError() const = 0; - virtual void close() = 0; - -protected: - virtual ServerIoDevice* configureNewConnection() = 0; - -Q_SIGNALS: - void newConnection(); -}; - -class Q_REMOTEOBJECTS_EXPORT ClientIoDevice : public IoDeviceBase -{ - Q_OBJECT - Q_DISABLE_COPY(ClientIoDevice) - -public: - explicit ClientIoDevice(QObject *parent = nullptr); - ~ClientIoDevice() override; - - void disconnectFromServer(); - virtual void connectToServer() = 0; - - QUrl url() const; - -Q_SIGNALS: - void shouldReconnect(ClientIoDevice*); - -protected: - virtual void doDisconnectFromServer() = 0; - QString deviceType() const override; - void setUrl(const QUrl &url); - -private: - Q_DECLARE_PRIVATE(ClientIoDevice) - friend class QtROClientFactory; -}; - class ExternalIoDevice : public IoDeviceBase { Q_OBJECT @@ -182,93 +80,37 @@ public: protected: void doClose() override; QString deviceType() const override; - private: Q_DECLARE_PRIVATE(ExternalIoDevice) }; -class QtROServerFactory +class IoDeviceBasePrivate : public QObjectPrivate { public: - Q_REMOTEOBJECTS_EXPORT static QtROServerFactory *instance(); - - QConnectionAbstractServer *create(const QUrl &url, QObject *parent = nullptr) - { - auto creatorFunc = m_creatorFuncs.value(url.scheme()); - return creatorFunc ? (*creatorFunc)(parent) : nullptr; - } - - template<typename T> - void registerType(const QString &id) - { - m_creatorFuncs[id] = [](QObject *parent) -> QConnectionAbstractServer * { - return new T(parent); - }; - } - - bool isValid(const QUrl &url) - { - return m_creatorFuncs.contains(url.scheme()); - } - -private: - friend class QtROFactoryLoader; - QtROServerFactory(); - - using CreatorFunc = QConnectionAbstractServer * (*)(QObject *); - QHash<QString, CreatorFunc> m_creatorFuncs; + IoDeviceBasePrivate(); + ~IoDeviceBasePrivate() = default; + bool m_isClosing = false; + quint32 m_curReadSize = 0; + QDataStream m_dataStream; + QSet<QString> m_remoteObjects; + Q_DECLARE_PUBLIC(IoDeviceBase) }; -class QtROClientFactory +class ClientIoDevicePrivate : public IoDeviceBasePrivate { public: - Q_REMOTEOBJECTS_EXPORT static QtROClientFactory *instance(); - - /// creates an object from a string - ClientIoDevice *create(const QUrl &url, QObject *parent = nullptr) - { - auto creatorFunc = m_creatorFuncs.value(url.scheme()); - if (!creatorFunc) - return nullptr; - - ClientIoDevice *res = (*creatorFunc)(parent); - if (res) - res->setUrl(url); - return res; - } - - template<typename T> - void registerType(const QString &id) - { - m_creatorFuncs[id] = [](QObject *parent) -> ClientIoDevice * { - return new T(parent); - }; - } - - bool isValid(const QUrl &url) - { - return m_creatorFuncs.contains(url.scheme()); - } - -private: - friend class QtROFactoryLoader; - QtROClientFactory(); - - using CreatorFunc = ClientIoDevice * (*)(QObject *); - QHash<QString, CreatorFunc> m_creatorFuncs; + ClientIoDevicePrivate() : IoDeviceBasePrivate() { } + QUrl m_url; + Q_DECLARE_PUBLIC(ClientIoDevice) }; -template <typename T> -inline void qRegisterRemoteObjectsClient(const QString &id) -{ - QtROClientFactory::instance()->registerType<T>(id); -} - -template <typename T> -inline void qRegisterRemoteObjectsServer(const QString &id) +class ExternalIoDevicePrivate : public IoDeviceBasePrivate { - QtROServerFactory::instance()->registerType<T>(id); -} +public: + ExternalIoDevicePrivate(QIODevice *device) : IoDeviceBasePrivate(), m_device(device) { } + QPointer<QIODevice> m_device; + Q_DECLARE_PUBLIC(ExternalIoDevice) +}; QT_END_NAMESPACE |