#include <dpl/log/log.h>
#include <dpl/exception.h>
+#include <dpl/utils/path.h>
#include <dpl/wrt-dao-ro/global_config.h>
-#include <dpl/wrt-dao-rw/plugin_dao.h>
#include <dpl/wrt-dao-rw/feature_dao.h>
#include <dpl/foreach.h>
#include <dpl/wrt-dao-ro/WrtDatabase.h>
return installedPluginsCount;
}
+void PluginsInstaller::uninstallPlugin(WrtDB::DbPluginHandle handle, const PluginDAOReadOnly& dao)
+{
+ LogDebug("Unregister plugin: %s ..." << dao.getLibraryName());
+
+ // mark dependent plugins as waiting when their dependency disappered
+ auto dependentPlugins = *dao.getLibraryDependentPlugins();
+ FOREACH(pl, dependentPlugins) {
+ PluginDAO::setPluginInstallationStatus(*pl, PluginDAO::INSTALLATION_WAITING);
+ PluginDAO::unregisterPluginLibrariesDependencies(*pl);
+ }
+
+ PluginDAO::unregisterPlugin(handle);
+}
+
+int PluginsInstaller::uninstallMissingAndChangedPlugins()
+{
+ int uninstalled = 0;
+ WrtDB::PluginHandleList list = PluginDAO::getPluginHandleList();
+ FOREACH(item, list)
+ {
+ Try {
+ PluginDAOReadOnly dao(*item);
+ DPL::Utils::Path libPath(dao.getLibraryPath());
+ if (!libPath.Exists()) {
+ // plugin deleted
+ uninstallPlugin(*item, dao);
+ ++uninstalled;
+ } else {
+ std::time_t timestamp = libPath.LastWriteTime();
+ if (timestamp != dao.getLibraryTimestamp()) {
+ // plugin updated
+ uninstallPlugin(*item, dao);
+ ++uninstalled;
+ }
+ }
+ } Catch(PluginDAOReadOnly::Exception::PluginNotExist) {
+ // ignore, plugin may be already removed
+ }
+ }
+ return uninstalled;
+}
+
int PluginsInstaller::installWaitingPlugins()
{
PluginHandleSetPtr waitingPlugins;