MD5 md5;
- unsigned char buffer[1024];
PHYSFS_file* file = PHYSFS_openRead(filename.c_str());
if (!file)
{
{
while (true)
{
+ unsigned char buffer[1024];
PHYSFS_sint64 len = PHYSFS_read(file, buffer, 1, sizeof(buffer));
if (len <= 0) break;
md5.update(buffer, len);
std::vector<Config::Addon>& 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());
}
}
}
+
+ 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()
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<InstallStatus>();
- return m_install_status;
+ return m_transfer_status;
}
}
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");
}
}
}
- {
- Addon& repository_addon = get_repository_addon(addon_id);
+ Addon& addon = get_repository_addon(addon_id);
- m_install_request = std::make_shared<InstallRequest>();
- 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<InstallStatus>();
-
- return m_install_status;
+ return m_transfer_status;
}
}
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 */