diff options
-rw-r--r-- | client-qt/udm-client-qt/downloads_model.cpp | 3 | ||||
-rw-r--r-- | client-qt/udm-client-qt/udm_main.cpp | 12 | ||||
-rw-r--r-- | protocol/events.proto | 1 | ||||
-rw-r--r-- | server/include/api_module_downloader.h | 3 | ||||
-rw-r--r-- | server/modules/downloaders/curl/include/curl_download.h | 4 | ||||
-rw-r--r-- | server/modules/downloaders/curl/main.cpp | 2 | ||||
-rw-r--r-- | server/modules/downloaders/curl/src/curl_download.cpp | 14 | ||||
-rw-r--r-- | server/src/api_core_events.cpp | 3 |
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; |