23 #include <QApplication> 25 #include <QLatin1Char> 27 #include <QLibraryInfo> 28 #include <QMutableListIterator> 30 #include <QVariantList> 33 #include <KConfigGroup> 34 #include <KLocalizedString> 35 #include <KMainWindow> 36 #include <KPluginInfo> 37 #include <KPluginFactory> 38 #include <KPluginTrader> 39 #include <KSharedConfig> 57 QMap<QString, Kwave::PluginManager::PluginModule>
65 :m_plugin_instances(),
67 m_parent_widget(parent),
68 m_signal_manager(signal_manager),
69 m_view_manager(Q_NULLPTR)
93 QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
111 if (factory)
delete factory;
138 plugin->load(last_params);
148 qWarning(
"PluginManager::loadAllPlugins(): removing '%s' " 149 "from list",
DBG(name));
161 Q_ASSERT(this->thread() == QThread::currentThread());
162 Q_ASSERT(this->thread() == qApp->thread());
166 if (plugin && plugin->isRunning())
176 Q_ASSERT(this->thread() == QThread::currentThread());
177 Q_ASSERT(this->thread() == qApp->thread());
182 i18n(
"The plugin '%1' is unknown or invalid.", name),
183 i18n(
"Error On Loading Plugin"));
191 KPluginFactory *factory = info.
m_factory;
201 qWarning(
"PluginManager::loadPlugin('%s'): out of memory",
DBG(name));
223 Q_ASSERT(this->thread() == QThread::currentThread());
224 Q_ASSERT(this->thread() == qApp->thread());
231 if (!plugin)
return -ENOMEM;
236 result = plugin->start(*params);
240 qDebug(
"PluginManager: plugin closed itself in start()");
245 if (plugin && (result >= 0)) {
246 plugin->execute(*params);
253 params = plugin->setup(last_params);
267 command =
_(
"plugin:execute(");
269 foreach (
const QString &p, *params)
270 command +=
_(
", ") + p;
278 if (plugin) plugin->release();
282 if (command.length()) emit
sigCommand(command);
291 Q_ASSERT(this->thread() == QThread::currentThread());
292 Q_ASSERT(this->thread() == qApp->thread());
296 if (plugin && !plugin->canClose())
return false;
305 Q_ASSERT(this->thread() == QThread::currentThread());
306 Q_ASSERT(this->thread() == qApp->thread());
310 if (plugin && plugin->isRunning())
return true;
319 Q_ASSERT(this->thread() == QThread::currentThread());
320 Q_ASSERT(this->thread() == qApp->thread());
324 qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
329 qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
336 const QStringList ¶ms)
340 if (!plugin)
return -ENOMEM;
343 QStringList prev_params = (params.isEmpty()) ?
347 QStringList *new_params = plugin->
setup(prev_params);
366 QString section =
_(
"plugin ");
375 Q_ASSERT(KSharedConfig::openConfig());
376 if (!KSharedConfig::openConfig())
return list;
377 KConfigGroup cfg = KSharedConfig::openConfig()->group(section);
381 def_version = cfg.readEntry(
"version");
382 if (!def_version.length()) {
385 if (!(def_version == version)) {
386 qDebug(
"PluginManager::defaultParams: " 387 "plugin '%s': defaults for version '%s' not loaded, found " 388 "old ones of version '%s'.",
389 DBG(name),
DBG(version),
DBG(def_version));
392 cfg.deleteEntry(
"version");
393 cfg.deleteEntry(
"defaults");
398 list = cfg.readEntry(
"defaults").split(QLatin1Char(
','));
412 QString section =
_(
"plugin ");
415 Q_ASSERT(KSharedConfig::openConfig());
416 if (!KSharedConfig::openConfig())
return;
417 KConfigGroup cfg = KSharedConfig::openConfig()->group(section);
420 cfg.writeEntry(
"version", version);
421 cfg.writeEntry(
"defaults", params.join(QLatin1Char(
',')));
464 tracks, playback_params);
465 if (!device)
return Q_NULLPTR;
509 Q_ASSERT(this->thread() == QThread::currentThread());
510 Q_ASSERT(this->thread() == qApp->thread());
543 Q_ASSERT(this->thread() == QThread::currentThread());
544 Q_ASSERT(this->thread() == qApp->thread());
563 plugin, SLOT(close()));
567 Qt::QueuedConnection);
571 Qt::DirectConnection);
575 Qt::QueuedConnection);
591 plugin, SLOT(close()));
616 KPluginInfo::List plugins = KPluginTrader::self()->query(
617 _(
"kwave"),
_(
"Kwave/Plugin")
619 foreach (
const KPluginInfo &i, plugins) {
620 QString library = i.libraryPath();
621 QString description = i.name();
622 QString
name = i.pluginName();
623 QString version_raw = i.version();
626 QString author = i.author();
628 if (version_raw.contains(
_(
":"))) {
629 version = version_raw.split(
_(
":")).at(0);
630 settings = version_raw.split(
_(
":")).at(1);
639 if ( library.isEmpty() || description.isEmpty() ||
640 name.isEmpty() || version.isEmpty() ) {
641 qWarning(
"plugin '%s' has no library, name or version",
DBG(name));
645 if (version !=
_(KWAVE_VERSION)) {
646 qWarning(
"plugin '%s' has wrong ABI version: '%s' (should be %s)",
647 DBG(name),
DBG(version), KWAVE_VERSION);
651 KPluginLoader loader(library);
652 KPluginFactory* factory = loader.factory();
654 qWarning(
"plugin '%s': loading failed",
DBG(name));
658 emit
sigProgress(i18n(
"Loading plugin %1...", name));
659 QApplication::processEvents();
671 qDebug(
"%16s %5s written by %s",
DBG(name),
DBG(settings),
DBG(author));
678 const QList<Kwave::PluginManager::PluginModule>
688 Q_ASSERT(this->thread() == QThread::currentThread());
689 Q_ASSERT(this->thread() == qApp->thread());
void sigCommand(const QString &command)
void pluginClosed(Kwave::Plugin *p)
void selectRange(sample_index_t offset, sample_index_t length)
sample_index_t first() const
void sigProgress(const QString &message)
QPointer< Kwave::Plugin > KwavePluginPointer
const QList< PluginModule > pluginInfoList() const
void enqueueCommand(const QString &command)
void registerViewManager(Kwave::ViewManager *view_manager)
void savePluginDefaults(const QString &name, QStringList ¶ms)
sample_index_t last() const
Kwave::SampleSink * openMultiTrackPlayback(unsigned int tracks, const Kwave::PlayBackParam *playback_params=Q_NULLPTR)
ViewManager * m_view_manager
Kwave::PlaybackController & playbackController()
void setPluginManager(Kwave::PluginManager *new_plugin_manager)
Kwave::Selection & selection()
virtual void insertView(Kwave::SignalView *view, QWidget *controls)=0
int setupPlugin(const QString &name, const QStringList ¶ms)
Kwave::PlaybackController & playbackController()
void pluginStarted(Kwave::Plugin *p)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
Kwave::Plugin * createPluginInstance(const QString &name)
PluginList m_plugin_instances
void migratePluginToActiveContext(Kwave::Plugin *plugin)
void connectPlugin(Kwave::Plugin *plugin)
static Kwave::PluginManager * m_active_instance
sample_index_t signalLength()
static int error(QWidget *widget, QString message, QString caption=QString())
void disconnectPlugin(Kwave::Plugin *plugin)
int executePlugin(const QString &name, QStringList *params)
KPluginFactory * m_factory
Kwave::SignalManager & m_signal_manager
static QMap< QString, PluginModule > m_plugin_modules
sample_index_t selectionStart()
void setSignalName(const QString &name)
void sigSignalNameChanged(const QString &name)
void Q_DECL_EXPORT yield()
Kwave::PlayBackDevice * openDevice(int tracks, const Kwave::PlayBackParam *playback_params)
QPointer< QWidget > m_parent_widget
sample_index_t selectionEnd()
void searchPluginModules()
void insertView(Kwave::SignalView *view, QWidget *controls)
void pluginDone(Kwave::Plugin *p)
PluginList m_running_plugins
PluginManager(QWidget *parent, Kwave::SignalManager &signal_manager)
virtual QStringList * setup(QStringList &previous_params)
QStringList defaultParams(const QString &name)
void selectRange(sample_index_t offset, sample_index_t length)