summaryrefslogtreecommitdiff
path: root/server/modules/downloaders/curl/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'server/modules/downloaders/curl/main.cpp')
-rw-r--r--server/modules/downloaders/curl/main.cpp145
1 files changed, 111 insertions, 34 deletions
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();
}