diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-05-12 17:53:05 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2013-05-12 17:53:05 +0000 |
| commit | 1d01bb37fb8379ea2e155bcd1af651d354cfc9c9 (patch) | |
| tree | cdf19247ec6b6045558f2be2599bb61e8352859c | |
| parent | 89aa7478d5da7f5fea64767b8cd979468b4089bc (diff) | |
| download | qmmp-1d01bb37fb8379ea2e155bcd1af651d354cfc9c9.tar.gz qmmp-1d01bb37fb8379ea2e155bcd1af651d354cfc9c9.tar.bz2 qmmp-1d01bb37fb8379ea2e155bcd1af651d354cfc9c9.zip | |
added feature to disable transport plugins
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3463 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/qmmp/decoder.cpp | 3 | ||||
| -rw-r--r-- | src/qmmp/decoder.h | 5 | ||||
| -rw-r--r-- | src/qmmp/inputsource.cpp | 130 | ||||
| -rw-r--r-- | src/qmmp/inputsource.h | 23 | ||||
| -rw-r--r-- | src/qmmp/inputsourcefactory.h | 2 | ||||
| -rw-r--r-- | src/qmmp/qmmpplugincache.cpp | 18 | ||||
| -rw-r--r-- | src/qmmp/qmmpplugincache_p.h | 3 | ||||
| -rw-r--r-- | src/qmmpui/pluginitem.cpp | 6 |
8 files changed, 137 insertions, 53 deletions
diff --git a/src/qmmp/decoder.cpp b/src/qmmp/decoder.cpp index eced422bb..7f5c4b9be 100644 --- a/src/qmmp/decoder.cpp +++ b/src/qmmp/decoder.cpp @@ -5,14 +5,11 @@ // #include <QStringList> #include <QSettings> -#include <QIODevice> #include <QBuffer> #include <QDir> #include <math.h> #include "qmmpplugincache_p.h" -#include "buffer.h" #include "output.h" -#include "visual.h" #include "decoderfactory.h" extern "C" diff --git a/src/qmmp/decoder.h b/src/qmmp/decoder.h index 090e6d4fc..1c5557db6 100644 --- a/src/qmmp/decoder.h +++ b/src/qmmp/decoder.h @@ -10,13 +10,12 @@ #include <QStringList> #include <QList> #include <QMap> +#include <QIODevice> #include "fileinfo.h" #include "qmmp.h" #include "audioparameters.h" +#include "decoderfactory.h" -class Decoder; -class DecoderFactory; -class QIODevice; class QmmpPluginCache; /*! @brief The Decoder class provides the base interface class of audio decoders. diff --git a/src/qmmp/inputsource.cpp b/src/qmmp/inputsource.cpp index 62b8d77ec..72fbce863 100644 --- a/src/qmmp/inputsource.cpp +++ b/src/qmmp/inputsource.cpp @@ -20,8 +20,7 @@ #include <QFile> #include <QDir> -#include <QApplication> -#include <QPluginLoader> +#include "qmmpplugincache_p.h" #include "qmmp.h" #include "fileinputsource_p.h" #include "emptyinputsource_p.h" @@ -89,25 +88,29 @@ QHash<QString, QString> InputSource::takeStreamInfo() } // static methods -QList<InputSourceFactory*> *InputSource::m_factories = 0; -QHash <InputSourceFactory*, QString> *InputSource::m_files = 0; +QStringList InputSource::m_disabledNames; +QList<QmmpPluginCache*> *InputSource::m_cache = 0; InputSource *InputSource::create(const QString &url, QObject *parent) { - checkFactories(); + loadPlugins(); InputSourceFactory *factory = 0; if(!url.contains("://")) //local file path doesn't contain "://" { qDebug("InputSource: using file transport"); return new FileInputSource(url, parent); } - foreach(InputSourceFactory *f, *m_factories) + foreach (QmmpPluginCache *item, *m_cache) { - if(f->properties().protocols.contains(url.section("://", 0, 0))) - { - factory = f; + if(m_disabledNames.contains(item->shortName())) + continue; + + factory = item->inputSourceFactory(); + + if(factory && factory->properties().protocols.contains(url.section("://", 0, 0))) break; - } + else + factory = 0; } if(factory) { @@ -123,55 +126,100 @@ InputSource *InputSource::create(const QString &url, QObject *parent) QList<InputSourceFactory *> InputSource::factories() { - checkFactories(); - return *m_factories; + loadPlugins(); + QList<InputSourceFactory *> list; + foreach (QmmpPluginCache *item, *m_cache) + { + if(item->inputSourceFactory()) + list.append(item->inputSourceFactory()); + } + return list; +} + +QList<InputSourceFactory *> InputSource::enabledFactories() +{ + loadPlugins(); + QList<InputSourceFactory *> list; + foreach (QmmpPluginCache *item, *m_cache) + { + if(m_disabledNames.contains(item->shortName())) + continue; + if(item->decoderFactory()) + list.append(item->inputSourceFactory()); + } + return list; } QString InputSource::file(InputSourceFactory *factory) { - checkFactories(); - return m_files->value(factory); + loadPlugins(); + foreach(QmmpPluginCache *item, *m_cache) + { + if(item->shortName() == factory->properties().shortName) + return item->file(); + } + return QString(); } QStringList InputSource::protocols() { - checkFactories(); + loadPlugins(); QStringList protocolsList; - foreach(InputSourceFactory *f, *m_factories) + + foreach (QmmpPluginCache *item, *m_cache) { - protocolsList << f->properties().protocols; + if(m_disabledNames.contains(item->shortName())) + continue; + if(item->inputSourceFactory()) + protocolsList << item->inputSourceFactory()->properties().protocols; } protocolsList.removeDuplicates(); return protocolsList; } -void InputSource::checkFactories() +void InputSource::setEnabled(InputSourceFactory *factory, bool enable) { - if (!m_factories) - { - m_files = new QHash <InputSourceFactory*, QString>; - m_factories = new QList<InputSourceFactory *>; + loadPlugins(); + if (!factories().contains(factory)) + return; + + if(enable == isEnabled(factory)) + return; + + if(enable) + m_disabledNames.removeAll(factory->properties().shortName); + else + m_disabledNames.append(factory->properties().shortName); + + m_disabledNames.removeDuplicates(); + QSettings settings (Qmmp::configFile(), QSettings::IniFormat); + settings.setValue("Transports/disabled_plugins", m_disabledNames); +} - QDir pluginsDir (Qmmp::pluginsPath()); - pluginsDir.cd("Transports"); - foreach (QString fileName, pluginsDir.entryList(QDir::Files)) +bool InputSource::isEnabled(InputSourceFactory *factory) +{ + loadPlugins(); + return !m_disabledNames.contains(factory->properties().shortName); +} + +void InputSource::loadPlugins() +{ + if (m_cache) + return; + + m_cache = new QList<QmmpPluginCache*>; + QSettings settings (Qmmp::configFile(), QSettings::IniFormat); + QDir pluginsDir (Qmmp::pluginsPath()); + pluginsDir.cd("Transports"); + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) + { + QmmpPluginCache *item = new QmmpPluginCache(pluginsDir.absoluteFilePath(fileName), &settings); + if(item->hasError()) { - QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); - QObject *plugin = loader.instance(); - if (loader.isLoaded()) - qDebug("InputSource: loaded plugin %s", qPrintable(fileName)); - else - qWarning("InputSource: %s", qPrintable(loader.errorString ())); - InputSourceFactory *factory = 0; - if (plugin) - factory = qobject_cast<InputSourceFactory *>(plugin); - - if (factory) - { - m_factories->append(factory); - m_files->insert(factory, pluginsDir.absoluteFilePath(fileName)); - qApp->installTranslator(factory->createTranslator(qApp)); - } + delete item; + continue; } + m_cache->append(item); } + m_disabledNames = settings.value("Transports/disabled_plugins").toStringList(); } diff --git a/src/qmmp/inputsource.h b/src/qmmp/inputsource.h index d32bef1d8..04eba674e 100644 --- a/src/qmmp/inputsource.h +++ b/src/qmmp/inputsource.h @@ -30,6 +30,8 @@ #include "qmmp.h" #include "inputsourcefactory.h" +class QmmpPluginCache; + /*! @brief The InputSource class provides the base interface class of transports. * @author Ilya Kotov <forkotov02@hotmail.ru> */ @@ -115,6 +117,10 @@ public: */ static QList<InputSourceFactory *> factories(); /*! + * Returns a list of enabled transport factories. + */ + static QList<InputSourceFactory *> enabledFactories(); + /*! * Returns plugin file path. * @param factory Transport plugin factory. */ @@ -123,6 +129,17 @@ public: * Returns a list of supported protocols. */ static QStringList protocols(); + /*! + * Sets whether the input plugin is enabled. + * @param factory Transport plugin factory. + * @param enable Plugin enable state (\b true - enable, \b false - disable) + */ + static void setEnabled(InputSourceFactory* factory, bool enable = true); + /*! + * Returns \b true if input plugin is enabled, otherwise returns \b false + * @param factory Decoder plugin factory. + */ + static bool isEnabled(InputSourceFactory* factory); signals: /*! @@ -140,9 +157,9 @@ private: QMap<Qmmp::MetaData, QString> m_metaData; QHash<QString, QString> m_streamInfo; bool m_hasMetaData, m_hasStreamInfo; - static void checkFactories(); - static QList<InputSourceFactory*> *m_factories; - static QHash <InputSourceFactory*, QString> *m_files; + static void loadPlugins(); + static QList<QmmpPluginCache*> *m_cache; + static QStringList m_disabledNames; }; #endif // INPUTSOURCE_H diff --git a/src/qmmp/inputsourcefactory.h b/src/qmmp/inputsourcefactory.h index 62a38b975..8367f6e15 100644 --- a/src/qmmp/inputsourcefactory.h +++ b/src/qmmp/inputsourcefactory.h @@ -83,7 +83,7 @@ public: virtual QTranslator *createTranslator(QObject *parent) = 0; }; -Q_DECLARE_INTERFACE(InputSourceFactory, "InputSourceFactory/1.0"); +Q_DECLARE_INTERFACE(InputSourceFactory, "InputSourceFactory/1.0") #endif // INPUTSOURCEFACTORY_H diff --git a/src/qmmp/qmmpplugincache.cpp b/src/qmmp/qmmpplugincache.cpp index 7705874ff..fc0250ed4 100644 --- a/src/qmmp/qmmpplugincache.cpp +++ b/src/qmmp/qmmpplugincache.cpp @@ -28,6 +28,7 @@ #include "outputfactory.h" #include "enginefactory.h" #include "effectfactory.h" +#include "inputsourcefactory.h" #include "qmmpplugincache_p.h" QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings) @@ -38,6 +39,7 @@ QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings) m_outputFactory = 0; m_engineFactory = 0; m_effectFactory = 0; + m_inputSourceFactory = 0; m_priority = 0; bool update = false; QFileInfo info(file); @@ -87,6 +89,11 @@ QmmpPluginCache::QmmpPluginCache(const QString &file, QSettings *settings) m_shortName = factory->properties().shortName; m_priority = factory->properties().priority; } + else if(InputSourceFactory *factory = inputSourceFactory()) + { + m_shortName = factory->properties().shortName; + m_priority = 0; + } else { qWarning("QmmpPluginCache: unknown plugin type: %s", qPrintable(m_path)); @@ -166,6 +173,17 @@ EffectFactory *QmmpPluginCache::effectFactory() return m_effectFactory; } +InputSourceFactory *QmmpPluginCache::inputSourceFactory() +{ + if(!m_inputSourceFactory) + { + m_inputSourceFactory = qobject_cast<InputSourceFactory *> (instance()); + if(m_inputSourceFactory) + qApp->installTranslator(m_inputSourceFactory->createTranslator(qApp)); + } + return m_inputSourceFactory; +} + bool QmmpPluginCache::hasError() const { return m_error; diff --git a/src/qmmp/qmmpplugincache_p.h b/src/qmmp/qmmpplugincache_p.h index 6d5dcc591..416ef455e 100644 --- a/src/qmmp/qmmpplugincache_p.h +++ b/src/qmmp/qmmpplugincache_p.h @@ -29,6 +29,7 @@ class DecoderFactory; class OutputFactory; class EngineFactory; class EffectFactory; +class InputSourceFactory; /*! @internal * @author Ilya Kotov <forkotov02@hotmail.ru> @@ -47,6 +48,7 @@ public: OutputFactory *outputFactory(); EngineFactory *engineFactory(); EffectFactory *effectFactory(); + InputSourceFactory *inputSourceFactory(); static void cleanup(QSettings *settings); @@ -60,6 +62,7 @@ private: OutputFactory *m_outputFactory; EngineFactory *m_engineFactory; EffectFactory *m_effectFactory; + InputSourceFactory *m_inputSourceFactory; int m_priority; }; diff --git a/src/qmmpui/pluginitem.cpp b/src/qmmpui/pluginitem.cpp index 98221c69a..b89ab783c 100644 --- a/src/qmmpui/pluginitem.cpp +++ b/src/qmmpui/pluginitem.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010-2012 by Ilya Kotov * + * Copyright (C) 2010-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -21,6 +21,7 @@ #include <QSettings> #include <QDir> #include <qmmp/inputsourcefactory.h> +#include <qmmp/inputsource.h> #include <qmmp/decoderfactory.h> #include <qmmp/outputfactory.h> #include <qmmp/visualfactory.h> @@ -41,6 +42,7 @@ PluginItem::PluginItem(QTreeWidgetItem *parent, InputSourceFactory *factory, const QString &path) : QTreeWidgetItem(parent, QStringList() << factory->properties().name << path.section('/',-1), TRANSPORT) { + setCheckState(0, InputSource::isEnabled(factory) ? Qt::Checked : Qt::Unchecked); m_has_about = factory->properties().hasAbout; m_has_config = factory->properties().hasSettings; m_factory = factory; @@ -205,7 +207,7 @@ void PluginItem::setEnabled(bool enabled) switch(type()) { case PluginItem::TRANSPORT: - //dynamic_cast<InputSourceFactory *>(m_factory) + InputSource::setEnabled(static_cast<InputSourceFactory *>(m_factory), enabled); break; case PluginItem::DECODER: Decoder::setEnabled(static_cast<DecoderFactory *>(m_factory), enabled); |
