Mercurial > trustbridge
diff ui/installwrapper.cpp @ 260:e7a8b70021b6
Merged
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Tue, 01 Apr 2014 15:46:40 +0200 |
parents | 84ae353688e0 |
children | f23e0ccd5d14 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/installwrapper.cpp Tue Apr 01 15:46:40 2014 +0200 @@ -0,0 +1,87 @@ +#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