summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client-qt/udm-client-qt/downloads_model.cpp3
-rw-r--r--client-qt/udm-client-qt/udm_main.cpp12
-rw-r--r--protocol/events.proto1
-rw-r--r--server/include/api_module_downloader.h3
-rw-r--r--server/modules/downloaders/curl/include/curl_download.h4
-rw-r--r--server/modules/downloaders/curl/main.cpp2
-rw-r--r--server/modules/downloaders/curl/src/curl_download.cpp14
-rw-r--r--server/src/api_core_events.cpp3
8 files changed, 36 insertions, 6 deletions
diff --git a/client-qt/udm-client-qt/downloads_model.cpp b/client-qt/udm-client-qt/downloads_model.cpp
index 5789151..d7fb799 100644
--- a/client-qt/udm-client-qt/downloads_model.cpp
+++ b/client-qt/udm-client-qt/downloads_model.cpp
@@ -71,6 +71,9 @@ QVariant downloads_model::data(const QModelIndex &index, int role) const
case 1:
return tr("Started");
break;
+ case 2:
+ return tr("Completed");
+ break;
//TODO: handle module defined states
default:
return QVariant();
diff --git a/client-qt/udm-client-qt/udm_main.cpp b/client-qt/udm-client-qt/udm_main.cpp
index ab9b898..4110f03 100644
--- a/client-qt/udm-client-qt/udm_main.cpp
+++ b/client-qt/udm-client-qt/udm_main.cpp
@@ -305,6 +305,7 @@ void udm_main::server_message_received(server_msg msg)
s->mutable_download_state_change()->add_states(SDS_STARTED); //subscript to download started event
s->mutable_download_state_change()->add_states(SDS_STOPPED); //subscript to download stopped event
s->mutable_download_state_change()->add_states(SDS_DELETED); //subscript to download deleted event
+ s->mutable_download_state_change()->add_states(SDS_COMPLETED); //subscript to download deleted event
session->send_message(msg);
}
@@ -390,6 +391,17 @@ void udm_main::server_message_received(server_msg msg)
}
}
break;
+ case SUBSCRIPTION_DOWNLOAD_STATE::SDS_COMPLETED:
+ for(auto d = downloads.begin(), end = downloads.end(); d != end; ++d)
+ {
+ if(d->id() == i.download_id())
+ {
+ d->set_state(2); //TODO: use human readable enum for states ?
+ mdl_downloads->refresh(); //TODO: udapte only changed item
+ break;
+ }
+ }
+ break;
case SUBSCRIPTION_DOWNLOAD_STATE::SDS_DELETED:
{
bool found = false;
diff --git a/protocol/events.proto b/protocol/events.proto
index 84903cf..3d9d03d 100644
--- a/protocol/events.proto
+++ b/protocol/events.proto
@@ -55,6 +55,7 @@ enum SUBSCRIPTION_DOWNLOAD_STATE {
SDS_STARTED = 0;
SDS_STOPPED = 1;
SDS_DELETED = 2;
+ SDS_COMPLETED = 3;
}
message subscription_download_state_change {
diff --git a/server/include/api_module_downloader.h b/server/include/api_module_downloader.h
index 703683e..8ff8052 100644
--- a/server/include/api_module_downloader.h
+++ b/server/include/api_module_downloader.h
@@ -78,7 +78,8 @@ struct download_content_entry_s { //here is basic content entry description, thi
enum download_state_e {
stoppped = 0,
- running = 1
+ running = 1,
+ completed = 2
};
diff --git a/server/modules/downloaders/curl/include/curl_download.h b/server/modules/downloaders/curl/include/curl_download.h
index 514d4f2..c98b64e 100644
--- a/server/modules/downloaders/curl/include/curl_download.h
+++ b/server/modules/downloaders/curl/include/curl_download.h
@@ -27,7 +27,7 @@
class curl_download : public download_s
{
public:
- curl_download(std::map<int, std::string> params, core_api *a);
+ curl_download(std::map<int, std::string> params, core_api *a, module_base *m);
virtual ~curl_download();
bool start();
@@ -47,6 +47,8 @@ class curl_download : public download_s
bool cancel_transfer = false;
core_events::download_state state = core_events::download_stopped;
std::string download_path;
+ core_api *api = nullptr;
+ module_base *module = nullptr;
};
#endif // CURL_DOWNLOAD_H
diff --git a/server/modules/downloaders/curl/main.cpp b/server/modules/downloaders/curl/main.cpp
index c21d8b3..667f4a3 100644
--- a/server/modules/downloaders/curl/main.cpp
+++ b/server/modules/downloaders/curl/main.cpp
@@ -146,7 +146,7 @@ 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);
+ curl_download *d = new curl_download(params, api, this);
// std::string download_name;
{
auto p1 = params[0].rfind("/");
diff --git a/server/modules/downloaders/curl/src/curl_download.cpp b/server/modules/downloaders/curl/src/curl_download.cpp
index 9df06a1..054ce22 100644
--- a/server/modules/downloaders/curl/src/curl_download.cpp
+++ b/server/modules/downloaders/curl/src/curl_download.cpp
@@ -38,13 +38,15 @@ size_t curl_w_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
return size_;
}
-curl_download::curl_download(std::map<int, std::string> params, core_api *a)
+curl_download::curl_download(std::map<int, std::string> params, core_api *a, module_base *m)
{
//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
+ api = a;
+ module = m;
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);
@@ -52,7 +54,7 @@ curl_download::curl_download(std::map<int, std::string> params, core_api *a)
if(!params[1].empty())
download_path = params[1];
else
- download_path = a->get_core_settings()["download_dir"];
+ download_path = api->get_core_settings()["download_dir"];
//curl_easy_setopt(h, CURLOPT_DEFAULT_PROTOCOL, "http"); //require curl >= 7.45
@@ -86,7 +88,13 @@ void curl_download::perform_internal()
state = core_events::download_error;
else
state = core_events::download_completed;
- //TODO: fire event
+ std::list<core_events::download_state_info> l;
+ core_events::download_state_info i;
+ i.download_id = id;
+ i.state = state;
+ l.push_back(i);
+ api->download_state_changed(module, l);
+ //TODO: save state
}
curl_download::~curl_download()
diff --git a/server/src/api_core_events.cpp b/server/src/api_core_events.cpp
index 525f60b..da0eae7 100644
--- a/server/src/api_core_events.cpp
+++ b/server/src/api_core_events.cpp
@@ -58,6 +58,9 @@ void core_events::download_state_changed(module_base *m, std::list<download_stat
case download_state::download_running:
sc->set_state(SUBSCRIPTION_DOWNLOAD_STATE::SDS_STARTED);
break;
+ case download_state::download_completed:
+ sc->set_state(SUBSCRIPTION_DOWNLOAD_STATE::SDS_COMPLETED);
+ break;
default:
BOOST_LOG_TRIVIAL(debug)<<__FILE__<<":"<<__LINE__<<"\t"<<__func__<<"\nunhandled download state change event";
break;