From 09a905e401df451f12673d75dc8d4d72ee73b7c9 Mon Sep 17 00:00:00 2001 From: Gluzskiy Alexandr Date: Wed, 20 Jan 2016 05:35:09 +0300 Subject: 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) --- server/src/api_core_events.cpp | 47 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) (limited to 'server/src/api_core_events.cpp') 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 -extern std::list sessions; +extern lockable_container > sessions; +extern lockable_container > 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 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(); } }; -- cgit v1.2.3