aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrent Nelson <trent.a.b.nelson@gmail.com>2013-11-14 20:39:17 -0500
committerTrent Nelson <trent.a.b.nelson@gmail.com>2014-01-23 16:41:13 -0700
commitb0c88003c38106edbaf2cecc889bb85e3f0ad075 (patch)
tree753753cef86e1334e41848f8b3ab4edb095d9b92
parent1d2ddb8986948595a00ead984114287e5abdcd0a (diff)
Pivos: Speed up aborting addon repo update job.
-rw-r--r--xbmc/addons/Repository.cpp23
-rw-r--r--xbmc/addons/Repository.h2
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);
};