src/hbcore/feedback/hbfeedbackplugingroup.cpp
changeset 0 16d8024aca5e
child 7 923ff622b8b9
--- /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 <QtDebug>
+#include <QPluginLoader>
+#include <QDir>
+
+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<HbFeedbackPlugin *>(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;
+}