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

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