From 0712460db041d50f0399a06ff716bc28dda083c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=9C=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=BA=D0=B5=D0=B2=D0=B8=D1=87?= Date: Tue, 2 Dec 2025 17:46:14 +0700 Subject: [PATCH] improve ipc msg --- src/rpc/IpcMessage.h | 72 +++++++++++++++++++++++++++++++++++++--------- src/rpc/RpcChannelFifo.cpp | 35 ---------------------- 2 files changed, 58 insertions(+), 49 deletions(-) delete mode 100644 src/rpc/RpcChannelFifo.cpp diff --git a/src/rpc/IpcMessage.h b/src/rpc/IpcMessage.h index f1c3b70..a6a7298 100644 --- a/src/rpc/IpcMessage.h +++ b/src/rpc/IpcMessage.h @@ -4,7 +4,7 @@ #include // Примитивное IPC‑сообщение с API add() / get(). -// Под капотом пока текстовый формат, но снаружи интерфейс не завязан на std::string. +// Под капотом пока текстовый формат с типовыми тегами, но снаружи интерфейс не завязан на std::string. class IpcMessage { public: @@ -28,22 +28,11 @@ public: // Конструирование исходящего сообщения. template - void add(const T& v) { - out_ << v << ' '; - raw_ = out_.str(); - } + void add(const T& v); // Чтение входящего сообщения по частям. template - T get() { - if (!in_initialized_) { - in_.str(raw_); - in_initialized_ = true; - } - T v{}; - in_ >> v; - return v; - } + T get(); const std::string& raw() const { return raw_; @@ -58,5 +47,60 @@ private: std::ostringstream out_; std::istringstream in_; bool in_initialized_{false}; + + void ensureInput() { + if (!in_initialized_) { + in_.str(raw_); + in_initialized_ = true; + } + } }; +// ===== Специализации по типам ===== + +// int +template<> +inline void IpcMessage::add(const int& v) { + out_ << 'i' << ' ' << v << ' '; + raw_ = out_.str(); +} + +template<> +inline int IpcMessage::get() { + ensureInput(); + char tag{}; + in_ >> tag; + // в PoC просто доверяем, что тип совпадает + int v{}; + in_ >> v; + return v; +} + +// std::string +template<> +inline void IpcMessage::add(const std::string& v) { + // формат: 's' + out_ << 's' << ' ' << v.size() << ' '; + out_.write(v.data(), static_cast(v.size())); + out_ << ' '; + raw_ = out_.str(); +} + +template<> +inline std::string IpcMessage::get() { + ensureInput(); + char tag{}; + in_ >> tag; + // ожидаем 's' + std::size_t len{}; + in_ >> len; + // съесть одиночный пробел перед данными + in_.get(); + std::string res(len, '\0'); + in_.read(&res[0], static_cast(len)); + // съесть завершающий пробел + in_.get(); + return res; +} + + diff --git a/src/rpc/RpcChannelFifo.cpp b/src/rpc/RpcChannelFifo.cpp deleted file mode 100644 index cec1be7..0000000 --- a/src/rpc/RpcChannelFifo.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "RpcChannel.h" - -#include -#include - -#include - -class RpcChannelFifo : public RpcChannel { -public: - RpcChannelFifo(const char* inPipe, const char* outPipe) { - fdOut = open(inPipe, O_WRONLY); - fdIn = open(outPipe, O_RDONLY); - } - - void send(const std::string& data) override { - ::write(fdOut, data.c_str(), data.size()); - ::write(fdOut, "\n", 1); - } - - std::string receive() override { - char buf[4096]; - int n = ::read(fdIn, buf, sizeof(buf) - 1); - if (n <= 0) { - return {}; - } - buf[n] = 0; - return std::string(buf); - } - -private: - int fdIn{}; - int fdOut{}; -}; - -