Updated addon repository URL and improved debug output on download
[supertux.git] / src / addon / addon_manager.cpp
index 1db62a8..7266c3e 100644 (file)
@@ -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<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());
@@ -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<InstallStatus>();
-    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<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;
   }
 }
 
@@ -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 */