diff options
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/api_core.cpp | 16 | ||||
-rw-r--r-- | server/src/main.cpp | 33 | ||||
-rw-r--r-- | server/src/modules_handler.cpp | 2 | ||||
-rw-r--r-- | server/src/server_session.cpp | 57 |
4 files changed, 77 insertions, 31 deletions
diff --git a/server/src/api_core.cpp b/server/src/api_core.cpp index f9fe772..edc0e0a 100644 --- a/server/src/api_core.cpp +++ b/server/src/api_core.cpp @@ -30,27 +30,17 @@ extern runtime_config_s runtime_config; bool core_api::metadata_set(module_base *m, const std::string &setting_name, const std::vector<char> &data) { - //print data -/* std::cout<<"printing data in core set api:\n"; - for(auto i = data.begin(), end = data.end(); i != end; ++i) - { - std::cout<<*i; - } - std::cout<<std::endl; */ - runtime_config.default_metadata_storage->set(m->get_module_info().name, setting_name, data); - return true; + return runtime_config.default_metadata_storage->set(m->get_module_info().name, setting_name, data); } bool core_api::metadata_get(module_base *m, const std::string &setting_name, std::vector<char> &data) { - runtime_config.default_metadata_storage->get(m->get_module_info().name, setting_name, data); - return true; + return runtime_config.default_metadata_storage->get(m->get_module_info().name, setting_name, data); } bool core_api::metadata_remove(module_base *m, const std::string &setting_name) { - runtime_config.default_metadata_storage->remove(m->get_module_info().name, setting_name); - return true; + return runtime_config.default_metadata_storage->remove(m->get_module_info().name, setting_name); } std::map<std::string, setting_s> core_api::get_module_settings(module_base *m) diff --git a/server/src/main.cpp b/server/src/main.cpp index 09b0b62..214b6b5 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -52,15 +52,42 @@ server *serv = nullptr; //TODO: "core" config section architecture, define base settings -void sigint_handler(int sig) +void on_exit() { + serv->terminate(); bpt::write_info(runtime_config.config_file_path, runtime_config.config_file); //save config on sigint - exit(0); + for(auto m : modules->get_downloader_modules()) + delete m; + for(auto m : modules->get_metadata_modules()) + delete m; +} + +void sig_handler(int sig) +{ + switch(sig) + { + default: + { + on_exit(); + exit(0); + } + break; + } } extern "C" int main(int argc, char *argv[]) { - signal(SIGINT, sigint_handler); + //handle signals + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + signal(SIGABRT, sig_handler); + + //this will not work + signal(SIGKILL, sig_handler); + signal(SIGSTOP, sig_handler); + + + bpo::options_description desc("Available commands and options"); desc.add_options() ("help,h", "this message") diff --git a/server/src/modules_handler.cpp b/server/src/modules_handler.cpp index eb08261..90328b1 100644 --- a/server/src/modules_handler.cpp +++ b/server/src/modules_handler.cpp @@ -125,6 +125,7 @@ std::string modules_handler::list_modules_single_type_internal(const std::list<m std::string buf; for(auto i : modules) { + //TODO: additional info for each module type buf += "\tName: "; buf += i->get_module_info().name; buf += "\n\tDescription: " + i->get_module_info().description; @@ -199,7 +200,6 @@ void modules_handler::sync_downloads(std::map<int, download_internal_s> &downloa for(auto it : d->get_downloads()) { downloads[id].module_name = d->get_module_info().name; - downloads[id].core_id = id; //is it needed ? downloads[id].module_id = it.id; id++; } diff --git a/server/src/server_session.cpp b/server/src/server_session.cpp index 1a3c08c..ff49408 100644 --- a/server/src/server_session.cpp +++ b/server/src/server_session.cpp @@ -346,11 +346,11 @@ bool server_session::handle_command(client_msg *msg) break; case CLIENT_MSG_TYPE::CLIENT_MODULES_REQUEST: { - server_msg msg; - msg.set_type(SERVER_MSG_TYPE::SERVER_MODULES_REPLY); + server_msg m; + m.set_type(SERVER_MSG_TYPE::SERVER_MODULES_REPLY); for(auto i : modules->get_downloader_modules()) { - module_info *mi = msg.add_server_modules_reply(); + module_info *mi = m.add_server_modules_reply(); mi->set_type(SERVER_MODULE_TYPE::SERVER_MODULE_DOWNLOADER); mi->set_name(i->get_module_info().name); mi->set_description(i->get_module_info().description); @@ -378,7 +378,7 @@ bool server_session::handle_command(client_msg *msg) } for(auto i : modules->get_metadata_modules()) { - module_info *mi = msg.add_server_modules_reply(); + module_info *mi = m.add_server_modules_reply(); mi->set_type(SERVER_MODULE_TYPE::SERVER_MODULE_METADATA_STORAGE); mi->set_name(i->get_module_info().name); mi->set_description(i->get_module_info().description); @@ -386,21 +386,21 @@ bool server_session::handle_command(client_msg *msg) for(auto ms : i->get_runtime_module_settings()) add_runtime_module_setting(ms, mi); } - send_message(&msg); + send_message(&m); } break; case CLIENT_MSG_TYPE::CLIENT_CORE_INFO_REQUEST: { - server_msg msg; - msg.set_type(SERVER_MSG_TYPE::SERVER_CORE_INFO_REPLY); - msg.mutable_server_core_info_reply()->set_version(1); + server_msg m; + m.set_type(SERVER_MSG_TYPE::SERVER_CORE_INFO_REPLY); + m.mutable_server_core_info_reply()->set_version(1); try{ for(auto it : runtime_config.config_file.get_child("server")) //load server node { std::string val = it.second.get_value<std::string>("empty_value"); //TODO: something better here. we need to avoid subtrees and empty vars if(/*val == "" ||*/ val == "empty_value") continue; - setting *i = msg.mutable_server_core_info_reply()->add_settings(); + setting *i = m.mutable_server_core_info_reply()->add_settings(); i->set_name(it.first); i->set_value(val); //TODO: is it possible to set something better than just list of core setting ? @@ -410,7 +410,7 @@ bool server_session::handle_command(client_msg *msg) { //TODO: } - send_message(&msg); + send_message(&m); } break; @@ -418,11 +418,11 @@ bool server_session::handle_command(client_msg *msg) { //TODO: thread safety //draft implementation, need a lot of optimizations - server_msg msg; - msg.set_type(SERVER_MSG_TYPE::SERVER_DOWNLOADS_LIST_REPLY); + server_msg m; + m.set_type(SERVER_MSG_TYPE::SERVER_DOWNLOADS_LIST_REPLY); for(auto i : downloads) { - server_download_reply *r = msg.add_downloads(); + server_download_reply *r = m.add_downloads(); download *d = r->mutable_download(); d->set_id(i.first); //set core_id for later access d->set_module_name(i.second.module_name); @@ -446,10 +446,39 @@ bool server_session::handle_command(client_msg *msg) d->set_size(ds.size); d->set_name(ds.name); } - send_message(&msg); + send_message(&m); return true; } break; + case CLIENT_MSG_TYPE::CLIENT_DOWNLOAD_ADD: + { + for(auto i : modules->get_downloader_modules()) + { + if(i->get_module_info().name == msg->download_add_request().module_name()) + { + std::map<int, std::string> params; + for(auto p : msg->download_add_request().params()) + params[p.id()] = p.value(); + auto dm = static_cast<module_downloader *>(i); + int download_id = dm->add_download(params); + int core_id = downloads.size(); + downloads[core_id].module_id = download_id; + downloads[core_id].module_name = msg->download_add_request().module_name(); + server_msg m; + m.set_type(SERVER_MSG_TYPE::SERVER_DOWNLOAD_INFO_REPLY); + download *d = m.mutable_download()->mutable_download(); + d->set_id(core_id); + auto dl = dm->get_download(download_id); + d->set_name(dl.name); + d->set_size(dl.size); + d->set_module_name(msg->download_add_request().module_name()); + d->set_downloaded(dl.downloaded); + send_message(&m); + + } + } + } + break; default: return false; break; |