Revision control

++ // Copyright (C) 2017 Ford Motor Company
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ //! [simpleSwitch_rep]
++ class SimpleSwitch
++ {
++ PROP(bool currState=false);
++ SLOT(server_slot(bool clientState));
++ };
++ //! [simpleSwitch_rep]
++
++ //! [simpleSwitch_repsource_example1]
++ REPC_SOURCE = simpleswitch.rep
++ //! [simpleSwitch_repsource_example1]
++
++ //! [simpleSwitch_remoteobjectsadd_example1]
++ QT += remoteobjects
++ //! [simpleSwitch_remoteobjectsadd_example1]
++
++ //! [simpleSwitch_serverheader_example1]
++ #ifndef SIMPLESWITCH_H
++ #define SIMPLESWITCH_H
++
++ #include "rep_simpleswitch_source.h"
++
++ class SimpleSwitch : public SimpleSwitchSimpleSource
++ {
++ Q_OBJECT
++ public:
++ SimpleSwitch(QObject *parent = nullptr);
++ ~SimpleSwitch();
++ void server_slot(bool clientState) override;
++ public Q_SLOTS:
++ void timeout_slot();
++ private:
++ QTimer *stateChangeTimer;
++ };
++
++ #endif
++ //! [simpleSwitch_serverheader_example1]
++
++ //! [simpleSwitch_serversource_example1]
++ #include "simpleswitch.h"
++
++ // constructor
++ SimpleSwitch::SimpleSwitch(QObject *parent) : SimpleSwitchSimpleSource(parent)
++ {
++ stateChangeTimer = new QTimer(this); // Initialize timer
++ QObject::connect(stateChangeTimer, &QTimer::timeout, this, &SimpleSwitch::timeout_slot); // connect timeout() signal from stateChangeTimer to timeout_slot() of simpleSwitch
++ stateChangeTimer->start(2000); // Start timer and set timout to 2 seconds
++ qDebug() << "Source Node Started";
++ }
++
++ //destructor
++ SimpleSwitch::~SimpleSwitch()
++ {
++ stateChangeTimer->stop();
++ }
++
++ void SimpleSwitch::server_slot(bool clientState)
++ {
++ qDebug() << "Replica state is " << clientState; // print switch state echoed back by client
++ }
++
++ void SimpleSwitch::timeout_slot()
++ {
++ // slot called on timer timeout
++ if (currState()) // check if current state is true, currState() is defined in repc generated rep_simpleswitch_source.h
++ setCurrState(false); // set state to false
++ else
++ setCurrState(true); // set state to true
++ qDebug() << "Source State is "<<currState();
++
++ }
++ //! [simpleSwitch_serversource_example1]
++
++ //! [simpleSwitch_serverhostnode_example1]
++ QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")));
++ //! [simpleSwitch_serverhostnode_example1]
++
++ //! [simpleSwitch_enableremoting_example1]
++ SimpleSwitch srcSwitch; // create simple switch
++ srcNode.enableRemoting(&srcSwitch); // enable remoting
++ //! [simpleSwitch_enableremoting_example1]
++
++ //! [simpleSwitch_servermaincpp_example1]
++ #include <QCoreApplication>
++ #include "simpleswitch.h"
++
++ int main(int argc, char *argv[])
++ {
++ QCoreApplication a(argc, argv);
++
++ SimpleSwitch srcSwitch; // create simple switch
++
++ // Create host node without Registry:
++ QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")));
++ srcNode.enableRemoting(&srcSwitch); // enable remoting/sharing
++
++ return a.exec();
++ }
++ //! [simpleSwitch_servermaincpp_example1]
++
++ //! [simpleSwitch_clientrep_example1]
++ REPC_REPLICA = simpleswitch.rep
++ //! [simpleSwitch_clientrep_example1]
++
++ //! [simpleSwitch_clientremotenode_example1]
++ QRemoteObjectNode repNode; // create remote object node
++ repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
++ //! [simpleSwitch_clientremotenode_example1]
++
++ //! [simpleSwitch_clientacquirereplica_example1]
++ QSharedPointer<SimpleSwitchReplica> ptr;
++ ptr.reset(repNode.acquire<SimpleSwitchReplica>()); // acquire replica of source from host node
++ //! [simpleSwitch_clientacquirereplica_example1]
++
++ //! [simpleSwitch_clientheader_example1]
++ #ifndef _CLIENT_H
++ #define _CLIENT_H
++
++ #include <QObject>
++ #include <QSharedPointer>
++
++ #include "rep_simpleswitch_replica.h"
++
++ class Client : public QObject
++ {
++ Q_OBJECT
++ public:
++ Client(QSharedPointer<SimpleSwitchReplica> ptr);
++ ~Client() override = default;
++ void initConnections();// Function to connect signals and slots of source and client
++
++ Q_SIGNALS:
++ void echoSwitchState(bool switchState);// this signal is connected with server_slot(..) on the source object and echoes back switch state received from source
++
++ public Q_SLOTS:
++ void recSwitchState_slot(bool); // slot to receive source state
++ private:
++ bool clientSwitchState; // holds received server switch state
++ QSharedPointer<SimpleSwitchReplica> reptr;// holds reference to replica
++
++ };
++
++ #endif
++ //! [simpleSwitch_clientheader_example1]
++
++ //! [simpleSwitch_clientcpp_example1]
++ #include "client.h"
++
++ // constructor
++ Client::Client(QSharedPointer<SimpleSwitchReplica> ptr) :
++ QObject(nullptr),reptr(ptr)
++ {
++ // Connect signal for replica initialized with initialization slot.
++ initConnections();
++ // We can connect to SimpleSwitchReplica Signals/Slots
++ // directly because our Replica was generated by repc.
++ }
++
++ void Client::initConnections()
++ {
++ // initialize connections between signals and slots
++
++ // connect source replica signal currStateChanged() with client's recSwitchState() slot to receive source's current state
++ QObject::connect(reptr.data(), &SimpleSwitchReplica::currStateChanged, this, &Client::recSwitchState_slot);
++ // connect client's echoSwitchState(..) signal with replica's server_slot(..) to echo back received state
++ QObject::connect(this, &Client::echoSwitchState, reptr.data(), &SimpleSwitchReplica::server_slot);
++ }
++
++ void Client::recSwitchState_slot(bool value)
++ {
++ qDebug() << "Received source state "<< value << reptr.data()->currState();
++ clientSwitchState = reptr.data()->currState();
++ Q_EMIT echoSwitchState(clientSwitchState); // Emit signal to echo received state back to server
++ }
++ //! [simpleSwitch_clientcpp_example1]
++
++ //! [simpleSwitch_clientmain_example1]
++ #include <QCoreApplication>
++ #include "client.h"
++
++ int main(int argc, char *argv[])
++ {
++ QCoreApplication a(argc, argv);
++
++
++ QSharedPointer<SimpleSwitchReplica> ptr; // shared pointer to hold source replica
++
++ QRemoteObjectNode repNode; // create remote object node
++ repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
++
++ ptr.reset(repNode.acquire<SimpleSwitchReplica>()); // acquire replica of source from host node
++
++ Client rswitch(ptr); // create client switch object and pass reference of replica to it
++
++ return a.exec();
++ }
++ //! [simpleSwitch_clientmain_example1]
++
++ //! [simpleSwitch_dynamicclientnode_example2]
++ QRemoteObjectNode repNode; // create remote object node
++ repNode.connectToNode(QUrl(QStringLiteral("local:replica"))); // connect with remote host node
++ //! [simpleSwitch_dynamicclientnode_example2]
++
++ //! [simpleSwitch_dynamicclientacquirereplica_example2]
++ QSharedPointer<QRemoteObjectDynamicReplica> ptr; // shared pointer to hold replica
++ ptr.reset(repNode.acquire("SimpleSwitch")); // acquire replica of source from host node
++ //! [simpleSwitch_dynamicclientacquirereplica_example2]
++
++ //! [simpleSwitch_dynamicclientheader_example2]
++ #ifndef _DYNAMICCLIENT_H
++ #define _DYNAMICCLIENT_H
++
++ #include <QObject>
++ #include <QSharedPointer>
++
++ #include <QRemoteObjectNode>
++ #include <qremoteobjectdynamicreplica.h>
++
++ class DynamicClient : public QObject
++ {
++ Q_OBJECT
++ public:
++ DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr);
++ ~DynamicClient() override = default;
++
++ Q_SIGNALS:
++ void echoSwitchState(bool switchState);// this signal is connected with server_slot(..) slot of source object and echoes back switch state received from source
++
++ public Q_SLOTS:
++ void recSwitchState_slot(bool); // Slot to receive source state
++ void initConnection_slot(); // Slot to connect signals/slot on replica initialization
++
++ private:
++ bool clientSwitchState; // holds received server switch state
++ QSharedPointer<QRemoteObjectDynamicReplica> reptr;// holds reference to replica
++ };
++
++ #endif
++ //! [simpleSwitch_dynamicclientheader_example2]
++
++ //! [simpleSwitch_dynamicclientcpp_example2]
++ #include "dynamicclient.h"
++
++ // constructor
++ DynamicClient::DynamicClient(QSharedPointer<QRemoteObjectDynamicReplica> ptr)
++ : QObject(nullptr), clientSwitchState(false), reptr(ptr)
++ {
++ //connect signal for replica valid changed with signal slot initialization
++ QObject::connect(reptr.data(), &QRemoteObjectDynamicReplica::initialized, this,
++ &DynamicClient::initConnection_slot);
++ }
++
++ // Function to initialize connections between slots and signals
++ void DynamicClient::initConnection_slot()
++ {
++ // Connect source replica signal currStateChanged() with client's
++ // recSwitchState() slot to receive source's current state:
++ QObject::connect(reptr.data(), SIGNAL(currStateChanged(bool)), this,
++ SLOT(recSwitchState_slot(bool)));
++ // Connect client's echoSwitchState(..) signal with replica's
++ // server_slot(..) to echo back received state:
++ QObject::connect(this, SIGNAL(echoSwitchState(bool)), reptr.data(), SLOT(server_slot(bool)));
++ }
++
++ void DynamicClient::recSwitchState_slot(bool value)
++ {
++ // Use replica property to get "currState" from source:
++ clientSwitchState = reptr->property("currState").toBool();
++ qDebug() << "Received source state " << value << clientSwitchState;
++ // Emit signal to echo received state back to server:
++ Q_EMIT echoSwitchState(clientSwitchState);
++ }
++
++ //! [simpleSwitch_dynamicclientcpp_example2]
++
++ //! [simpleSwitch_dynamicclientmaincpp_example2]
++ #include <QCoreApplication>
++
++ #include "dynamicclient.h"
++
++ int main(int argc, char *argv[])
++ {
++ QCoreApplication a(argc, argv);
++
++ QSharedPointer<QRemoteObjectDynamicReplica> ptr; // shared pointer to hold replica
++
++ QRemoteObjectNode repNode;
++ repNode.connectToNode(QUrl(QStringLiteral("local:replica")));
++
++ ptr.reset(repNode.acquireDynamic("SimpleSwitch")); // acquire replica of source from host node
++
++ DynamicClient rswitch(ptr); // create client switch object and pass replica reference to it
++
++ return a.exec();
++ }
++ //! [simpleSwitch_dynamicclientmaincpp_example2]
++
++ //! [simpleSwitch_registrymaincpp_example3]
++ #include <QCoreApplication>
++ #include "simpleswitch.h"
++
++ int main(int argc, char *argv[])
++ {
++ QCoreApplication a(argc, argv);
++
++ SimpleSwitch srcSwitch; // create SimpleSwitch
++
++ // Create node that hosts registry:
++ QRemoteObjectRegistryHost regNode(QUrl(QStringLiteral("local:registry")));
++
++ // Create node that will host source and connect to registry:
++ QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")),
++ QUrl(QStringLiteral("local:registry")));
++ // Note, you can add srcSwitch directly to regNode if desired.
++ // We use two Nodes here, as the regNode could easily be in a third process.
++
++ srcNode.enableRemoting(&srcSwitch); // enable remoting of source object
++
++ return a.exec();
++ }
++ //! [simpleSwitch_registrymaincpp_example3]
++
++ //! [simpleSwitch_registrydynamicclientmaincpp_example3]
++ QRemoteObjectNode repNode(QUrl(QStringLiteral("local:registry")));
++ //! [simpleSwitch_registrydynamicclientmaincpp_example3]