Merge pull request #4645 from jmarshallnz/install_from_zip_not_packages
[vuplus_xbmc] / xbmc / addons / AddonInstaller.cpp
index 73562b4..4598615 100644 (file)
@@ -80,15 +80,16 @@ void CAddonInstaller::OnJobComplete(unsigned int jobID, bool success, CJob* job)
   { // repo job finished
     m_repoUpdateDone.Set();
     m_repoUpdateJob = 0;
+    lock.Leave();
   }
   else
   { // download job
     JobMap::iterator i = find_if(m_downloadJobs.begin(), m_downloadJobs.end(), bind2nd(find_map(), jobID));
     if (i != m_downloadJobs.end())
       m_downloadJobs.erase(i);
+    lock.Leave();
     PrunePackageCache();
   }
-  lock.Leave();
 
   CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE);
   g_windowManager.SendThreadMessage(msg);
@@ -288,7 +289,7 @@ bool CAddonInstaller::InstallFromZip(const CStdString &path)
   if (xml.LoadFile(archive) && CAddonMgr::Get().LoadAddonDescriptionFromMemory(xml.RootElement(), addon))
   {
     // set the correct path
-    addon->Props().path = path;
+    addon->Props().path = items[0]->GetPath();
 
     // install the addon
     return DoInstall(addon);
@@ -307,20 +308,22 @@ void CAddonInstaller::InstallFromXBMCRepo(const set<CStdString> &addonIDs)
     Install(*i);
 }
 
-bool CAddonInstaller::CheckDependencies(const AddonPtr &addon)
+bool CAddonInstaller::CheckDependencies(const AddonPtr &addon, CAddonDatabase *database /* = NULL */)
 {
   std::vector<std::string> preDeps;
   preDeps.push_back(addon->ID());
-  return CheckDependencies(addon, preDeps);
+  CAddonDatabase localDB;
+  if (!database)
+    database = &localDB;
+  return CheckDependencies(addon, preDeps, *database);
 }
 
 bool CAddonInstaller::CheckDependencies(const AddonPtr &addon,
-                                        std::vector<std::string>& preDeps)
+                                        std::vector<std::string>& preDeps, CAddonDatabase &database)
 {
   if (!addon.get())
     return true; // a NULL addon has no dependencies
   ADDONDEPS deps = addon->GetDeps();
-  CAddonDatabase database;
   database.Open();
   for (ADDONDEPS::const_iterator i = deps.begin(); i != deps.end(); ++i)
   {
@@ -334,6 +337,7 @@ bool CAddonInstaller::CheckDependencies(const AddonPtr &addon,
       if (!database.GetAddon(addonID, dep) || !dep->MeetsVersion(version))
       { // we don't have it in a repo, or we have it but the version isn't good enough, so dep isn't satisfied.
         CLog::Log(LOGDEBUG, "Addon %s requires %s version %s which is not available", addon->ID().c_str(), addonID.c_str(), version.c_str());
+        database.Close();
         return false;
       }
     }
@@ -341,11 +345,15 @@ bool CAddonInstaller::CheckDependencies(const AddonPtr &addon,
     // TODO: should we assume that installed deps are OK?
     if (dep && std::find(preDeps.begin(), preDeps.end(), dep->ID()) == preDeps.end())
     {
-      if (!CheckDependencies(dep, preDeps))
+      if (!CheckDependencies(dep, preDeps, database))
+      {
+        database.Close();
         return false;
+      }
       preDeps.push_back(dep->ID());
     }
   }
+  database.Close();
   return true;
 }
 
@@ -726,7 +734,10 @@ void CAddonInstallJob::OnPostInstall(bool reloadAddon)
         toast->ResetTimer();
         toast->Close(true);
       }
-      CSettings::Get().SetString("lookandfeel.skin",m_addon->ID().c_str());
+      if (CSettings::Get().GetString("lookandfeel.skin") == m_addon->ID())
+        CApplicationMessenger::Get().ExecBuiltIn("ReloadSkin", true);
+      else
+        CSettings::Get().SetString("lookandfeel.skin",m_addon->ID().c_str());
     }
   }