Compare commits
	
		
			1 Commits
		
	
	
		
			master
			...
			WIP/refact
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7afbc60195 | 
@@ -1,16 +1,50 @@
 | 
				
			|||||||
#include <QtConcurrent>
 | 
					#include <QtConcurrent>
 | 
				
			||||||
#include "ipcpreviewworker.h"
 | 
					#include "ipcpreviewworker.h"
 | 
				
			||||||
#include "previewgeneratormapfunctor.h"
 | 
					#include "previewgeneratormapfunctor.h"
 | 
				
			||||||
IPCPreviewWorker::IPCPreviewWorker()
 | 
					IPCPreviewWorker::IPCPreviewWorker(QLocalSocket *peer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						this->peer = peer;
 | 
				
			||||||
	this->connect(&previewWorkerWatcher, &QFutureWatcher<QByteArray>::resultReadyAt, this,
 | 
						this->connect(&previewWorkerWatcher, &QFutureWatcher<QByteArray>::resultReadyAt, this,
 | 
				
			||||||
				  [this](int index) { emit previewGenerated(previewWorkerWatcher.resultAt(index)); });
 | 
									  [this](int index)
 | 
				
			||||||
	connect(&previewWorkerWatcher, &QFutureWatcher<QByteArray>::finished, this, [this] { emit finished(); });
 | 
									  {
 | 
				
			||||||
 | 
										  if(this->peer != nullptr)
 | 
				
			||||||
 | 
										  {
 | 
				
			||||||
 | 
											  QDataStream stream{this->peer};
 | 
				
			||||||
 | 
											  stream << previewWorkerWatcher.resultAt(index);
 | 
				
			||||||
 | 
											  this->peer->flush();
 | 
				
			||||||
 | 
										  }
 | 
				
			||||||
 | 
									  });
 | 
				
			||||||
 | 
						connect(&previewWorkerWatcher, &QFutureWatcher<QByteArray>::finished, this, &IPCPreviewWorker::shutdownSocket);
 | 
				
			||||||
 | 
						connect(this->peer, &QLocalSocket::disconnected, this, &IPCPreviewWorker::shutdownSocket);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void IPCPreviewWorker::start(RenderConfig config, const QVector<RenderTarget> &targets, QLocalSocket *peer)
 | 
					void IPCPreviewWorker::shutdownSocket()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if(cleaned)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						cleaned = true;
 | 
				
			||||||
 | 
						if(this->peer != nullptr)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(this->peer->state() == QLocalSocket::ConnectedState)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								this->peer->flush();
 | 
				
			||||||
 | 
								this->peer->waitForBytesWritten();
 | 
				
			||||||
 | 
								this->peer->disconnectFromServer();
 | 
				
			||||||
 | 
								if(this->peer->state() != QLocalSocket::UnconnectedState)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									this->peer->waitForDisconnected();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							delete this->peer;
 | 
				
			||||||
 | 
							this->peer = nullptr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						emit finished();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void IPCPreviewWorker::start(RenderConfig config, const QVector<RenderTarget> &targets)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	stop();
 | 
					 | 
				
			||||||
	auto mapFunctor = PreviewGeneratorMapFunctor();
 | 
						auto mapFunctor = PreviewGeneratorMapFunctor();
 | 
				
			||||||
	mapFunctor.setRenderConfig(config);
 | 
						mapFunctor.setRenderConfig(config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,13 +11,17 @@ class IPCPreviewWorker : public QObject
 | 
				
			|||||||
	Q_OBJECT
 | 
						Q_OBJECT
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
	QFutureWatcher<QByteArray> previewWorkerWatcher;
 | 
						QFutureWatcher<QByteArray> previewWorkerWatcher;
 | 
				
			||||||
 | 
						QLocalSocket *peer;
 | 
				
			||||||
 | 
						bool cleaned = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
	IPCPreviewWorker();
 | 
						IPCPreviewWorker(QLocalSocket *peer);
 | 
				
			||||||
	void start(RenderConfig config, const QVector<RenderTarget> &targets, QLocalSocket *peer);
 | 
						void start(RenderConfig config, const QVector<RenderTarget> &targets);
 | 
				
			||||||
	void stop();
 | 
						void stop();
 | 
				
			||||||
 | 
					  private slots:
 | 
				
			||||||
 | 
						void shutdownSocket();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  signals:
 | 
					  signals:
 | 
				
			||||||
	void previewGenerated(QByteArray);
 | 
					 | 
				
			||||||
	void finished();
 | 
						void finished();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,8 +18,6 @@ IpcServer::IpcServer()
 | 
				
			|||||||
	/* Only 1, we are doing work for the GUI, not a service for general availability */
 | 
						/* Only 1, we are doing work for the GUI, not a service for general availability */
 | 
				
			||||||
	this->spawningServer.setMaxPendingConnections(1);
 | 
						this->spawningServer.setMaxPendingConnections(1);
 | 
				
			||||||
	connect(&this->spawningServer, &QLocalServer::newConnection, this, &IpcServer::spawnerNewConnection);
 | 
						connect(&this->spawningServer, &QLocalServer::newConnection, this, &IpcServer::spawnerNewConnection);
 | 
				
			||||||
	connect(&this->previewWorker, &IPCPreviewWorker::previewGenerated, this, &IpcServer::handlePreviewGenerated);
 | 
					 | 
				
			||||||
	connect(&this->previewWorker, &IPCPreviewWorker::finished, this, [this] { this->currentSocket->flush(); });
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool IpcServer::startSpawner(QString socketPath)
 | 
					bool IpcServer::startSpawner(QString socketPath)
 | 
				
			||||||
@@ -31,8 +29,6 @@ bool IpcServer::startSpawner(QString socketPath)
 | 
				
			|||||||
void IpcServer::spawnerNewConnection()
 | 
					void IpcServer::spawnerNewConnection()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	QLocalSocket *socket = this->spawningServer.nextPendingConnection();
 | 
						QLocalSocket *socket = this->spawningServer.nextPendingConnection();
 | 
				
			||||||
	connect(socket, &QLocalSocket::disconnected, socket, &QLocalSocket::deleteLater);
 | 
					 | 
				
			||||||
	this->currentSocket = socket;
 | 
					 | 
				
			||||||
	if(socket != nullptr)
 | 
						if(socket != nullptr)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if(!socket->waitForReadyRead())
 | 
							if(!socket->waitForReadyRead())
 | 
				
			||||||
@@ -53,21 +49,22 @@ void IpcServer::spawnerNewConnection()
 | 
				
			|||||||
				stream.startTransaction();
 | 
									stream.startTransaction();
 | 
				
			||||||
				stream >> renderConfig >> targets;
 | 
									stream >> renderConfig >> targets;
 | 
				
			||||||
			} while(!stream.commitTransaction() && socket->state() == QLocalSocket::ConnectedState);
 | 
								} while(!stream.commitTransaction() && socket->state() == QLocalSocket::ConnectedState);
 | 
				
			||||||
 | 
								if(socket->state() == QLocalSocket::ConnectedState)
 | 
				
			||||||
			stream << targets.count();
 | 
								{
 | 
				
			||||||
			socket->flush();
 | 
									stream << targets.count();
 | 
				
			||||||
			previewWorker.start(renderConfig, targets, socket);
 | 
									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)
 | 
							if(command == StopGeneratePreviews)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			previewWorker.stop();
 | 
								/* TODO: implement */
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
void IpcServer::handlePreviewGenerated(QByteArray ba)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	QDataStream stream{this->currentSocket};
 | 
					 | 
				
			||||||
	stream << ba;
 | 
					 | 
				
			||||||
	this->currentSocket->flush();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,13 +10,10 @@ class IpcServer : public QObject
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	Q_OBJECT
 | 
						Q_OBJECT
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
	IPCPreviewWorker previewWorker;
 | 
					 | 
				
			||||||
	QLocalServer spawningServer;
 | 
						QLocalServer spawningServer;
 | 
				
			||||||
	QLocalSocket *currentSocket = nullptr;
 | 
					 | 
				
			||||||
	SaveFileResult addFile(QString file);
 | 
						SaveFileResult addFile(QString file);
 | 
				
			||||||
  private slots:
 | 
					  private slots:
 | 
				
			||||||
	void spawnerNewConnection();
 | 
						void spawnerNewConnection();
 | 
				
			||||||
	void handlePreviewGenerated(QByteArray ba);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
	IpcServer();
 | 
						IpcServer();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user