diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/installwrapper.cpp	Tue Apr 01 10:52:06 2014 +0000
@@ -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

http://wald.intevation.org/projects/trustbridge/