#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_) { } return size_; } curl_download::curl_download(std::map params, core_api *a) : cancel_transfer(false), state(stopped) { //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["0"].empty()) download_path = params["0"]; else download_path = a->get_core_settings()["download_dir"]; //curl_easy_setopt(h, CURLOPT_DEFAULT_PROTOCOL, "http"); //require curl >= 7.45 } void curl_download::start() { boost::thread(boost::bind(&curl_download::perform_internal, this)); state = running; } void curl_download::stop() { cancel_transfer = true; } void curl_download::perform_internal() { curl_easy_perform(easy_handle); } curl_download::~curl_download() { curl_easy_cleanup(easy_handle); }