aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmp/decoder.cpp3
-rw-r--r--src/qmmp/decoder.h5
-rw-r--r--src/qmmp/inputsource.cpp130
-rw-r--r--src/qmmp/inputsource.h23
-rw-r--r--src/qmmp/inputsourcefactory.h2
-rw-r--r--src/qmmp/qmmpplugincache.cpp18
-rw-r--r--src/qmmp/qmmpplugincache_p.h3
-rw-r--r--src/qmmpui/pluginitem.cpp6
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);