#ifndef IPCCLIENT_H #define IPCCLIENT_H #include #include #include "rep_ipc_interface_replica.h" #include "rep_ipc_process_tun2socks_replica.h" #include "privileged_process.h" class IpcClient : public QObject { Q_OBJECT public: explicit IpcClient(QObject *parent = nullptr); static IpcClient& Instance(); static QSharedPointer Interface(); static QSharedPointer InterfaceTun2Socks(); 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; QSharedPointer m_tun2socks; struct ProcessDescriptor { ProcessDescriptor () { replicaNode = QSharedPointer(new QRemoteObjectNode()); ipcProcess = QSharedPointer(); localSocket = QSharedPointer(); } QSharedPointer ipcProcess; QSharedPointer replicaNode; QSharedPointer localSocket; }; }; #endif // IPCCLIENT_H