#ifndef HEADER_SUPERTUX_ADDON_DOWNLOADER_HPP
#define HEADER_SUPERTUX_ADDON_DOWNLOADER_HPP
+#include <curl/curl.h>
+#include <curl/easy.h>
+#include <functional>
+#include <memory>
#include <string>
+#include <vector>
+
+typedef int TransferId;
+
+class TransferStatus
+{
+public:
+ enum Status { RUNNING, COMPLETED, ABORT, ERROR };
+
+public:
+ TransferId id;
+ Status status;
+ int dltotal;
+ int dlnow;
+ int ultotal;
+ int ulnow;
+ std::function<void ()> callback;
+
+ TransferStatus(TransferId id_) :
+ id(id_),
+ status(RUNNING),
+ dltotal(0),
+ dlnow(0),
+ ultotal(0),
+ ulnow(0),
+ callback()
+ {}
+
+ void then(const std::function<void ()>& callback_)
+ {
+ callback = callback_;
+ }
+};
+
+typedef std::shared_ptr<TransferStatus> TransferStatusPtr;
+
+class Transfer;
class Downloader
{
private:
+ CURLM* m_multi_handle;
+ std::vector<std::unique_ptr<Transfer> > m_transfers;
+ int m_next_transfer_id;
+
public:
Downloader();
~Downloader();
size_t (*write_func)(void* ptr, size_t size, size_t nmemb, void* userdata),
void* userdata);
+ void update();
+
+ TransferStatusPtr request_download(const std::string& url, const std::string& filename);
+ void abort(TransferId id);
+
private:
Downloader(const Downloader&) = delete;
Downloader& operator=(const Downloader&) = delete;