diff options
author | Trent Nelson <trent.a.b.nelson@gmail.com> | 2013-11-14 20:39:17 -0500 |
---|---|---|
committer | Trent Nelson <trent.a.b.nelson@gmail.com> | 2014-01-23 16:41:13 -0700 |
commit | b0c88003c38106edbaf2cecc889bb85e3f0ad075 (patch) | |
tree | 753753cef86e1334e41848f8b3ab4edb095d9b92 | |
parent | 1d2ddb8986948595a00ead984114287e5abdcd0a (diff) |
Pivos: Speed up aborting addon repo update job.
-rw-r--r-- | xbmc/addons/Repository.cpp | 23 | ||||
-rw-r--r-- | xbmc/addons/Repository.h | 2 |
2 files changed, 22 insertions, 3 deletions
diff --git a/xbmc/addons/Repository.cpp b/xbmc/addons/Repository.cpp index addfb72480..9ed07b1cbc 100644 --- a/xbmc/addons/Repository.cpp +++ b/xbmc/addons/Repository.cpp @@ -107,6 +107,9 @@ CRepository::~CRepository() string CRepository::Checksum() const { + /* This code is duplicated in CRepositoryUpdateJob::GrabAddons(). + * If you make changes here, they may be applicable there, too. + */ string result; for (DirList::const_iterator it = m_dirs.begin(); it != m_dirs.end(); ++it) { @@ -232,6 +235,8 @@ bool CRepositoryUpdateJob::DoWork() map<string, AddonPtr> addons; for (VECADDONS::const_iterator i = m_repos.begin(); i != m_repos.end(); ++i) { + if (ShouldCancel(0, 0)) + return false; RepositoryPtr repo = boost::dynamic_pointer_cast<CRepository>(*i); VECADDONS newAddons = GrabAddons(repo); MergeAddons(addons, newAddons); @@ -322,16 +327,30 @@ bool CRepositoryUpdateJob::DoWork() VECADDONS CRepositoryUpdateJob::GrabAddons(RepositoryPtr& repo) { CAddonDatabase database; + VECADDONS addons; database.Open(); string checksum; database.GetRepoChecksum(repo->ID(),checksum); - string reposum = repo->Checksum(); - VECADDONS addons; + string reposum; + + /* This for loop is duplicated in CRepository::Checksum(). + * If you make changes here, they may be applicable there, too. + */ + for (CRepository::DirList::const_iterator it = repo->m_dirs.begin(); it != repo->m_dirs.end(); ++it) + { + if (ShouldCancel(0, 0)) + return addons; + if (!it->checksum.empty()) + reposum += CRepository::FetchChecksum(it->checksum); + } + if (checksum != reposum || checksum.empty()) { map<string, AddonPtr> uniqueAddons; for (CRepository::DirList::const_iterator it = repo->m_dirs.begin(); it != repo->m_dirs.end(); ++it) { + if (ShouldCancel(0, 0)) + return addons; VECADDONS addons2 = CRepository::Parse(*it); MergeAddons(uniqueAddons, addons2); } diff --git a/xbmc/addons/Repository.h b/xbmc/addons/Repository.h index 8d56360a8c..6a00379190 100644 --- a/xbmc/addons/Repository.h +++ b/xbmc/addons/Repository.h @@ -58,8 +58,8 @@ namespace ADDON DirList m_dirs; static VECADDONS Parse(const DirInfo& dir); - private: static std::string FetchChecksum(const std::string& url); + private: CRepository(const CRepository &rhs); }; |