diff -r 000000000000 -r 16d8024aca5e src/hbcore/feedback/hbfeedbackplugingroup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hbcore/feedback/hbfeedbackplugingroup.cpp Mon Apr 19 14:02:13 2010 +0300 @@ -0,0 +1,312 @@ +/**************************************************************************** +** +** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (developer.feedback@nokia.com) +** +** This file is part of the HbCore module of the UI Extensions for Mobile. +** +** 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at developer.feedback@nokia.com. +** +****************************************************************************/ + +// internal +#include "hbfeedbackplugingroup.h" +#include "hbfeedbackmanager.h" +#include "hbfeedbackplugin.h" + +// Qt related +#include +#include +#include + +class HbFeedbackPluginGroupPrivate +{ + +public: + HbFeedbackPluginGroupPrivate(HbFeedbackManager& manager); + ~HbFeedbackPluginGroupPrivate(); + +public: + HbFeedbackManager& manager; + QList< QPointer< HbFeedbackPlugin> > feedbackPlugins; +}; + +HbFeedbackPluginGroupPrivate::HbFeedbackPluginGroupPrivate(HbFeedbackManager& manager) + : manager(manager) +{ +} + +HbFeedbackPluginGroupPrivate::~HbFeedbackPluginGroupPrivate() +{ +} + +void HbFeedbackPluginGroup::removePlugins() +{ + foreach(HbFeedbackPlugin* plugin, d->feedbackPlugins) { + // we cannot trust that dynamically + // loaded plugins haven't been destroyed somewhere else + if (plugin) { + delete plugin; + } + } + + d->feedbackPlugins.clear(); +} + +/*! + @beta + @hbcore + + \class HbFeedbackPluginGroup + + \brief Container class that loads and manages all feedback plugins. + + Feedback plugins are used for implementing various feedback features. + + HbFeedbackPluginGroup handles feedback plugins + \li loadPlugins() loads plugins + \li plugins() returns the list of plugins + \li supportedFeatures() lists supported features + \li isFeatureSupported() returns \c true if the feature is supported + \li enableFeature() enables feedback feature + \li disableFeature() disables feedback feature + \li isFeatureEnabled() returns \c true if the features is enabled + + See \ref arcFeedback "Feedback Manager Framework" for more information about the plugins. + + \sa feedbackPluginInterface +*/ + + +/*! + Constructor. +*/ +HbFeedbackPluginGroup::HbFeedbackPluginGroup(HbFeedbackManager& manager) : + d(new HbFeedbackPluginGroupPrivate(manager)) +{ +} + +/*! + Destructor. +*/ +HbFeedbackPluginGroup::~HbFeedbackPluginGroup() +{ + removePlugins(); + delete d; +} + + +/*! + Loads platform's featureName plugins. +*/ +void HbFeedbackPluginGroup::loadPlugins() +{ + QStringList pluginPathList; +#if defined(Q_OS_SYMBIAN) + const QString pluginRelativePath("resource/plugins/feedback/"); + + QFileInfoList driveInfoList = QDir::drives(); + + foreach (const QFileInfo &driveInfo, driveInfoList) { + const QString drive = driveInfo.absolutePath(); + if (drive.startsWith("z:", Qt::CaseInsensitive) || + drive.startsWith("c:", Qt::CaseInsensitive)) { + QString path(drive + pluginRelativePath); + pluginPathList << path; + } + } +#elif defined(Q_OS_WIN32) || defined(Q_OS_UNIX) + pluginPathList << HB_PLUGINS_DIR"/feedback/"; +#endif + + loadPlugins(pluginPathList); +} + +/*! + Loads plugins from specified directories. + + \param pluginPathList list of directories in which the plugins are located +*/ +void HbFeedbackPluginGroup::loadPlugins(QStringList pluginPathList) +{ + // remove old feedbackPlugins before loading new ones + removePlugins(); + QString nameFilter; + + foreach (const QString &path, pluginPathList) { + QDir pluginDir(path, nameFilter, QDir::NoSort, QDir::Files | QDir::Readable); + foreach(const QString& fileName, pluginDir.entryList(QDir::Files)) { + QPluginLoader loader(pluginDir.absoluteFilePath(fileName)); + QObject *plugin = loader.instance(); + if (plugin) { + if (HbFeedbackPlugin *feedbackPlugin = qobject_cast(plugin)) { + addPlugin(feedbackPlugin); + } + } + } + } +} + +//! Adds a plugin to the plugin group. +/*! + You don't need to call this. Plugins are loaded by the loadPlugins() method. + + \param feedbackPlugin the plugin to be added +*/ +void HbFeedbackPluginGroup::addPlugin(HbFeedbackPlugin* feedbackPlugin) +{ + if (feedbackPlugin + && !d->feedbackPlugins.contains(feedbackPlugin)) { + d->feedbackPlugins.append(feedbackPlugin); + feedbackPlugin->engine().setManager(&d->manager); + } +} + +/*! + List supported feedback features +*/ +QStringList HbFeedbackPluginGroup::supportedFeatures() const +{ + QStringList supportedFeatures; + foreach(HbFeedbackPlugin *plugin, d->feedbackPlugins) { + // sadly we cannot trust that dynamically + // loaded plugins aren't destroyed somewhere else + if (plugin) { + if (!supportedFeatures.contains(plugin->featureName())) { + supportedFeatures.append(plugin->featureName()); + } + } + } + return supportedFeatures; +} + +/*! + To check whether feedback feature is supported or not. + + \param featureName the name of the feature +*/ +bool HbFeedbackPluginGroup::isFeatureSupported(QString featureName) +{ + if (featureName.isEmpty()) { + qWarning("HbFeedbackPluginGroup::isFeatureSupported: Attempt to give empty string \ + as the parameter"); + } + + bool supported(false); + foreach(HbFeedbackPlugin *plugin, d->feedbackPlugins) { + // There's a small risk, that dynamically + // loaded plugins aren't destroyed somewhere else + if (plugin) { + if (plugin->featureName() == featureName) { + supported = true; + break; + } + } + } + return supported; +} + +/*! + To check whether \a featureName is enabled or not. + + \param featureName the name of the feature +*/ +bool HbFeedbackPluginGroup::isFeatureEnabled(QString featureName) +{ + if (featureName.isEmpty()) { + qWarning("HbFeedbackPluginGroup::isFeatureEnabled: Attempt to give empty string \ + as the parameter"); + } + + bool enabled(false); + foreach(HbFeedbackPlugin *plugin, d->feedbackPlugins) { + // There's a small risk, that dynamically + // loaded plugins aren't destroyed somewhere else + if (plugin) { + if (plugin->featureName() == featureName) { + enabled = plugin->engine().receivesInteractions(); + break; + } + } + } + return enabled; +} + +/*! + Enables feedback feature + + \param featureName the name of the feature +*/ +bool HbFeedbackPluginGroup::enableFeature(QString featureName) +{ + if (featureName.isEmpty()) { + qWarning("HbFeedbackPluginGroup::enableFeature: Attempt to give empty string \ + as the parameter"); + } + bool succeeded(false); + foreach(HbFeedbackPlugin *plugin, d->feedbackPlugins) { + // There's a small risk, that dynamically + // loaded plugins aren't destroyed somewhere else + if (plugin) { + if (plugin->featureName() == featureName) { + plugin->engine().setReceivesInteractions(true); + succeeded = plugin->engine().receivesInteractions(); + if (!succeeded) { + break; + } + } + } + } + return succeeded; +} + +/*! + Disables feedback feature + + \param featureName the name of the feature +*/ +bool HbFeedbackPluginGroup::disableFeature(QString featureName) +{ + if (featureName.isEmpty()) { + qWarning("HbFeedbackPluginGroup::disableFeature: Attempt to give empty string \ + as the parameter"); + } + + bool succeeded(false); + foreach(HbFeedbackPlugin *plugin, d->feedbackPlugins) { + if (plugin) { + if (plugin->featureName() == featureName) { + plugin->engine().setReceivesInteractions(false); + succeeded = !plugin->engine().receivesInteractions(); + if (!succeeded) { + break; + } + } + } + } + return succeeded; +} + +/*! + Returns the list of plugins + + \return Reference to the plugin list. +*/ +QList< QPointer< HbFeedbackPlugin> >& HbFeedbackPluginGroup::plugins() const +{ + return d->feedbackPlugins; +}