bool CAddonInstaller::DoInstall(const AddonPtr &addon, const RepositoryPtr& repo, const std::string &hash /* = "" */, bool background /* = true */, bool modal /* = false */) { // check whether we already have the addon installing CSingleLock lock(m_critSection); if (m_downloadJobs.find(addon->ID()) != m_downloadJobs.end()) return false; CAddonInstallJob* installJob = new CAddonInstallJob(addon, repo, hash); if (background) { unsigned int jobID = CJobManager::GetInstance().AddJob(installJob, this); m_downloadJobs.insert(make_pair(addon->ID(), CDownloadJob(jobID))); return true; } m_downloadJobs.insert(make_pair(addon->ID(), CDownloadJob(0))); lock.Leave(); bool result = false; if (modal) result = installJob->DoModal(); else result = installJob->DoWork(); delete installJob; lock.Enter(); JobMap::iterator i = m_downloadJobs.find(addon->ID()); m_downloadJobs.erase(i); return result; }
bool CAddonInstaller::DoInstall(const AddonPtr &addon, const RepositoryPtr& repo, const std::string &hash /* = "" */, bool background /* = true */, bool modal /* = false */, bool autoUpdate /* = false*/) { // check whether we already have the addon installing CSingleLock lock(m_critSection); if (m_downloadJobs.find(addon->ID()) != m_downloadJobs.end()) return false; CAddonInstallJob* installJob = new CAddonInstallJob(addon, repo, hash, autoUpdate); if (background) { // Workaround: because CAddonInstallJob is blocking waiting for other jobs, it needs to be run // with priority dedicated. unsigned int jobID = CJobManager::GetInstance().AddJob(installJob, this, CJob::PRIORITY_DEDICATED); m_downloadJobs.insert(make_pair(addon->ID(), CDownloadJob(jobID))); m_idle.Reset(); return true; } m_downloadJobs.insert(make_pair(addon->ID(), CDownloadJob(0))); m_idle.Reset(); lock.Leave(); bool result = false; if (modal) result = installJob->DoModal(); else result = installJob->DoWork(); delete installJob; lock.Enter(); JobMap::iterator i = m_downloadJobs.find(addon->ID()); m_downloadJobs.erase(i); if (m_downloadJobs.empty()) m_idle.Set(); return result; }