#pragma once #include #include #include #include // Серверный диспетчер, который получает IpcMessage с канала, // декодирует его в RPC-вызов, вызывает RpcInvoker и шлёт ответ. class IpcDispatcher { public: IpcDispatcher(IpcChannel& ch, RpcInvoker& invoker) : channel_(ch) , invoker_(invoker) {} // Обработать один запрос. Возвращает false, если получили "пустое" // сообщение и цикл стоит завершить. bool handleOnce() { IpcMessage req = channel_.receive(); if (req.empty()) { return false; } std::string method; RpcArgs args; IpcCodec::decodeRequest(req, method, args); RpcValue result = invoker_.dispatch(method, args); IpcMessage resp = IpcCodec::encodeResponse(result); channel_.send(resp); return true; } // Простой цикл обработки до тех пор, пока канал не вернёт пустое сообщение. void loop() { while (handleOnce()) { } } private: IpcChannel& channel_; RpcInvoker& invoker_; };