/**************************************************************************** ** ** Copyright (C) 2016 basysKom GmbH, opensource@basyskom.com ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtOpcUa module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL3$ ** 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 http://www.qt.io/terms-conditions. For further ** information use the contact form at http://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.LGPLv3 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.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 later as published by the Free ** Software Foundation and appearing in the file LICENSE.GPL included in ** the packaging of this file. Please review the following information to ** ensure the GNU General Public License version 2.0 requirements will be ** met: http://www.gnu.org/licenses/gpl-2.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QOPCUANODE_P_H #define QOPCUANODE_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class QOpcUaNodePrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QOpcUaNode) public: QOpcUaNodePrivate(QOpcUaNodeImpl *impl, QOpcUaClient *client) : m_impl(impl) , m_client(client) { m_attributesReadConnection = QObject::connect(impl, &QOpcUaNodeImpl::attributesRead, [this](QVector attr, QOpcUa::UaStatusCode serviceResult) { for (auto &entry : qAsConst(attr)) { if (serviceResult == QOpcUa::UaStatusCode::Good) m_nodeAttributes[entry.attributeId] = { entry.value, entry.statusCode }; else m_nodeAttributes[entry.attributeId] = { QVariant(), serviceResult }; } QOpcUaNode::NodeAttributes updatedAttributes; for (auto &entry : qAsConst(attr)) updatedAttributes |= entry.attributeId; emit q_func()->readFinished(updatedAttributes); }); m_attributeWrittenConnection = QObject::connect(impl, &QOpcUaNodeImpl::attributeWritten, [this](QOpcUaNode::NodeAttribute attr, QVariant value, QOpcUa::UaStatusCode statusCode) { m_nodeAttributes[attr].statusCode = statusCode; if (statusCode == QOpcUa::UaStatusCode::Good) m_nodeAttributes[attr].attribute = value; emit q_func()->attributeWritten(attr, statusCode); }); m_attributeUpdatedConnection = QObject::connect(impl, &QOpcUaNodeImpl::attributeUpdated, [this](QOpcUaNode::NodeAttribute attr, QVariant value) { this->m_nodeAttributes[attr] = {value, QOpcUa::UaStatusCode::Good}; emit q_func()->attributeUpdated(attr, value); }); m_monitoringEnableDisableConnection = QObject::connect(impl, &QOpcUaNodeImpl::monitoringEnableDisable, [this](QOpcUaNode::NodeAttribute attr, bool subscribe, QOpcUaMonitoringParameters status) { if (subscribe == true) { m_monitoringStatus[attr] = status; emit q_func()->enableMonitoringFinished(attr, status.statusCode()); } else { m_monitoringStatus.remove(attr); emit q_func()->disableMonitoringFinished(attr, status.statusCode()); } }); m_monitoringStatusChangedConnection = QObject::connect(impl, &QOpcUaNodeImpl::monitoringStatusChanged, [this](QOpcUaNode::NodeAttribute attr, QOpcUaMonitoringParameters::Parameters items, QOpcUaMonitoringParameters param) { auto it = m_monitoringStatus.find(attr); if (param.statusCode() == QOpcUa::UaStatusCode::Good && it != m_monitoringStatus.end()) { if (items & QOpcUaMonitoringParameters::Parameter::PublishingEnabled) it->setPublishingEnabled(param.publishingEnabled()); if (items & QOpcUaMonitoringParameters::Parameter::PublishingInterval) it->setPublishingInterval(param.publishingInterval()); if (items & QOpcUaMonitoringParameters::Parameter::LifetimeCount) it->setLifetimeCount(param.lifetimeCount()); if (items & QOpcUaMonitoringParameters::Parameter::MaxKeepAliveCount) it->setMaxKeepAliveCount(param.maxKeepAliveCount()); if (items & QOpcUaMonitoringParameters::Parameter::MaxNotificationsPerPublish) it->setMaxNotificationsPerPublish(param.maxNotificationsPerPublish()); if (items & QOpcUaMonitoringParameters::Parameter::Priority) it->setPriority(param.priority()); if (items & QOpcUaMonitoringParameters::Parameter::SamplingInterval) it->setSamplingInterval(param.samplingInterval()); if (items & QOpcUaMonitoringParameters::Parameter::Filter) it->setFilter(param.filter()); if (items & QOpcUaMonitoringParameters::Parameter::QueueSize) it->setQueueSize(param.queueSize()); if (items & QOpcUaMonitoringParameters::Parameter::DiscardOldest) it->setDiscardOldest(param.discardOldest()); if (items & QOpcUaMonitoringParameters::Parameter::MonitoringMode) it->setMonitoringMode(param.monitoringMode()); } emit q_func()->monitoringStatusChanged(attr, items, param.statusCode()); }); } ~QOpcUaNodePrivate() { QObject::disconnect(m_attributesReadConnection); QObject::disconnect(m_attributeWrittenConnection); QObject::disconnect(m_attributeUpdatedConnection); QObject::disconnect(m_monitoringEnableDisableConnection); QObject::disconnect(m_monitoringStatusChangedConnection); } QScopedPointer m_impl; QPointer m_client; struct AttributeWithStatus { QVariant attribute; QOpcUa::UaStatusCode statusCode; }; QHash m_nodeAttributes; QHash m_monitoringStatus; QMetaObject::Connection m_attributesReadConnection; QMetaObject::Connection m_attributeWrittenConnection; QMetaObject::Connection m_attributeUpdatedConnection; QMetaObject::Connection m_monitoringEnableDisableConnection; QMetaObject::Connection m_monitoringStatusChangedConnection; }; QT_END_NAMESPACE #endif // QOPCUANODE_P_H