#include "curl_download.h" #include size_t curl_w_callback(char *ptr, size_t size, size_t nmemb, void *userdata) { curl_download *d = (curl_download*)userdata; if(d->get_cancel_state()) return -1; //cancel transfer //TODO: implement pause size_t size_ = size * nmemb; if(size_) { //TODO: write data } return size_; } curl_download::curl_download(std::map params, core_api *a) { //for now we use single transfer connection for url //TODO: support multiple connections in parallel for multithreaded download easy_handle = curl_easy_init(); if(!easy_handle) ; //TODO: handle error curl_easy_setopt(easy_handle, CURLOPT_URL, params[0].c_str()); //Url as set in module_info curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, curl_w_callback); curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, this); if(!params[1].empty()) download_path = params[1]; else download_path = a->get_core_settings()["download_dir"]; //curl_easy_setopt(h, CURLOPT_DEFAULT_PROTOCOL, "http"); //require curl >= 7.45 } bool curl_download::start() { boost::thread(boost::bind(&curl_download::perform_internal, this)); state = download_running; return true; //TODO: } bool curl_download::stop() { cancel_transfer = true; state = download_stopped; return true; //TODO: } bool curl_download::delete_download() { cancel_transfer = true; curl_easy_cleanup(easy_handle); return true; //TODO: } void curl_download::perform_internal() { curl_easy_perform(easy_handle); } curl_download::~curl_download() { curl_easy_cleanup(easy_handle); }