1// Copyright (C) 2017 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:declarations-only
4
5#ifndef QREMOTEOBJECTREPLICA_P_H
6#define QREMOTEOBJECTREPLICA_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include "qremoteobjectreplica.h"
20
21#include "qremoteobjectpendingcall.h"
22
23#include "qremoteobjectpacket_p.h"
24
25#include <QtCore/qcompilerdetection.h>
26#include <QtCore/qdatastream.h>
27#include <QtCore/qpointer.h>
28#include <QtCore/qtimer.h>
29
30QT_BEGIN_NAMESPACE
31
32class QRemoteObjectReplica;
33class QRemoteObjectSource;
34class QtROIoDeviceBase;
35
36class QReplicaImplementationInterface
37{
38public:
39 virtual ~QReplicaImplementationInterface() {}
40 virtual const QVariant getProperty(int i) const = 0;
41 virtual void setProperties(QVariantList &&) = 0;
42 virtual void setProperty(int i, const QVariant &) = 0;
43 virtual bool isInitialized() const = 0;
44 virtual QRemoteObjectReplica::State state() const = 0;
45 virtual bool waitForSource(int) = 0;
46 virtual QRemoteObjectNode *node() const = 0;
47
48 virtual void _q_send(QMetaObject::Call call, int index, const QVariantList &args) = 0;
49 virtual QRemoteObjectPendingCall _q_sendWithReply(QMetaObject::Call call, int index, const QVariantList &args) = 0;
50};
51
52class QStubReplicaImplementation final : public QReplicaImplementationInterface
53{
54public:
55 explicit QStubReplicaImplementation();
56 ~QStubReplicaImplementation() override;
57
58 const QVariant getProperty(int i) const override;
59 void setProperties(QVariantList &&) override;
60 void setProperty(int i, const QVariant &) override;
61 bool isInitialized() const override { return false; }
62 QRemoteObjectReplica::State state() const override { return QRemoteObjectReplica::State::Uninitialized;}
63 bool waitForSource(int) override { return false; }
64 QRemoteObjectNode *node() const override { return nullptr; }
65
66 void _q_send(QMetaObject::Call call, int index, const QVariantList &args) override;
67 QRemoteObjectPendingCall _q_sendWithReply(QMetaObject::Call call, int index, const QVariantList &args) override;
68 QVariantList m_propertyStorage;
69};
70
71class QRemoteObjectReplicaImplementation : public QObject, public QReplicaImplementationInterface
72{
73public:
74 explicit QRemoteObjectReplicaImplementation(const QString &name, const QMetaObject *, QRemoteObjectNode *);
75 ~QRemoteObjectReplicaImplementation() override;
76
77 bool needsDynamicInitialization() const;
78
79 const QVariant getProperty(int i) const override = 0;
80 void setProperties(QVariantList &&) override = 0;
81 void setProperty(int i, const QVariant &) override = 0;
82 virtual bool isShortCircuit() const = 0;
83 bool isInitialized() const override { return true; }
84 QRemoteObjectReplica::State state() const override { return QRemoteObjectReplica::State(m_state.loadRelaxed()); }
85 void setState(QRemoteObjectReplica::State state);
86 bool waitForSource(int) override { return true; }
87 virtual bool waitForFinished(const QRemoteObjectPendingCall &, int) { return true; }
88 virtual void notifyAboutReply(int, const QVariant &) {}
89 virtual void configurePrivate(QRemoteObjectReplica *);
90 void emitInitialized();
91 void emitNotified();
92 QRemoteObjectNode *node() const override { return m_node; }
93
94 void _q_send(QMetaObject::Call call, int index, const QVariantList &args) override = 0;
95 QRemoteObjectPendingCall _q_sendWithReply(QMetaObject::Call call, int index, const QVariantList &args) override = 0;
96
97 //Dynamic replica functions
98 virtual void setDynamicMetaObject(const QMetaObject *meta);
99 virtual void setDynamicProperties(QVariantList &&values);
100
101 QString m_objectName;
102 const QMetaObject *m_metaObject;
103
104 //Dynamic Replica data
105 int m_numSignals;//TODO maybe here too
106 int m_methodOffset;
107 int m_signalOffset;
108 int m_propertyOffset;
109 QRemoteObjectNode *m_node;
110 QByteArray m_objectSignature;
111 QAtomicInt m_state;
112};
113
114class QConnectedReplicaImplementation final : public QRemoteObjectReplicaImplementation
115{
116public:
117 explicit QConnectedReplicaImplementation(const QString &name, const QMetaObject *, QRemoteObjectNode *);
118 ~QConnectedReplicaImplementation() override;
119 const QVariant getProperty(int i) const override;
120 void setProperties(QVariantList &&) override;
121 void setProperty(int i, const QVariant &) override;
122 bool isShortCircuit() const final { return false; }
123 bool isInitialized() const override;
124 bool waitForSource(int timeout) override;
125 QList<int> childIndices() const;
126 void initialize(QVariantList &&values);
127 void configurePrivate(QRemoteObjectReplica *) override;
128 void requestRemoteObjectSource();
129 bool sendCommand();
130 QRemoteObjectPendingCall sendCommandWithReply(int serialId);
131 bool waitForFinished(const QRemoteObjectPendingCall &call, int timeout) override;
132 void notifyAboutReply(int ackedSerialId, const QVariant &value) override;
133 void setConnection(QtROIoDeviceBase *conn);
134 void setDisconnected();
135
136 void _q_send(QMetaObject::Call call, int index, const QVariantList &args) override;
137 QRemoteObjectPendingCall _q_sendWithReply(QMetaObject::Call call, int index, const QVariantList& args) override;
138
139 void setDynamicMetaObject(const QMetaObject *meta) override;
140 void setDynamicProperties(QVariantList &&) override;
141 QList<QRemoteObjectReplica *> m_parentsNeedingConnect;
142 QVariantList m_propertyStorage;
143 QList<int> m_childIndices;
144 QPointer<QtROIoDeviceBase> connectionToSource;
145
146 // pending call data
147 int m_curSerialId = 1; // 0 is reserved for heartbeat signals
148 QHash<int, QRemoteObjectPendingCall> m_pendingCalls;
149 QTimer m_heartbeatTimer;
150};
151
152class QInProcessReplicaImplementation final : public QRemoteObjectReplicaImplementation
153{
154public:
155 explicit QInProcessReplicaImplementation(const QString &name, const QMetaObject *, QRemoteObjectNode *);
156 ~QInProcessReplicaImplementation() override;
157
158 const QVariant getProperty(int i) const override;
159 void setProperties(QVariantList &&) override;
160 void setProperty(int i, const QVariant &) override;
161 bool isShortCircuit() const final { return true; }
162
163 void _q_send(QMetaObject::Call call, int index, const QVariantList &args) override;
164 QRemoteObjectPendingCall _q_sendWithReply(QMetaObject::Call call, int index, const QVariantList& args) override;
165
166 QPointer<QRemoteObjectSourceBase> connectionToSource;
167};
168
169QT_END_NAMESPACE
170
171#endif
172

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