void PluginCollection::scanPlugins() { QMap<QString,QString> backup = _installedPluginNames; bool changed = false; _installedPlugins.clear(); _installedPluginNames.clear(); QStringList dirs = KGlobal::dirs()->resourceDirs("kstplugins"); dirs += KGlobal::dirs()->resourceDirs("kstpluginlib"); for (QStringList::ConstIterator it = dirs.begin(); it != dirs.end(); ++it) { //kdDebug() << "Scanning [" << *it << "] for plugins." << endl; QDir d(*it); d.setFilter(QDir::Files | QDir::NoSymLinks); d.setNameFilter("*.xml"); const QFileInfoList *list = d.entryInfoList(); if (!list) { continue; } QFileInfoListIterator fit(*list); QFileInfo *fi; while ((fi = fit.current()) != 0L) { if (_parser->parseFile(*it + fi->fileName()) == 0) { // dupe? - prefer earlier installations if (_installedPluginNames.contains(_parser->data()._name)) { ++fit; continue; } _installedPlugins[*it + fi->fileName()] = _parser->data(); _installedPluginNames[_parser->data()._name] = *it + fi->fileName(); if (!backup.contains(_parser->data()._name)) { emit pluginInstalled(_parser->data()._name); changed = true; } else { backup.remove(_parser->data()._name); } } else { KstDebug::self()->log(i18n("Error parsing XML file '%1'; skipping.").arg(*it + fi->fileName()), KstDebug::Warning); } ++fit; } } while (!backup.isEmpty()) { KstDebug::self()->log(i18n("Detected disappearance of '%1'.").arg(backup.begin().key())); emit pluginRemoved(backup.begin().key()); backup.remove(backup.begin()); changed = true; } if (changed) { emit pluginListChanged(); } }
void PanelPluginsModel::removePlugin(pluginslist_t::iterator plugin) { if (mPlugins.end() != plugin) { mPanel->settings()->remove(plugin->first); Plugin * p = plugin->second.data(); const int row = plugin - mPlugins.begin(); beginRemoveRows(QModelIndex(), row, row); mPlugins.erase(plugin); endRemoveRows(); mActive = mPlugins.isEmpty() ? QModelIndex() : createIndex(mPlugins.size() > row ? row : row - 1, 0); emit pluginRemoved(p); // p can be nullptr mPanel->settings()->setValue(mNamesKey, pluginNames()); if (nullptr != p) p->deleteLater(); } }
int PluginCollection::deletePlugin(const QString& xmlfile, const QString& object) { QString pname = _installedPlugins[xmlfile]._name; QFile::remove(xmlfile); if (object.isEmpty()) { QString f = xmlfile; f.replace(QRegExp(".xml$"), ".so"); QFile::remove(f); } else { QFile::remove(object); } _installedPlugins.remove(xmlfile); _installedPluginNames.remove(pname); emit pluginRemoved(pname); return 0; }