#include <vector>
#include "addon/downloader.hpp"
+#include "supertux/gameconfig.hpp"
#include "util/currenton.hpp"
#include "util/reader_fwd.hpp"
#include "util/writer_fwd.hpp"
/** Checks for, installs and removes Add-ons */
class AddonManager : public Currenton<AddonManager>
{
+public:
+ struct InstallStatus
+ {
+ InstallStatus() :
+ now(0),
+ total(0),
+ done(false)
+ {}
+
+ int now;
+ int total;
+ bool done;
+ };
+
+ struct InstallRequest
+ {
+ InstallRequest() :
+ addon_id(),
+ install_filename()
+ {}
+
+ std::string addon_id;
+ std::string install_filename;
+ };
+
+ using InstallStatusPtr = std::shared_ptr<InstallStatus>;
+ using InstallRequestPtr = std::shared_ptr<InstallRequest>;
+
private:
- typedef std::vector<std::unique_ptr<Addon> > AddonList;
+ using AddonList = std::vector<std::unique_ptr<Addon> >;
Downloader m_downloader;
std::string m_addon_directory;
std::string m_repository_url;
- std::vector<std::string>& m_ignored_addon_ids;
+ std::vector<Config::Addon>& m_addon_config;
AddonList m_installed_addons;
AddonList m_repository_addons;
+ bool m_has_been_updated;
+
+ InstallRequestPtr m_install_request;
+ InstallStatusPtr m_install_status;
+ TransferStatusPtr m_transfer_status;
+
public:
AddonManager(const std::string& addon_directory,
- std::vector<std::string>& enabled_addons_);
+ std::vector<Config::Addon>& addon_config);
~AddonManager();
bool has_online_support() const;
+ bool has_been_updated() const;
void check_online();
std::vector<AddonId> get_repository_addons() const;
Addon& get_repository_addon(const AddonId& addon);
Addon& get_installed_addon(const AddonId& addon);
+ InstallStatusPtr request_install_addon(const AddonId& addon_id);
void install_addon(const AddonId& addon_id);
void uninstall_addon(const AddonId& addon_id);
void enable_addon(const AddonId& addon_id);
void disable_addon(const AddonId& addon_id);
+ void update();
+
private:
std::vector<std::string> scan_for_archives() const;
void add_installed_addons();
/** add \a archive, given as physfs path, to the list of installed
archives */
- void add_installed_archive(const std::string& archive);
+ void add_installed_archive(const std::string& archive, const std::string& md5);
/** search for an .nfo file in the top level directory that
originates from \a archive, \a archive is a OS path */