Mercurial > trustbridge > trustbridge
view ui/installwrapper.cpp @ 256:84ae353688e0
Add installwrapper class to handle process communication
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Tue, 01 Apr 2014 10:52:06 +0000 |
parents | |
children | f23e0ccd5d14 |
line wrap: on
line source
#include "installwrapper.h" #include <QFileInfo> #include <QTemporaryFile> #include <QApplication> #include <QDir> #include <QDebug> #include "logging.h" InstallWrapper::InstallWrapper(QObject* parent, const QString& path, const QStringList& instructions): QThread(parent), mCertListFile(path), mInstructions(instructions) { } QFileInfo getCinstProcInfo() { QFileInfo fi(QCoreApplication::applicationFilePath()); QDir myDir = fi.absoluteDir(); QString instProcName = "cinst"; if (!fi.suffix().isEmpty()) { instProcName += "." + fi.suffix(); } return QFileInfo(myDir.absoluteFilePath(instProcName)); } #ifdef WIN32 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; void InstallWrapper::run() { QTemporaryFile instructionsFile; QFileInfo cinstProcInfo = getCinstProcInfo(); QString cinstFileName = QDir::toNativeSeparators( getCinstProcInfo().absoluteFilePath()); if (!cinstProcInfo.isExecutable()) { emit error (tr("Could not find certificate installation process.")); return; } instructionsFile.open(); qt_ntfs_permission_lookup++; if (instructionsFile.permissions() ^ ( QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ReadOwner | QFileDevice::WriteOwner)) { emit error (tr("Invalid permissions on temporary file.")); } foreach (const QString &b64data, mInstructions) { instructionsFile.write(b64data.toLatin1()); instructionsFile.write("\n"); } instructionsFile.close(); QString parameters = "\"" + mCertListFile + "\" \"" +instructionsFile.fileName() + "\""; memset (&mExecInfo, 0, sizeof(SHELLEXECUTEINFOW)); mExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW); mExecInfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOASYNC; mExecInfo.lpVerb = L"runas"; mExecInfo.lpFile = reinterpret_cast<LPCWSTR> (cinstFileName.utf16()); mExecInfo.lpParameters = reinterpret_cast<LPCWSTR> (parameters.utf16()); qDebug() << "Starting process " << cinstFileName <<" params: " << parameters; if (!ShellExecuteExW(&mExecInfo)) { char* errmsg = getLastErrorMsg(); QString qerrmsg = QString::fromUtf8(errmsg); free(errmsg); emit(tr("Error executing process: %1").arg(qerrmsg)); } qt_ntfs_permission_lookup--; } #else void InstallWrapper::run() { } #endif