X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Faddon%2Faddon_manager.cpp;h=7266c3e5eef751d52cf93e187f71235c0ab6721d;hb=HEAD;hp=1db62a815d1c29975fe1c9f3b4e7f00bf473149f;hpb=f30bc1786951b8be5c3888c87e5eae00f3b136a5;p=supertux.git diff --git a/src/addon/addon_manager.cpp b/src/addon/addon_manager.cpp index 1db62a815..7266c3e5e 100644 --- a/src/addon/addon_manager.cpp +++ b/src/addon/addon_manager.cpp @@ -48,7 +48,6 @@ MD5 md5_from_file(const std::string& filename) MD5 md5; - unsigned char buffer[1024]; PHYSFS_file* file = PHYSFS_openRead(filename.c_str()); if (!file) { @@ -60,6 +59,7 @@ MD5 md5_from_file(const std::string& filename) { while (true) { + unsigned char buffer[1024]; PHYSFS_sint64 len = PHYSFS_read(file, buffer, 1, sizeof(buffer)); if (len <= 0) break; md5.update(buffer, len); @@ -84,13 +84,11 @@ AddonManager::AddonManager(const std::string& addon_directory, std::vector& addon_config) : m_downloader(), m_addon_directory(addon_directory), - m_repository_url("http://addons.supertux.googlecode.com/git/index-0_4_0.nfo"), + m_repository_url("https://raw.githubusercontent.com/SuperTuxTeam/addons/master/index-0_4_0.nfo"), m_addon_config(addon_config), m_installed_addons(), m_repository_addons(), m_has_been_updated(false), - m_install_request(), - m_install_status(), m_transfer_status() { PHYSFS_mkdir(m_addon_directory.c_str()); @@ -112,6 +110,15 @@ AddonManager::AddonManager(const std::string& addon_directory, } } } + + try + { + m_repository_addons = parse_addon_infos("/addons/repository.nfo"); + } + catch(const std::exception& err) + { + log_warning << "parsing repository.nfo failed: " << err.what() << std::endl; + } } AddonManager::~AddonManager() @@ -203,32 +210,30 @@ AddonManager::has_been_updated() const return m_has_been_updated; } -AddonManager::InstallStatusPtr +TransferStatusPtr AddonManager::request_check_online() { - if (m_install_status) + if (m_transfer_status) { - throw std::runtime_error("only one addon install request allowed at a time"); + throw std::runtime_error("only async request can be made to AddonManager at a time"); } else { m_transfer_status = m_downloader.request_download(m_repository_url, "/addons/repository.nfo"); - m_transfer_status->then([this]{ - m_repository_addons = parse_addon_infos("/addons/repository.nfo"); - m_has_been_updated = true; + m_transfer_status->then( + [this](bool success) + { + m_transfer_status = {}; - if (m_install_status->callback) + if (success) { - m_install_status->callback(); + m_repository_addons = parse_addon_infos("/addons/repository.nfo"); + m_has_been_updated = true; } - - m_install_status = {}; - m_transfer_status = {}; }); - m_install_status = std::make_shared(); - return m_install_status; + return m_transfer_status; } } @@ -240,10 +245,10 @@ AddonManager::check_online() m_has_been_updated = true; } -AddonManager::InstallStatusPtr +TransferStatusPtr AddonManager::request_install_addon(const AddonId& addon_id) { - if (m_install_status) + if (m_transfer_status) { throw std::runtime_error("only one addon install request allowed at a time"); } @@ -270,60 +275,48 @@ AddonManager::request_install_addon(const AddonId& addon_id) } } - { - Addon& repository_addon = get_repository_addon(addon_id); + Addon& addon = get_repository_addon(addon_id); - m_install_request = std::make_shared(); - m_install_request->install_filename = FileSystem::join(m_addon_directory, repository_addon.get_filename()); - m_install_request->addon_id = addon_id; + std::string install_filename = FileSystem::join(m_addon_directory, addon.get_filename()); - m_transfer_status = m_downloader.request_download(repository_addon.get_url(), - m_install_request->install_filename); - } + m_transfer_status = m_downloader.request_download(addon.get_url(), install_filename); m_transfer_status->then( - [this] + [this, install_filename, addon_id](bool success) { - // complete the addon install - Addon& repository_addon = get_repository_addon(m_install_request->addon_id); + m_transfer_status = {}; - MD5 md5 = md5_from_file(m_install_request->install_filename); - if (repository_addon.get_md5() != md5.hex_digest()) + if (success) { - if (PHYSFS_delete(m_install_request->install_filename.c_str()) == 0) - { - log_warning << "PHYSFS_delete failed: " << PHYSFS_getLastError() << std::endl; - } + // complete the addon install + Addon& repository_addon = get_repository_addon(addon_id); - throw std::runtime_error("Downloading Add-on failed: MD5 checksums differ"); - } - else - { - const char* realdir = PHYSFS_getRealDir(m_install_request->install_filename.c_str()); - if (!realdir) + MD5 md5 = md5_from_file(install_filename); + if (repository_addon.get_md5() != md5.hex_digest()) { - throw std::runtime_error("PHYSFS_getRealDir failed: " + m_install_request->install_filename); + if (PHYSFS_delete(install_filename.c_str()) == 0) + { + log_warning << "PHYSFS_delete failed: " << PHYSFS_getLastError() << std::endl; + } + + throw std::runtime_error("Downloading Add-on failed: MD5 checksums differ"); } else { - add_installed_archive(m_install_request->install_filename, md5.hex_digest()); + const char* realdir = PHYSFS_getRealDir(install_filename.c_str()); + if (!realdir) + { + throw std::runtime_error("PHYSFS_getRealDir failed: " + install_filename); + } + else + { + add_installed_archive(install_filename, md5.hex_digest()); + } } } - - // signal that the request is done and cleanup - if (m_install_status->callback) - { - m_install_status->callback(); - } - - m_install_request = {}; - m_install_status = {}; - m_transfer_status = {}; }); - m_install_status = std::make_shared(); - - return m_install_status; + return m_transfer_status; } } @@ -603,24 +596,6 @@ void AddonManager::update() { m_downloader.update(); - - if (m_install_status) - { - m_install_status->now = m_transfer_status->dlnow; - m_install_status->total = m_transfer_status->dltotal; - } -} - -void -AddonManager::abort_install() -{ - log_info << "addon install aborted" << std::endl; - - m_downloader.abort(m_transfer_status->id); - - m_install_request = {}; - m_install_status = {}; - m_transfer_status = {}; } /* EOF */