Files
logos-cpp-sdk/cpp/implementations/plain/plain_transport_host.h
T
Dario Lipicar 25c88f4d48 support non-local remote transports (#57)
* support non-local remote transports

* fix LogosResult

* allow getting client over specific transport

* fix ssl

* investiage ssl error

* pr comments

* allow transport set configuration on any module

* pr comments

* add docs

* pr comments

* propagate only non-qt dependencies

* restore ABI compatibility
2026-05-07 12:27:14 -03:00

84 lines
3.0 KiB
C++

#ifndef LOGOS_PLAIN_TRANSPORT_HOST_H
#define LOGOS_PLAIN_TRANSPORT_HOST_H
#include "logos_transport.h"
#include "logos_transport_config.h"
#include "incoming_call_handler.h"
#include "rpc_server.h"
#include <QObject>
#include <map>
#include <memory>
#include <mutex>
#include <string>
namespace logos::plain {
// -----------------------------------------------------------------------------
// PlainTransportHost — publishes QObjects over plain-C++ TCP or TCP+SSL.
//
// Owns an RpcServer (TCP or SSL variant), an IWireCodec (per config), and
// a registry mapping object name → published QObject. For each object it
// hooks into the QObject's `eventResponse(QString, QVariantList)` Qt signal
// so emitted events fan out to every subscribed RPC connection.
// -----------------------------------------------------------------------------
class PlainTransportHost
: public LogosTransportHost
, public IncomingCallHandler
{
public:
explicit PlainTransportHost(LogosTransportConfig cfg);
~PlainTransportHost() override;
// LogosTransportHost
bool publishObject(const QString& name, QObject* object) override;
void unpublishObject(const QString& name) override;
QString bindUrl(const QString& instanceId,
const QString& moduleName) override;
// Reports the bound endpoint URL ("tcp://host:port") once start() has
// succeeded. Empty string until then.
QString endpoint() const;
// Must be called once after constructing + publishing is wired up,
// so the acceptor starts listening. Idempotent.
bool start();
// IncomingCallHandler
void onCall(const CallMessage& req, CallReply reply) override;
void onMethods(const MethodsMessage& req, MethodsReply reply) override;
void onSubscribe(const SubscribeMessage& req, EventSink sink,
const void* connectionId) override;
void onUnsubscribe(const UnsubscribeMessage& req,
const void* connectionId) override;
void onConnectionClosed(const void* connectionId) override;
void onToken(const TokenMessage& req) override;
// Internal: deliver an event emitted by the wrapped QObject to every
// subscribed connection (both matching-name and wildcard subscribers).
void fanOutEvent(const std::string& name, EventMessage msg);
private:
struct Published {
QObject* object = nullptr;
// Tracked event subscribers per event name (including "" wildcard).
std::map<std::string, std::map<const void*, EventSink>> sinksByEvent;
QMetaObject::Connection eventConn;
};
LogosTransportConfig m_cfg;
std::shared_ptr<RpcServerTcp> m_tcp;
std::shared_ptr<RpcServerSsl> m_ssl;
uint16_t m_boundPort = 0;
mutable std::mutex m_mu;
std::map<std::string, Published> m_published;
bool m_started = false;
};
} // namespace logos::plain
#endif // LOGOS_PLAIN_TRANSPORT_HOST_H