/*! @file @id $Id$ */ // 1 2 3 4 5 6 7 8 // 45678901234567890123456789012345678901234567890123456789012345678901234567890 #ifndef QBROWSERLIB_EXECUTOR_HXX #define QBROWSERLIB_EXECUTOR_HXX #include #include #include #include #include namespace qbrowserlib { class Executor: public QObject { Q_OBJECT; signals: void applicationStarted(); void applicationFinished(); public: Executor(Settings* settings=0): _settings(settings) {} ~Executor() { for (DownloadProcesses::iterator it(_downloadProcesses.begin()); it!=_downloadProcesses.end(); ++it) { LOG<<"cleanup:"<second->fileName(); it->second->setAutoRemove(_settings && _settings->flag("CloseApps")); delete it->second; it->second = 0; if (_settings && _settings->flag("CloseApps")) { LOG<<"terminate process"; it->first->terminate(); delete it->first; } } } Settings* settings() { return _settings; } public Q_SLOTS: void run(QNetworkReply* reply, QString filename, QString command) { LOG<isFinished()) { LOG<<"run immediate"; downloadFinished(); } else { LOG<<"run later"; assert(connect(reply, SIGNAL(finished()), SLOT(downloadFinished()))); } } private Q_SLOTS: void downloadFinished() { TemporaryFile *file(new TemporaryFile (QDir::tempPath()+QDir::separator() +QFileInfo(_filename).fileName())); file->open(); _reply->seek(0); file->write(_reply->readAll()); file->close(); LOG<<"Stored as:"<fileName(); QProcess* process(new QProcess); _downloadProcesses[process] = file; assert(connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(processFinished()))); QStringList args(_command.split(" ") .replaceInStrings("%1", file->fileName())); QString prg(args.takeFirst()); LOG<<"Running:"<start(prg, args); applicationStarted(); } void processFinished() { LOG; if (_downloadProcesses.find(qobject_cast(sender())) == _downloadProcesses.end()) return; if (_downloadProcesses[qobject_cast(sender())]) _downloadProcesses[qobject_cast(sender())] ->setAutoRemove(_settings && _settings->flag("CloseApps")); delete _downloadProcesses[qobject_cast(sender())]; _downloadProcesses.erase(qobject_cast(sender())); applicationFinished(); } private: typedef std::map DownloadProcesses; DownloadProcesses _downloadProcesses; Settings* _settings; QNetworkReply* _reply; QString _filename; QString _command; }; } #endif