diff options
author | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2015-08-31 20:45:06 +0300 |
---|---|---|
committer | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2015-08-31 20:45:06 +0300 |
commit | 4b4002115d6c7b5c5113d1e2e6e9025565e1c9bb (patch) | |
tree | 4e4ecc6d26052bb5f50acd0c1a9260aceb5479fd /server/src | |
parent | 12eba4d75931c5e48dac70b1a7dbad7861d059df (diff) |
protocol:
download struct must have module_name field
server:
core:
implemented SERVER_DOWNLOADS_LIST_REPLY (draft)
added global downloads list
client:
using std::string instead of QString to avoid unnecessary conversions
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/main.cpp | 6 | ||||
-rw-r--r-- | server/src/modules_handler.cpp | 16 | ||||
-rw-r--r-- | server/src/server.cpp | 4 | ||||
-rw-r--r-- | server/src/server_session.cpp | 40 |
4 files changed, 61 insertions, 5 deletions
diff --git a/server/src/main.cpp b/server/src/main.cpp index b856fd4..09b0b62 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -32,6 +32,7 @@ #include "main.h" #include "config.h" #include "client.h" +#include "download_internal.h" core_api *module_api = nullptr; @@ -44,6 +45,8 @@ std::map<std::string, client*> clients; //auth token used for key runtime_config_s runtime_config; +std::map<int, download_internal_s> downloads; + server *serv = nullptr; @@ -212,6 +215,7 @@ extern "C" int main(int argc, char *argv[]) return -1; } modules->on_modules_loaded(); //call second initialization stage in modules + modules->sync_downloads(downloads); if(daemon) { @@ -220,7 +224,7 @@ extern "C" int main(int argc, char *argv[]) boost::asio::io_service io_service_server; try{ //TODO: server options ip address, interface name - serv = new server(io_service_server, runtime_config, clients, runtime_config.config_file.get<int>("server.port", 6613)); + serv = new server(io_service_server, runtime_config, clients, downloads, runtime_config.config_file.get<int>("server.port", 6613)); } catch(std::exception &e) { diff --git a/server/src/modules_handler.cpp b/server/src/modules_handler.cpp index 6d351bb..eb08261 100644 --- a/server/src/modules_handler.cpp +++ b/server/src/modules_handler.cpp @@ -190,6 +190,22 @@ void modules_handler::on_modules_loaded() } } +void modules_handler::sync_downloads(std::map<int, download_internal_s> &downloads) +{ + int id = downloads.size(); + for(auto i : downloader_modules) + { + module_downloader *d = static_cast<module_downloader*>(i); + 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++; + } + } +} + void modules_handler::load_modules_settings() { for(auto i : metadata_modules) diff --git a/server/src/server.cpp b/server/src/server.cpp index 8c2c965..9eb44f4 100644 --- a/server/src/server.cpp +++ b/server/src/server.cpp @@ -31,7 +31,7 @@ -server::server(boost::asio::io_service& io_service,runtime_config_s &config, std::map<std::string, client*> &clients_, short port) : io_service_(io_service), acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)), runtime_config(config), clients(clients_) +server::server(boost::asio::io_service& io_service,runtime_config_s &config, std::map<std::string, client*> &clients_, std::map<int, download_internal_s> &downloads_, short port) : io_service_(io_service), acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)), runtime_config(config), clients(clients_), downloads(downloads_) { if(runtime_config.config_file.get<bool>("server.enable_encryption", false)) { @@ -48,7 +48,7 @@ server::server(boost::asio::io_service& io_service,runtime_config_s &config, std void server::start_accept() { - server_session* new_session = new server_session(io_service_, runtime_config, clients); + server_session* new_session = new server_session(io_service_, runtime_config, clients, downloads); if(runtime_config.config_file.get<bool>("server.enable_encryption", false)) acceptor_.async_accept(new_session->socket()->get_ssl_socket().lowest_layer(), boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error)); else diff --git a/server/src/server_session.cpp b/server/src/server_session.cpp index c9b8e91..d0ff26c 100644 --- a/server/src/server_session.cpp +++ b/server/src/server_session.cpp @@ -34,7 +34,7 @@ extern modules_handler *modules; -server_session::server_session(boost::asio::io_service &s, runtime_config_s &config, std::map<std::string, client*> &clients_, boost::asio::ssl::context *c) : io_service_(s), context_(c), runtime_config(config), clients(clients_) +server_session::server_session(boost::asio::io_service &s, runtime_config_s &config, std::map<std::string, client*> &clients_, std::map<int, download_internal_s> &downloads_, boost::asio::ssl::context *c) : io_service_(s), context_(c), runtime_config(config), clients(clients_), downloads(downloads_) { if(runtime_config.config_file.get<bool>("server.enable_encryption", false)) { @@ -120,6 +120,12 @@ void server_session::handle_read(const boost::system::error_code& error, size_t void server_session::handle_command(client_msg *msg) { + if(msg->type() != CLIENT_MSG_TYPE::CLIENT_AUTH_REQUEST && clients.find(msg->auth_token()) == clients.end()) + { + BOOST_LOG_TRIVIAL(error)<<"unauthorized client trying to execute command"; + delete this; //unauthorized client, delete session + return; + } switch(msg->type()) { case CLIENT_MSG_TYPE::CLIENT_AUTH_REQUEST: @@ -268,7 +274,37 @@ void server_session::handle_command(client_msg *msg) break; case CLIENT_MSG_TYPE::CLIENT_DOWNLOADS_LIST_REQUEST: { - //TODO: + //TODO: thread safety + //draft implementation, need a lot of optimizations + server_msg msg; + msg.set_type(SERVER_MSG_TYPE::SERVER_DOWNLOADS_LIST_REPLY); + for(auto i : downloads) + { + server_download_reply *r = msg.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); + module_base *module = nullptr; + for(auto dm : modules->get_downloader_modules()) + { + if(dm->get_module_info().name == i.second.module_name) + { + module = dm; + break; + } + } + if(!module) + { + //downloader module not found, this should be a fatal error + continue; + } + module_downloader *dm = static_cast<module_downloader*>(module); + download_s ds = dm->get_download(i.second.module_id); + d->set_downloaded(ds.downloaded); + d->set_size(ds.size); + d->set_name(ds.name); + } + send_message(&msg); } break; default: |