mirror of
https://github.com/logos-co/logos-cpp-sdk.git
synced 2026-08-31 09:41:06 +00:00
* 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
84 lines
3.0 KiB
C++
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
|