مقایسه کامیتها
	
		
			1 کامیتها
		
	
	
		
			2b1dc72410
			...
			WIP/refact
		
	
	| مولف | SHA1 | تاریخ | |
|---|---|---|---|
| 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(); | 				stream << targets.count(); | ||||||
| 				socket->flush(); | 				socket->flush(); | ||||||
| 			previewWorker.start(renderConfig, targets, socket); | 				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(); | ||||||
|   | |||||||
		مرجع در شماره جدید
	
	Block a user