#include "ipcclient.h" #include "ipc.h" #include #include IpcClient::IpcClient(QObject *parent) : QObject(parent) { m_node.connectToNode(QUrl("local:" + amnezia::getIpcServiceUrl())); m_interface.reset(m_node.acquire()); } IpcClient& IpcClient::Instance() { thread_local IpcClient ipcClient; return ipcClient; } QSharedPointer IpcClient::Interface() { QSharedPointer rep = Instance().m_interface; if (rep.isNull()) { qCritical() << "IpcClient::Interface(): Failed to acquire replica"; return nullptr; } if (!rep->waitForSource(1000)) { qCritical() << "IpcClient::Interface(): Failed to initialize replica"; return nullptr; } if (!rep->isReplicaValid()) { qWarning() << "IpcClient::Interface(): Replica is invalid"; } return rep; } QSharedPointer IpcClient::CreatePrivilegedProcess() { return withInterface([](QSharedPointer &iface) -> QSharedPointer { auto createPrivilegedProcess = iface->createPrivilegedProcess(); if (!createPrivilegedProcess.waitForFinished()) { qCritical() << "Failed to create privileged process"; return nullptr; } const int pid = createPrivilegedProcess.returnValue(); auto* node = new QRemoteObjectNode(); node->connectToNode(QUrl(QString("local:%1").arg(amnezia::getIpcProcessUrl(pid)))); QSharedPointer rep( node->acquire(), [node] (IpcProcessInterfaceReplica *ptr) { delete ptr; node->deleteLater(); } ); if (rep.isNull()) { qCritical() << "IpcClient::CreatePrivilegedProcess(): Failed to acquire replica"; return nullptr; } if (!rep->waitForSource()) { qCritical() << "IpcClient::CreatePrivilegedProcess(): Failed to initialize replica"; return nullptr; } if (!rep->isReplicaValid()) { qCritical() << "IpcClient::CreatePrivilegedProcess(): Replica is invalid"; return nullptr; } return rep; }, []() -> QSharedPointer { return nullptr; }); }