summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/packagemanagercore.cpp
diff options
context:
space:
mode:
authorFrerich Raabe <raabe@froglogic.com>2015-11-24 00:06:39 +0100
committerKatja Marttila <katja.marttila@theqtcompany.com>2016-02-15 05:49:35 +0000
commitf80dfd7ea47fe373ef2e4dfa59ed48f0cbce3934 (patch)
tree58c41489a6f2f69265e94eefb5ceb7422531371b /src/libs/installer/packagemanagercore.cpp
parentc790c068031edd8cd620d9195bda36ba8b5bb489 (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.cpp46
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();