diff options
author | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2016-01-20 05:35:09 +0300 |
---|---|---|
committer | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2016-01-20 05:35:09 +0300 |
commit | 09a905e401df451f12673d75dc8d4d72ee73b7c9 (patch) | |
tree | 75e620ca41dd673f9286f3351f2982c2bbfc51e1 /server/src/api_core_events.cpp | |
parent | bb8cd8a9ff7d80046cc2c7d41742c74d8f811c62 (diff) |
server:
very basic implementation of download_state_changed event api call for plugins
started work on thread safety (plugins may and will be multithreaded, so api for plugins should be thread safe)
Diffstat (limited to 'server/src/api_core_events.cpp')
-rw-r--r-- | server/src/api_core_events.cpp | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/server/src/api_core_events.cpp b/server/src/api_core_events.cpp index 0259973..525f60b 100644 --- a/server/src/api_core_events.cpp +++ b/server/src/api_core_events.cpp @@ -23,14 +23,57 @@ #include "api_core_events.h" #include "server_session.h" +#include "utilities.h" +#include "../../protocol/udm.pb.h" +#include "api_module_base.h" +#include <boost/log/trivial.hpp> -extern std::list<server_session*> sessions; +extern lockable_container<std::list<server_session*> > sessions; +extern lockable_container<std::map<int, download_internal_s> > downloads; namespace core_events { -void core_events::download_state_changed(int download_id, download_state state) +void core_events::download_state_changed(module_base *m, std::list<download_state_info> state_list) //TODO: multiple downloads at once should be supported { + //TODO: redesign, very unefficient implementation (reverse search in downloads list should be eleminated) + server_msg msg; + msg.set_type(SERVER_MSG_TYPE::SERVER_DOWNLOAD_STATE_CHANGE); + downloads.lock(); + for(auto s : state_list) + { + for(auto d : downloads) + { + if(d.second.module_name == m->get_module_info().name) + { + if(s.download_id == d.second.module_id) + { + download_state_change *sc =msg.add_download_state_changes(); + sc->set_download_id(d.first); + switch(s.state) + { + case download_state::download_stopped: + sc->set_state(SUBSCRIPTION_DOWNLOAD_STATE::SDS_STOPPED); + break; + case download_state::download_running: + sc->set_state(SUBSCRIPTION_DOWNLOAD_STATE::SDS_STARTED); + break; + default: + BOOST_LOG_TRIVIAL(debug)<<__FILE__<<":"<<__LINE__<<"\t"<<__func__<<"\nunhandled download state change event"; + break; + + } + } + } + } + } + downloads.unlock(); + sessions.lock(); + for(auto p : sessions) + { + p->fire_event(SUBSCRIPTION_TYPE::ST_DOWNLOAD_STATE_CHANGE, msg); + } + sessions.unlock(); } }; |