[fix] correctly handle service addon rollback process
authoramet <amet.nospam@gmail.com>
Tue, 15 Jan 2013 16:26:28 +0000 (20:26 +0400)
committerS. Davilla <davilla@4pi.com>
Fri, 18 Jan 2013 15:22:29 +0000 (10:22 -0500)
xbmc/addons/AddonInstaller.cpp
xbmc/addons/GUIDialogAddonInfo.cpp

index dea044e..911a6ee 100644 (file)
@@ -556,12 +556,18 @@ bool CAddonInstallJob::OnPreInstall()
 
   if (m_addon->Type() == ADDON_SERVICE)
   {
+    CAddonDatabase database;
+    database.Open();
+    bool running = !database.IsAddonDisabled(m_addon->ID()); //grab a current state
+    database.DisableAddon(m_addon->ID(),false); // enable it so we can remove it??
+    // regrab from manager to have the correct path set
     AddonPtr addon;
     ADDON::CAddonMgr::Get().GetAddon(m_addon->ID(), addon);
     boost::shared_ptr<CService> service = boost::dynamic_pointer_cast<CService>(addon);
     if (service)
       service->Stop();
-    return true;
+    CAddonMgr::Get().RemoveAddon(m_addon->ID()); // remove it
+    return running;
   }
 
   if (m_addon->Type() == ADDON_PVRDLL)
@@ -669,12 +675,18 @@ void CAddonInstallJob::OnPostInstall(bool reloadAddon)
 
   if (m_addon->Type() == ADDON_SERVICE)
   {
-    // regrab from manager to have the correct path set
-    AddonPtr addon; 
-    CAddonMgr::Get().GetAddon(m_addon->ID(), addon);
-    boost::shared_ptr<CService> service = boost::dynamic_pointer_cast<CService>(addon);
-    if (service)
-      service->Start();
+    CAddonDatabase database;
+    database.Open();
+    database.DisableAddon(m_addon->ID(),!reloadAddon); //return it into state it was before OnPreInstall()
+    if (reloadAddon) // reload/start it if it was running
+    {
+      // regrab from manager to have the correct path set
+      AddonPtr addon; 
+      CAddonMgr::Get().GetAddon(m_addon->ID(), addon);
+      boost::shared_ptr<CService> service = boost::dynamic_pointer_cast<CService>(addon);
+      if (service)
+        service->Start();
+    }
   }
 
   if (m_addon->Type() == ADDON_REPOSITORY)
index a2275be..9c95424 100644 (file)
@@ -296,7 +296,9 @@ void CGUIDialogAddonInfo::OnRollback()
     CStdString path = "special://home/addons/packages/";
     path += m_localAddon->ID()+"-"+m_rollbackVersions[choice]+".zip";
     // needed as cpluff won't downgrade
-    CAddonMgr::Get().RemoveAddon(m_localAddon->ID());
+    if (!m_localAddon->IsType(ADDON_SERVICE))
+      //we will handle this for service addons in CAddonInstallJob::OnPostInstall
+      CAddonMgr::Get().RemoveAddon(m_localAddon->ID());
     CAddonInstaller::Get().InstallFromZip(path);
     database.RemoveAddonFromBlacklist(m_localAddon->ID(),m_rollbackVersions[choice]);
     Close();