#pragma once namespace Components { class IPCHandler : public Component { public: class FunctionInterface { public: typedef std::function)> Callback; void map(std::string name, Callback function) { this->functions[name] = function; } void handle(std::string data) { Proto::IPC::Function function; if (function.ParseFromString(data)) { auto handler = this->functions.find(function.name()); if (handler != this->functions.end()) { auto params = function.params(); handler->second(std::vector(params.begin(), params.end())); } } } private: std::unordered_map functions; }; typedef Utils::Slot Callback; IPCHandler(); ~IPCHandler(); #if defined(DEBUG) || defined(FORCE_UNIT_TESTS) const char* getName() override { return "IPCHandler"; }; #endif static void SendWorker(std::string message, std::string data); static void SendClient(std::string message, std::string data); static void OnWorker(std::string message, Callback callback); static void OnClient(std::string message, Callback callback); static std::shared_ptr NewInterface(std::string command); private: static std::unique_ptr WorkerChannel; static std::unique_ptr ClientChannel; static std::unordered_map WorkerCallbacks; static std::unordered_map ClientCallbacks; static std::unordered_map> FunctionInterfaces; static void InitChannels(); static void StartWorker(); static void HandleClient(); static void HandleWorker(); }; }