diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index 07bdb00bc345e..a46a35ef7fe46 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -13395,10 +13395,7 @@ msgctxt "#24047" msgid "This add-on can't be uninstalled" msgstr "" -#: skin.confluence -msgctxt "#24048" -msgid "Rollback" -msgstr "" +#empty string with id 24048 #: xbmc/filesystem/AddonsDirectory.cpp msgctxt "#24049" @@ -13636,14 +13633,11 @@ msgctxt "#24093" msgid "Checking %s..." msgstr "" -#: xbmc/addons/guidialogaddoninfo.cpp -msgctxt "#24094" -msgid "(current)" -msgstr "" +#empty string with id 24094 -#: xbmc/addons/guidialogaddoninfo.cpp +#: xbmc/addons/GUIDialogAddonInfo.cpp msgctxt "#24095" -msgid "(blacklisted)" +msgid "Local package cache" msgstr "" #: xbmc/addons/Repository.cpp diff --git a/addons/skin.confluence/720p/DialogAddonInfo.xml b/addons/skin.confluence/720p/DialogAddonInfo.xml index fefdc2be52ece..3802a0c6ead6d 100644 --- a/addons/skin.confluence/720p/DialogAddonInfo.xml +++ b/addons/skin.confluence/720p/DialogAddonInfo.xml @@ -321,14 +321,6 @@ center font12_title - - Rollback button - 220 - 43 - - center - font12_title - Changelog button 220 diff --git a/xbmc/addons/AddonInstaller.cpp b/xbmc/addons/AddonInstaller.cpp index ceb5ec29c4bb9..6c58a04ec0110 100644 --- a/xbmc/addons/AddonInstaller.cpp +++ b/xbmc/addons/AddonInstaller.cpp @@ -259,6 +259,8 @@ bool CAddonInstaller::InstallFromZip(const std::string &path) if (!g_passwordManager.CheckMenuLock(WINDOW_ADDON_BROWSER)) return false; + CLog::Log(LOGDEBUG, "CAddonInstaller: installing from zip '%s'", CURL::GetRedacted(path).c_str()); + // grab the descriptive XML document from the zip, and read it in CFileItemList items; // BUG: some zip files return a single item (root folder) that we think is stored, so we don't use the zip:// protocol diff --git a/xbmc/addons/GUIDialogAddonInfo.cpp b/xbmc/addons/GUIDialogAddonInfo.cpp index 8acb9d599f89a..82a58cd9fdd1f 100644 --- a/xbmc/addons/GUIDialogAddonInfo.cpp +++ b/xbmc/addons/GUIDialogAddonInfo.cpp @@ -51,7 +51,6 @@ #define CONTROL_BTN_UPDATE 8 #define CONTROL_BTN_SETTINGS 9 #define CONTROL_BTN_CHANGELOG 10 -#define CONTROL_BTN_ROLLBACK 11 #define CONTROL_BTN_SELECT 12 using namespace ADDON; @@ -140,11 +139,6 @@ bool CGUIDialogAddonInfo::OnMessage(CGUIMessage& message) OnChangeLog(); return true; } - else if (iControl == CONTROL_BTN_ROLLBACK) - { - OnRollback(); - return true; - } } break; default: @@ -175,9 +169,6 @@ void CGUIDialogAddonInfo::UpdateControls() { bool isInstalled = NULL != m_localAddon.get(); bool isEnabled = isInstalled && m_item->GetProperty("Addon.Enabled").asBoolean(); - if (isInstalled) - GrabRollbackVersions(); - bool canDisable = isInstalled && CAddonMgr::GetInstance().CanAddonBeDisabled(m_localAddon->ID()); bool canInstall = !isInstalled && m_item->GetProperty("Addon.Broken").empty(); bool isRepo = (isInstalled && m_localAddon->Type() == ADDON_REPOSITORY) || (m_addon && m_addon->Type() == ADDON_REPOSITORY); @@ -196,9 +187,15 @@ void CGUIDialogAddonInfo::UpdateControls() CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_SETTINGS, isInstalled && m_localAddon->HasSettings()); CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_CHANGELOG, !isRepo); - CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_ROLLBACK, m_rollbackVersions.size() > 1); } +static const std::string LOCAL_CACHE = "special_local_cache"; + +static bool CompareVersion(const std::pair& lhs, const std::pair& rhs) +{ + return lhs.first > rhs.first; +}; + void CGUIDialogAddonInfo::OnUpdate() { Close(); @@ -214,25 +211,54 @@ void CGUIDialogAddonInfo::OnUpdate() if (!database.GetAvailableVersions(m_localAddon->ID(), versions)) return; + CFileItemList items; + if (XFILE::CDirectory::GetDirectory("special://home/addons/packages/", items, ".zip", DIR_FLAG_NO_FILE_DIRS)) + { + for (int i = 0; i < items.Size(); ++i) + { + std::string packageId; + std::string versionString; + if (AddonVersion::SplitFileName(packageId, versionString, items[i]->GetLabel())) + { + if (packageId == m_localAddon->ID()) + { + std::string hash; + std::string path(items[i]->GetPath()); + if (database.GetPackageHash(m_localAddon->ID(), items[i]->GetPath(), hash)) + { + std::string md5 = CUtil::GetFileMD5(path); + if (md5 == hash) + versions.push_back(std::make_pair(AddonVersion(versionString), LOCAL_CACHE)); + } + } + } + } + } + auto* dialog = static_cast(g_windowManager.GetWindow(WINDOW_DIALOG_SELECT)); dialog->Reset(); dialog->SetHeading(CVariant{21338}); dialog->SetUseDetails(true); - std::sort(versions.begin(), versions.end(), std::greater>()); + std::stable_sort(versions.begin(), versions.end(), CompareVersion); - for (const auto& version : versions) + for (const auto& versionInfo : versions) { + CFileItem item(StringUtils::Format(g_localizeStrings.Get(21339).c_str(), versionInfo.first.asString().c_str())); + if (versionInfo.first == m_localAddon->Version()) + item.Select(true); + AddonPtr repo; - if (CAddonMgr::GetInstance().GetAddon(version.second, repo, ADDON_REPOSITORY)) + if (versionInfo.second == LOCAL_CACHE) + { + item.SetProperty("Addon.Summary", g_localizeStrings.Get(24095)); + item.SetIconImage("DefaultAddonRepository.png"); + dialog->Add(item); + } + else if (CAddonMgr::GetInstance().GetAddon(versionInfo.second, repo, ADDON_REPOSITORY)) { - CFileItem item(StringUtils::Format(g_localizeStrings.Get(21339).c_str(), version.first.asString().c_str())); item.SetProperty("Addon.Summary", repo->Name()); item.SetIconImage(repo->Icon()); - - if (m_localAddon->Version() == version.first) - item.Select(true); - dialog->Add(item); } } @@ -241,17 +267,19 @@ void CGUIDialogAddonInfo::OnUpdate() if (dialog->IsConfirmed()) { auto selected = versions.at(dialog->GetSelectedLabel()); - if (!selected.second.empty()) - { - //add or remove from blacklist to toggle auto updating. if downgrading - //turn off, if upgrading to latest turn it back on - if (selected.first < m_localAddon->Version()) - database.BlacklistAddon(m_localAddon->ID()); - if (selected.first == versions.at(0).first) - database.RemoveAddonFromBlacklist(m_localAddon->ID()); + //add or remove from blacklist to toggle auto updating. if downgrading + //turn off, if upgrading to latest turn it back on + if (selected.first < m_localAddon->Version()) + database.BlacklistAddon(m_localAddon->ID()); + if (selected.first == versions.at(0).first) + database.RemoveAddonFromBlacklist(m_localAddon->ID()); + + if (selected.second == LOCAL_CACHE) + CAddonInstaller::GetInstance().InstallFromZip(StringUtils::Format("special://home/addons/packages/%s-%s.zip", + m_localAddon->ID().c_str(), selected.first.asString().c_str())); + else CAddonInstaller::GetInstance().Install(m_addon->ID(), selected.first, selected.second); - } } } @@ -403,47 +431,6 @@ void CGUIDialogAddonInfo::OnChangeLog() m_changelog = false; } -void CGUIDialogAddonInfo::OnRollback() -{ - if (!g_passwordManager.CheckMenuLock(WINDOW_ADDON_BROWSER)) - return; - - CGUIDialogContextMenu* dlg = (CGUIDialogContextMenu*)g_windowManager.GetWindow(WINDOW_DIALOG_CONTEXT_MENU); - CAddonDatabase database; - database.Open(); - - CContextButtons buttons; - for (unsigned int i=0;iVersion().asString()) - label += " "+g_localizeStrings.Get(24094); - if (database.IsAddonBlacklisted(m_localAddon->ID(),label)) - label += " "+g_localizeStrings.Get(24095); - - buttons.Add(i,label); - } - int choice; - if ((choice=dlg->ShowAndGetChoice(buttons)) > -1) - { - // blacklist everything newer - //FIXME: broken. never been possible to have multiple versions in the blacklist - for (unsigned int j=choice+1;jID(),m_rollbackVersions[j]); - std::string path = "special://home/addons/packages/"; - path += m_localAddon->ID()+"-"+m_rollbackVersions[choice]+".zip"; - - //FIXME: this is probably broken - // needed as cpluff won't downgrade - if (!m_localAddon->IsType(ADDON_SERVICE)) - //we will handle this for service addons in CAddonInstallJob::OnPostInstall - CAddonMgr::GetInstance().UnregisterAddon(m_localAddon->ID()); - CAddonInstaller::GetInstance().InstallFromZip(path); - database.RemoveAddonFromBlacklist(m_localAddon->ID(),m_rollbackVersions[choice]); - Close(); - } -} - bool CGUIDialogAddonInfo::ShowForItem(const CFileItemPtr& item) { CGUIDialogAddonInfo* dialog = (CGUIDialogAddonInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_ADDON_INFO); @@ -459,7 +446,6 @@ bool CGUIDialogAddonInfo::ShowForItem(const CFileItemPtr& item) bool CGUIDialogAddonInfo::SetItem(const CFileItemPtr& item) { *m_item = *item; - m_rollbackVersions.clear(); // grab the local addon, if it's available m_localAddon.reset(); @@ -528,35 +514,3 @@ void CGUIDialogAddonInfo::OnJobComplete(unsigned int jobID, bool success, CGUIMessage msg(GUI_MSG_NOTIFY_ALL, WINDOW_DIALOG_TEXT_VIEWER, 0, GUI_MSG_UPDATE); g_windowManager.SendThreadMessage(msg); } - -void CGUIDialogAddonInfo::GrabRollbackVersions() -{ - CFileItemList items; - XFILE::CDirectory::GetDirectory("special://home/addons/packages/",items,".zip",DIR_FLAG_NO_FILE_DIRS); - items.Sort(SortByLabel, SortOrderAscending); - CAddonDatabase db; - db.Open(); - for (int i=0;im_bIsFolder) - continue; - std::string ID, version; - AddonVersion::SplitFileName(ID,version,items[i]->GetLabel()); - if (ID == m_localAddon->ID()) - { - std::string hash, path(items[i]->GetPath()); - if (db.GetPackageHash(m_localAddon->ID(), path, hash)) - { - std::string md5 = CUtil::GetFileMD5(path); - if (md5 == hash) - m_rollbackVersions.push_back(version); - else /* The package has been corrupted */ - { - CLog::Log(LOGWARNING, "%s: Removing corrupt addon package %s.", __FUNCTION__, path.c_str()); - CFile::Delete(path); - db.RemovePackage(path); - } - } - } - } -} diff --git a/xbmc/addons/GUIDialogAddonInfo.h b/xbmc/addons/GUIDialogAddonInfo.h index f146eff081a58..3e44824523bb7 100644 --- a/xbmc/addons/GUIDialogAddonInfo.h +++ b/xbmc/addons/GUIDialogAddonInfo.h @@ -58,7 +58,6 @@ class CGUIDialogAddonInfo : void OnEnable(bool enable); void OnSettings(); void OnChangeLog(); - void OnRollback(); void OnSelect(); /*! Returns true if current addon can be opened (i.e is a plugin)*/ @@ -84,9 +83,5 @@ class CGUIDialogAddonInfo : ADDON::AddonPtr m_localAddon; unsigned int m_jobid; bool m_changelog; - - // rollback data - void GrabRollbackVersions(); - std::vector m_rollbackVersions; };