diff options
Diffstat (limited to 'server/modules')
-rw-r--r-- | server/modules/downloaders/curl/curl.cbp | 2 | ||||
-rw-r--r-- | server/modules/downloaders/curl/include/curl_download.h | 15 | ||||
-rw-r--r-- | server/modules/downloaders/curl/main.cpp | 145 | ||||
-rw-r--r-- | server/modules/downloaders/curl/main.h | 6 | ||||
-rw-r--r-- | server/modules/downloaders/curl/src/curl_download.cpp | 6 | ||||
-rw-r--r-- | server/modules/metadata/flat_files/flat_files.cbp | 2 |
6 files changed, 129 insertions, 47 deletions
diff --git a/server/modules/downloaders/curl/curl.cbp b/server/modules/downloaders/curl/curl.cbp index cec0d49..a82aeb1 100644 --- a/server/modules/downloaders/curl/curl.cbp +++ b/server/modules/downloaders/curl/curl.cbp @@ -37,11 +37,13 @@ <Compiler> <Add option="-Wall" /> <Add option="-fexceptions -fPIC" /> + <Add option="-DBOOST_LOG_DYN_LINK" /> <Add directory="../../../include" /> </Compiler> <Linker> <Add library="boost_system" /> <Add library="curl" /> + <Add library="boost_log" /> </Linker> <Unit filename="include/curl_download.h" /> <Unit filename="main.cpp" /> diff --git a/server/modules/downloaders/curl/include/curl_download.h b/server/modules/downloaders/curl/include/curl_download.h index e542de9..6956ce4 100644 --- a/server/modules/downloaders/curl/include/curl_download.h +++ b/server/modules/downloaders/curl/include/curl_download.h @@ -4,9 +4,9 @@ #include <api_module_downloader.h> #include <curl/curl.h> -enum download_state {running, stopped}; +enum download_state {download_running, download_stopped}; -class curl_download +class curl_download : public download_s { public: curl_download(std::map<int, std::string> params, core_api *a); @@ -19,12 +19,15 @@ class curl_download { return cancel_transfer; } + const std::string& get_download_path() + { + return download_path; + } private: void perform_internal(); - download_s api_download; - CURL *easy_handle; - bool cancel_transfer; - download_state state; + CURL *easy_handle = nullptr; + bool cancel_transfer = false; + download_state state = download_stopped; std::string download_path; }; diff --git a/server/modules/downloaders/curl/main.cpp b/server/modules/downloaders/curl/main.cpp index f3da19e..1e98e14 100644 --- a/server/modules/downloaders/curl/main.cpp +++ b/server/modules/downloaders/curl/main.cpp @@ -21,6 +21,7 @@ #include "main.h" #include <boost/bind.hpp> +#include <boost/log/trivial.hpp> #include <curl/curl.h> @@ -36,15 +37,78 @@ module_base::~module_base() downloader::downloader() { if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) - ;//TODO: handle error + { + //TODO: handle error + } } downloader::~downloader() { + //TODO: stop downloads + //TODO: deinit curl + //save runtime state on exit + { + //we need to know id of last element in downloads map on loading, save it + if(!downloads.empty()) + { + char id_[32]; + snprintf(id_, 31, "%d", downloads.rbegin()->first); + std::string val = id_; + api->metadata_set(this, "id_of_last_download", std::vector<char>(val.begin(), val.end())); + } + } } +std::string compute_var_name(int download_id, std::string setting_name) +{ + std::string var_name = "download_"; + char id_s[64]; + snprintf(id_s, 63, "%d", download_id); + var_name += id_s; + var_name += "_"; + var_name += setting_name; + return var_name; +} + + void downloader::on_modules_loaded() { + //TODO: load downloads, metadata, e.t.c. + std::vector<char> val; + api->metadata_get(this, "id_of_last_download", val); + std::string s(val.begin(), val.end()); + int last = atoi(s.c_str()); + for(int i = 0; i <= last; i++) + { + //TODO: rework following, for now just sufficient code for testing + std::vector<char> tmp; + if(!api->metadata_get(this, compute_var_name(i, "name"), tmp)) //always required + continue; + if(tmp.empty()) + continue; + tmp.clear(); + if(!api->metadata_get(this, compute_var_name(i, "download_path"), tmp)) //always required + continue; + if(tmp.empty()) + continue; + tmp.clear(); + std::map<int, std::string> params; + for(int p = 0;; p++) + { + char num_[32]; + snprintf(num_, 31, "%d", p); + if(api->metadata_get(this, compute_var_name(i, std::string("param_") + num_), tmp)) + { + params[p] = std::string(tmp.begin(), tmp.end()); + tmp.clear(); + } + else + break; + } + add_download(params); //TODO: implement better approach, but this should be ok for testing + + } + } void downloader::load(core_api *a) @@ -76,29 +140,51 @@ void downloader::set_module_settings(const std::map<std::string, setting_s> &set this->settings = settings; } - int downloader::add_download(std::map<int, std::string> params) { + if(params.find(0) == params.end()) //missed required parameter + return -1; curl_download *d = new curl_download(params, api); - my_download md; std::string download_name; { auto p1 = params[0].rfind("/"); if(p1 != std::string::npos) - md.name = params[0].substr(p1); + d->name = params[0].substr(p1+1); + else + d->name = params[0]; } - md.curl_d = d; int id = 0; if(!downloads.empty()) { id = downloads.size(); - md.id = id; + d->id = id; } else - md.id = 0; + d->id = 0; - downloads[id] = md; + downloads[id] = d; + //store metadata + { + if(!api->metadata_set(this, compute_var_name(id, "name"), std::vector<char>(d->name.begin(), d->name.end()))) + { + //TODO: handle error + } + if(!api->metadata_set(this, compute_var_name(id, "download_path"), std::vector<char>(d->get_download_path().begin(), d->get_download_path().end()))) + { + //TODO: handle error + } + //store params + for(auto i : params) + { + char num_[32]; + snprintf(num_, 31, "%d", i.first); + if(!api->metadata_set(this, compute_var_name(id, std::string("param_") + num_), std::vector<char>(i.second.begin(), i.second.end()))) + { + //TODO: handle error + } + } + } //TODO: return id; } @@ -106,7 +192,7 @@ int downloader::add_download(std::map<int, std::string> params) bool downloader::stop_download(int download_id) { //TODO: - bool status = downloads[download_id].curl_d->stop(); + bool status = downloads[download_id]->stop(); if(!status) { //TODO: handle error @@ -118,7 +204,7 @@ bool downloader::stop_download(int download_id) bool downloader::start_download(int download_id) { //TODO: - bool status = downloads[download_id].curl_d->start(); + bool status = downloads[download_id]->start(); if(!status) { //TODO: handle error @@ -129,7 +215,7 @@ bool downloader::start_download(int download_id) bool downloader::delete_download(int download_id, bool delete_data) { - bool status = downloads[download_id].curl_d->delete_download(); + bool status = downloads[download_id]->delete_download(); if(!status) { //TODO: handle errror @@ -137,7 +223,8 @@ bool downloader::delete_download(int download_id, bool delete_data) } else { - downloads[download_id].curl_d = nullptr; + delete downloads[download_id]; + downloads.erase(download_id); } //TODO: return true; @@ -153,7 +240,7 @@ std::list<download_s> downloader::get_downloads(std::map<int, std::string> param { std::list<download_s> l; for(auto i : downloads) - l.push_back(i.second); + l.push_back(*(i.second)); //TODO: fill aditional data fields return l; @@ -161,26 +248,16 @@ std::list<download_s> downloader::get_downloads(std::map<int, std::string> param download_s downloader::get_download(int download_id, std::map<int, std::string> params) { - download_s d = downloads[download_id]; + download_s d = *downloads[download_id]; //TODO: fill additional data fields return d; } -std::string compute_var_name(int download_id, std::string setting_name) -{ - std::string var_name = "download_"; - char id_s[64]; - snprintf(id_s, 63, "%d", download_id); - var_name += id_s; - var_name += "_"; - var_name += setting_name; - return var_name; -} bool downloader::metadata_set(int download_id, std::map<std::string, std::string> metadata) { - downloads[download_id].metadata = metadata; - for(auto i : downloads[download_id].metadata) + downloads[download_id]->metadata = metadata; + for(auto i : downloads[download_id]->metadata) api->metadata_set(this, compute_var_name(download_id, i.first), std::vector<char>(i.second.begin(), i.second.end())); return true; } @@ -188,8 +265,8 @@ bool downloader::metadata_set(int download_id, std::map<std::string, std::string bool downloader::metadata_update(int download_id, std::map<std::string, std::string> metadata) { for(auto i : metadata) - downloads[download_id].metadata[i.first] = i.second; - for(auto i : downloads[download_id].metadata) + downloads[download_id]->metadata[i.first] = i.second; + for(auto i : downloads[download_id]->metadata) api->metadata_set(this, compute_var_name(download_id, i.first), std::vector<char>(i.second.begin(), i.second.end())); return true; } @@ -198,26 +275,26 @@ bool downloader::metadata_drop(int download_id, std::string var) { if(!var.empty()) { - downloads[download_id].metadata.erase(var); + downloads[download_id]->metadata.erase(var); api->metadata_remove(this, compute_var_name(download_id, var)); } else { - for(auto i : downloads[download_id].metadata) + for(auto i : downloads[download_id]->metadata) api->metadata_remove(this, compute_var_name(download_id, i.first)); - downloads[download_id].metadata.clear(); + downloads[download_id]->metadata.clear(); } return true; } std::map<std::string, std::string> downloader::metadata_get(int download_id) { - return downloads[download_id].metadata; + return downloads[download_id]->metadata; } std::string downloader::metadata_get(int download_id, std::string var) { - auto i = downloads[download_id].metadata.find(var); - if(i != downloads[download_id].metadata.end()) + auto i = downloads[download_id]->metadata.find(var); + if(i != downloads[download_id]->metadata.end()) return i->second; return std::string(); } diff --git a/server/modules/downloaders/curl/main.h b/server/modules/downloaders/curl/main.h index f5e589b..7040d8b 100644 --- a/server/modules/downloaders/curl/main.h +++ b/server/modules/downloaders/curl/main.h @@ -26,10 +26,6 @@ #include "curl_download.h" -struct my_download : public download_s -{ - curl_download *curl_d; -}; class downloader : public module_downloader { @@ -57,7 +53,7 @@ public: private: void on_modules_loaded(); - std::map<int, my_download> downloads; //map of id, download + std::map<int, curl_download*> downloads; //map of id, download }; diff --git a/server/modules/downloaders/curl/src/curl_download.cpp b/server/modules/downloaders/curl/src/curl_download.cpp index 16866b5..29bdc21 100644 --- a/server/modules/downloaders/curl/src/curl_download.cpp +++ b/server/modules/downloaders/curl/src/curl_download.cpp @@ -12,12 +12,13 @@ size_t curl_w_callback(char *ptr, size_t size, size_t nmemb, void *userdata) size_t size_ = size * nmemb; if(size_) { + //TODO: write data } return size_; } -curl_download::curl_download(std::map<int, std::string> params, core_api *a) : cancel_transfer(false), state(stopped) +curl_download::curl_download(std::map<int, std::string> params, core_api *a) { //for now we use single transfer connection for url //TODO: support multiple connections in parallel for multithreaded download @@ -40,13 +41,14 @@ curl_download::curl_download(std::map<int, std::string> params, core_api *a) : c bool curl_download::start() { boost::thread(boost::bind(&curl_download::perform_internal, this)); - state = running; + state = download_running; return true; //TODO: } bool curl_download::stop() { cancel_transfer = true; + state = download_stopped; return true; //TODO: } diff --git a/server/modules/metadata/flat_files/flat_files.cbp b/server/modules/metadata/flat_files/flat_files.cbp index 038dcf0..901dad4 100644 --- a/server/modules/metadata/flat_files/flat_files.cbp +++ b/server/modules/metadata/flat_files/flat_files.cbp @@ -35,12 +35,14 @@ <Compiler> <Add option="-Wall" /> <Add option="-fexceptions -fPIC" /> + <Add option="-DBOOST_LOG_DYN_LINK" /> <Add directory="../../../include" /> </Compiler> <Linker> <Add library="boost_filesystem" /> <Add library="boost_system" /> <Add library="boost_serialization" /> + <Add library="boost_log" /> </Linker> <Unit filename="main.cpp" /> <Unit filename="main.h" /> |