#include #include #include #include #include #include #include #include "ipcserver.h" #include "common.h" #include "databasefactory.h" #include "../shared/logger.h" #include "renderconfig.h" #include "rendertarget.h" #include "ipcpreviewworker.h" IpcServer::IpcServer() { /* Only 1, we are doing work for the GUI, not a service for general availability */ this->spawningServer.setMaxPendingConnections(1); connect(&this->spawningServer, &QLocalServer::newConnection, this, &IpcServer::spawnerNewConnection); } bool IpcServer::startSpawner(QString socketPath) { QFile::remove(socketPath); return this->spawningServer.listen(socketPath); } void IpcServer::spawnerNewConnection() { QLocalSocket *socket = this->spawningServer.nextPendingConnection(); if(socket != nullptr) { if(!socket->waitForReadyRead()) { return; } QDataStream stream(socket); IPCCommand command; stream >> command; if(command == GeneratePreviews) { RenderConfig renderConfig; QVector targets; do { /* TODO: this is not entirely robust */ socket->waitForReadyRead(100); stream.startTransaction(); stream >> renderConfig >> targets; } while(!stream.commitTransaction() && socket->state() == QLocalSocket::ConnectedState); if(socket->state() == QLocalSocket::ConnectedState) { stream << targets.count(); socket->flush(); IPCPreviewWorker *previewWorker = new IPCPreviewWorker(socket); connect(previewWorker, &IPCPreviewWorker::finished, this, [previewWorker] { delete previewWorker; }); previewWorker->start(renderConfig, targets); } else { delete socket; } } if(command == StopGeneratePreviews) { /* TODO: implement */ } } }