tizen 2.4 release
[framework/web/wrt-plugins-common.git] / src / plugins-installer / plugin_installer.cpp
@@ -43,8 +43,8 @@
 
 #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>
@@ -451,6 +451,48 @@ int PluginsInstaller::installAllPlugins()
     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;