/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2013 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff ** Contact: http://www.qt-project.org/legal * ** This file is part of the QtWebChannel 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 Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 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 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QMETAOBJECTPUBLISHER_P_H #define QMETAOBJECTPUBLISHER_P_H #include "variantargument_p.h" #include "signalhandler_p.h" #include #include #include #include class QMetaObjectPublisher; class QWebChannel; #include "qwebchannelglobal.h" struct Q_WEBCHANNEL_EXPORT QMetaObjectPublisherPrivate { QMetaObjectPublisherPrivate(QMetaObjectPublisher *q); /** * Set the client to idle or busy, based on the value of @p isIdle. * * When the value changed, start/stop the property update timer accordingly. */ void setClientIsIdle(bool isIdle); /** * Initialize clients by sending them the class information of the registered objects. * * Furthermore, if that was not done already, connect to their property notify signals. */ void initializeClients(); /** * Go through all properties of the given object and connect to their notify signal. * * When receiving a notify signal, it will store the information in pendingPropertyUpdates which * gets send via a Qt.propertyUpdate message to the server when the grouping timer timeouts. */ void initializePropertyUpdates(const QObject *const object, const QVariantMap &objectInfo); /** * Send the clients the new property values since the last time this function was invoked. * * This is a grouped batch of all properties for which their notify signal was emitted. * The list of signals as well as the arguments they contained, are also transmitted to * the remote clients. * * @sa timer, initializePropertyUpdates */ void sendPendingPropertyUpdates(); /** * Invoke the method of index @p methodIndex on @p object with the arguments @p args. * * The return value of the method invocation is then transmitted to the calling client * via a webchannel response to the message identified by @p id. */ bool invokeMethod(QObject *const object, const int methodIndex, const QJsonArray &args, const QJsonValue &id); /** * Callback of the signalHandler which forwards the signal invocation to the webchannel clients. */ void signalEmitted(const QObject *object, const int signalIndex, const QVariantList &arguments); /** * Callback for registered or wrapped objects which erases all data related to @p object. * * @sa signalEmitted */ void objectDestroyed(const QObject *object); /** * Given a QVariant containing a QObject*, wrap the object and register for property updates * return the objects class information. * * All other input types are returned as-is. * * TODO: support wrapping of initially-registered objects */ QVariant wrapResult(const QVariant &result); /** * Invoke delete later on @p object. */ void deleteWrappedObject(QObject *object) const; QMetaObjectPublisher *q; QPointer webChannel; SignalHandler signalHandler; // true when the client is idle, false otherwise bool clientIsIdle; // true when no property updates should be sent, false otherwise bool blockUpdates; // true when at least one client needs to be initialized, // i.e. when a Qt.init came in which was not handled yet. bool pendingInit; // true when at least one client was initialized and thus // the property updates have been initialized and the // object info map set. bool propertyUpdatesInitialized; // Map of registered objects indexed by their id. QHash registeredObjects; // Map the registered objects to their id. QHash registeredObjectIds; // Map of object names to maps of signal indices to a set of all their properties. // The last value is a set as a signal can be the notify signal of multiple properties. typedef QHash > SignalToPropertyNameMap; QHash signalToPropertyMap; // Objects that changed their properties and are waiting for idle client. // map of object name to map of signal index to arguments typedef QHash SignalToArgumentsMap; typedef QHash PendingPropertyUpdates; PendingPropertyUpdates pendingPropertyUpdates; // Maps wrapped object to class info QHash wrappedObjects; // Aggregate property updates since we get multiple Qt.idle message when we have multiple // clients. They all share the same QWebProcess though so we must take special care to // prevent message flooding. QBasicTimer timer; }; #endif // QMETAOBJECTPUBLISHER_P_H