summaryrefslogtreecommitdiff
path: root/server/src/api_core_events.cpp
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss@sss.chaoslab.ru>2016-01-20 05:35:09 +0300
committerGluzskiy Alexandr <sss@sss.chaoslab.ru>2016-01-20 05:35:09 +0300
commit09a905e401df451f12673d75dc8d4d72ee73b7c9 (patch)
tree75e620ca41dd673f9286f3351f2982c2bbfc51e1 /server/src/api_core_events.cpp
parentbb8cd8a9ff7d80046cc2c7d41742c74d8f811c62 (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.cpp47
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();
}
};