#include <string>
#include <vector>
-class Transfer
+typedef int TransferId;
+class Downloader;
+
+class TransferStatus
{
public:
- virtual ~Transfer() {}
- virtual void abort() = 0;
+ Downloader& m_downloader;
+ TransferId id;
+ std::vector<std::function<void (bool)> > callbacks;
+
+ int dltotal;
+ int dlnow;
+ int ultotal;
+ int ulnow;
+
+ std::string error_msg;
+
+ TransferStatus(Downloader& downloader, TransferId id_) :
+ m_downloader(downloader),
+ id(id_),
+ callbacks(),
+ dltotal(0),
+ dlnow(0),
+ ultotal(0),
+ ulnow(0),
+ error_msg()
+ {}
+
+ void abort();
+ void update();
+
+ void then(const std::function<void (bool)>& callback)
+ {
+ callbacks.push_back(callback);
+ }
};
-typedef Transfer* TransferHandle;
+using TransferStatusPtr = std::shared_ptr<TransferStatus>;
-class cURLTransfer;
+class Transfer;
class Downloader
{
private:
CURLM* m_multi_handle;
- std::vector<std::unique_ptr<cURLTransfer> > m_transfers;
+ std::vector<std::unique_ptr<Transfer> > m_transfers;
+ int m_next_transfer_id;
public:
Downloader();
void* userdata);
void update();
- TransferHandle request_download(const std::string& url, const std::string& filename);
- void abort(const cURLTransfer& transfer);
+ TransferStatusPtr request_download(const std::string& url, const std::string& filename);
+ void abort(TransferId id);
private:
Downloader(const Downloader&) = delete;