diff options
author | Frerich Raabe <raabe@froglogic.com> | 2015-11-24 00:06:39 +0100 |
---|---|---|
committer | Katja Marttila <katja.marttila@theqtcompany.com> | 2016-02-15 05:49:35 +0000 |
commit | f80dfd7ea47fe373ef2e4dfa59ed48f0cbce3934 (patch) | |
tree | 58c41489a6f2f69265e94eefb5ceb7422531371b /src/libs/installer/packagemanagercore.cpp | |
parent | c790c068031edd8cd620d9195bda36ba8b5bb489 (diff) |
Fixed writing log on Windows if target dir requires admin rights
Writing the installation log would fail on Windows in case writing to
the target directory requires admin privileges.
Instead of relying on the VerboseWriter destructor, let the
PackageManagerCore destructor explicitly write the installation log. In
case using the PlainVerboseWriterOutput does not work, try to use a
newly introduced VerboseWriterAdminOutput which first tries to acquire
admin privileges before writing a file via RemoteFileEngine.
Change-Id: I13f203afa67175012409bc1eed95f05e51cdcb81
Reviewed-by: Katja Marttila <katja.marttila@theqtcompany.com>
Diffstat (limited to 'src/libs/installer/packagemanagercore.cpp')
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 2b7ec4536..b0a773671 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -46,6 +46,7 @@ #include "qprocesswrapper.h" #include "qsettingswrapper.h" #include "remoteclient.h" +#include "remotefileengine.h" #include "settings.h" #include "utils.h" #include "installercalculator.h" @@ -880,6 +881,40 @@ PackageManagerCore::PackageManagerCore(qint64 magicmaker, const QList<OperationB } } +class VerboseWriterAdminOutput : public VerboseWriterOutput +{ +public: + VerboseWriterAdminOutput(PackageManagerCore *core) : m_core(core) {} + + virtual bool write(const QString &fileName, QIODevice::OpenMode openMode, const QByteArray &data) + { + bool gainedAdminRights = false; + + if (!RemoteClient::instance().isActive()) { + m_core->gainAdminRights(); + gainedAdminRights = true; + } + + RemoteFileEngine file; + file.setFileName(fileName); + if (file.open(openMode)) { + file.write(data.constData(), data.size()); + file.close(); + if (gainedAdminRights) + m_core->dropAdminRights(); + return true; + } + + if (gainedAdminRights) + m_core->dropAdminRights(); + + return false; + } + +private: + PackageManagerCore *m_core; +}; + /*! Destroys the instance. */ @@ -893,6 +928,17 @@ PackageManagerCore::~PackageManagerCore() } delete d; + try { + PlainVerboseWriterOutput plainOutput; + if (!VerboseWriter::instance()->flush(&plainOutput)) { + VerboseWriterAdminOutput adminOutput(this); + VerboseWriter::instance()->flush(&adminOutput); + } + } catch (...) { + // Intentionally left blank; don't permit exceptions from VerboseWriter + // to escape destructor. + } + RemoteClient::instance().setActive(false); RemoteClient::instance().destroy(); |