From b855240b782395f94315f43ea3e7e182299fac48 Mon Sep 17 00:00:00 2001 From: Matthew Vogt Date: Thu, 16 Feb 2012 14:43:03 +1000 Subject: Rename QDeclarative symbols to QQuick and QQml Symbols beginning with QDeclarative are already exported by the quick1 module. Users can apply the bin/rename-qtdeclarative-symbols.sh script to modify client code using the previous names of the renamed symbols. Task-number: QTBUG-23737 Change-Id: Ifaa482663767634931e8711a8e9bf6e404859e66 Reviewed-by: Martin Jones --- src/qml/debugger/qqmlinspectorservice.cpp | 186 ++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/qml/debugger/qqmlinspectorservice.cpp (limited to 'src/qml/debugger/qqmlinspectorservice.cpp') diff --git a/src/qml/debugger/qqmlinspectorservice.cpp b/src/qml/debugger/qqmlinspectorservice.cpp new file mode 100644 index 0000000000..508d12eefa --- /dev/null +++ b/src/qml/debugger/qqmlinspectorservice.cpp @@ -0,0 +1,186 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia 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. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qqmlinspectorservice_p.h" +#include "qqmlinspectorinterface_p.h" +#include "qqmldebugserver_p.h" + +#include + +#include +#include +#include +#include + +// print detailed information about loading of plugins +DEFINE_BOOL_CONFIG_OPTION(qmlDebugVerbose, QML_DEBUGGER_VERBOSE) + +QT_BEGIN_NAMESPACE + +Q_GLOBAL_STATIC(QQmlInspectorService, serviceInstance) + +QQmlInspectorService::QQmlInspectorService() + : QQmlDebugService(QLatin1String("QQmlObserverMode"), 1) + , m_currentInspectorPlugin(0) +{ + registerService(); +} + +QQmlInspectorService *QQmlInspectorService::instance() +{ + return serviceInstance(); +} + +void QQmlInspectorService::addView(QObject *view) +{ + m_views.append(view); + updateState(); +} + +void QQmlInspectorService::removeView(QObject *view) +{ + m_views.removeAll(view); + updateState(); +} + +void QQmlInspectorService::sendMessage(const QByteArray &message) +{ + if (state() != Enabled) + return; + + QQmlDebugService::sendMessage(message); +} + +void QQmlInspectorService::stateChanged(State /*state*/) +{ + QMetaObject::invokeMethod(this, "updateState", Qt::QueuedConnection); +} + +void QQmlInspectorService::updateState() +{ + if (m_views.isEmpty()) { + if (m_currentInspectorPlugin) { + m_currentInspectorPlugin->deactivate(); + m_currentInspectorPlugin = 0; + } + return; + } + + if (state() == Enabled) { + if (m_inspectorPlugins.isEmpty()) + loadInspectorPlugins(); + + if (m_inspectorPlugins.isEmpty()) { + qWarning() << "QQmlInspector: No plugins found."; + QQmlDebugServer::instance()->removeService(this); + return; + } + + foreach (QQmlInspectorInterface *inspector, m_inspectorPlugins) { + if (inspector->canHandleView(m_views.first())) { + m_currentInspectorPlugin = inspector; + break; + } + } + + if (!m_currentInspectorPlugin) { + qWarning() << "QQmlInspector: No plugin available for view '" << m_views.first()->metaObject()->className() << "'."; + return; + } + m_currentInspectorPlugin->activate(m_views.first()); + } else { + if (m_currentInspectorPlugin) { + m_currentInspectorPlugin->deactivate(); + m_currentInspectorPlugin = 0; + } + } +} + +void QQmlInspectorService::messageReceived(const QByteArray &message) +{ + QMetaObject::invokeMethod(this, "processMessage", Qt::QueuedConnection, Q_ARG(QByteArray, message)); +} + +void QQmlInspectorService::processMessage(const QByteArray &message) +{ + if (m_currentInspectorPlugin) + m_currentInspectorPlugin->clientMessage(message); +} + +void QQmlInspectorService::loadInspectorPlugins() +{ + QStringList pluginCandidates; + const QStringList paths = QCoreApplication::libraryPaths(); + foreach (const QString &libPath, paths) { + const QDir dir(libPath + QLatin1String("/qmltooling")); + if (dir.exists()) + foreach (const QString &pluginPath, dir.entryList(QDir::Files)) + pluginCandidates << dir.absoluteFilePath(pluginPath); + } + + foreach (const QString &pluginPath, pluginCandidates) { + if (qmlDebugVerbose()) + qDebug() << "QQmlInspector: Trying to load plugin " << pluginPath << "..."; + + QPluginLoader loader(pluginPath); + if (!loader.load()) { + if (qmlDebugVerbose()) + qDebug() << "QQmlInspector: Error while loading: " << loader.errorString(); + + continue; + } + + QQmlInspectorInterface *inspector = + qobject_cast(loader.instance()); + if (inspector) { + if (qmlDebugVerbose()) + qDebug() << "QQmlInspector: Plugin successfully loaded."; + m_inspectorPlugins << inspector; + } else { + if (qmlDebugVerbose()) + qDebug() << "QQmlInspector: Plugin does not implement interface QQmlInspectorInterface."; + + loader.unload(); + } + } +} + +QT_END_NAMESPACE -- cgit v1.2.3