#ifndef IPCCLIENT_H #define IPCCLIENT_H #include #include #include "rep_ipc_interface_replica.h" #include "rep_ipc_process_interface_replica.h" class IpcClient : public QObject { Q_OBJECT public: explicit IpcClient(QObject *parent = nullptr); static IpcClient& Instance(); static QSharedPointer Interface(); static QSharedPointer CreatePrivilegedProcess(); template static auto withInterface(Func func) { QSharedPointer iface = Instance().m_interface; using ReturnType = decltype(func(std::declval>())); if (iface.isNull() || !iface->waitForSource(1000) || !iface->isReplicaValid()) { qWarning() << "IpcClient::withInterface(): Service is not running"; if constexpr (std::is_void_v) return; else return ReturnType{}; } return func(iface); } template static auto withInterface(OnSuccess onSuccess, OnFailure onFailure) { QSharedPointer iface = Instance().m_interface; if (iface.isNull() || !iface->waitForSource(1000) || !iface->isReplicaValid()) { return onFailure(); } return onSuccess(iface); } signals: private: QRemoteObjectNode m_node; QSharedPointer m_interface; }; #endif // IPCCLIENT_H