diff options
Diffstat (limited to 'server/modules/downloaders/curl/src/curl_download.cpp')
-rw-r--r-- | server/modules/downloaders/curl/src/curl_download.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/server/modules/downloaders/curl/src/curl_download.cpp b/server/modules/downloaders/curl/src/curl_download.cpp new file mode 100644 index 0000000..d474464 --- /dev/null +++ b/server/modules/downloaders/curl/src/curl_download.cpp @@ -0,0 +1,61 @@ +#include "curl_download.h" + +#include <boost/thread.hpp> + + +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<std::string, std::string> 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); + +} |