From 38ff2bf5cbb44f77fed02673344326c296398e29 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 16 Aug 2018 21:04:47 -0700 Subject: [PATCH] Store all files in the current directory for portable installations. Fixes #43 --- app/app.pro | 6 +++-- app/backend/boxartmanager.cpp | 5 ++--- app/main.cpp | 23 +++++++++++++------ app/path.cpp | 39 +++++++++++++++++++++++++++++++++ app/path.h | 16 ++++++++++++++ scripts/generate-installers.bat | 2 ++ 6 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 app/path.cpp create mode 100644 app/path.h diff --git a/app/app.pro b/app/app.pro index 89466f6f..43d3df28 100644 --- a/app/app.pro +++ b/app/app.pro @@ -88,7 +88,8 @@ SOURCES += \ gui/computermodel.cpp \ gui/appmodel.cpp \ streaming/streamutils.cpp \ - backend/autoupdatechecker.cpp + backend/autoupdatechecker.cpp \ + path.cpp HEADERS += \ utils.h \ @@ -104,7 +105,8 @@ HEADERS += \ gui/appmodel.h \ streaming/video/decoder.h \ streaming/streamutils.h \ - backend/autoupdatechecker.h + backend/autoupdatechecker.h \ + path.h # Platform-specific renderers and decoders ffmpeg { diff --git a/app/backend/boxartmanager.cpp b/app/backend/boxartmanager.cpp index cc24dfd9..8d2ae481 100644 --- a/app/backend/boxartmanager.cpp +++ b/app/backend/boxartmanager.cpp @@ -1,13 +1,12 @@ #include "boxartmanager.h" +#include "../path.h" -#include #include #include BoxArtManager::BoxArtManager(QObject *parent) : QObject(parent), - m_BoxArtDir( - QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/boxart") + m_BoxArtDir(Path::getBoxArtCacheDir()) { if (!m_BoxArtDir.exists()) { m_BoxArtDir.mkpath("."); diff --git a/app/main.cpp b/app/main.cpp index 5d5ba17b..25b9d78b 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -11,6 +11,7 @@ #define SDL_MAIN_HANDLED #include +#include "path.h" #include "gui/computermodel.h" #include "gui/appmodel.h" #include "backend/autoupdatechecker.h" @@ -130,15 +131,23 @@ void qtLogToDiskHandler(QtMsgType type, const QMessageLogContext&, const QString int main(int argc, char *argv[]) { + if (QFile(QDir::currentPath() + "/portable.dat").exists()) { + qInfo() << "Running in portable mode from:" << QDir::currentPath(); + QSettings::setDefaultFormat(QSettings::IniFormat); + QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, QDir::currentPath()); + QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, QDir::currentPath()); + + // Initialize paths for portable mode + Path::initialize(true); + } + else { + // Initialize paths for standard installation + Path::initialize(false); + } + #ifdef USE_CUSTOM_LOGGER #ifdef LOG_TO_FILE -#ifdef Q_OS_DARWIN - // On macOS, $TMPDIR is some random folder under /var/folders/ that nobody can - // easily find, so use the system's global tmp directory instead. - QDir tempDir("/tmp"); -#else - QDir tempDir(QDir::tempPath()); -#endif + QDir tempDir(Path::getLogDir()); s_LoggerFile = new QFile(tempDir.filePath(QString("Moonlight-%1.log").arg(QDateTime::currentSecsSinceEpoch()))); if (s_LoggerFile->open(QIODevice::WriteOnly)) { qInfo() << "Redirecting log output to " << s_LoggerFile->fileName(); diff --git a/app/path.cpp b/app/path.cpp new file mode 100644 index 00000000..d050a642 --- /dev/null +++ b/app/path.cpp @@ -0,0 +1,39 @@ +#include "path.h" + +#include +#include +#include +#include + +QString Path::s_LogDir; +QString Path::s_BoxArtCacheDir; + +QString Path::getLogDir() +{ + Q_ASSERT(!s_LogDir.isEmpty()); + return s_LogDir; +} + +QString Path::getBoxArtCacheDir() +{ + Q_ASSERT(!s_BoxArtCacheDir.isEmpty()); + return s_BoxArtCacheDir; +} + +void Path::initialize(bool portable) +{ + if (portable) { + s_LogDir = QDir::currentPath(); + s_BoxArtCacheDir = QDir::currentPath() + "/boxart"; + } + else { +#ifdef Q_OS_DARWIN + // On macOS, $TMPDIR is some random folder under /var/folders/ that nobody can + // easily find, so use the system's global tmp directory instead. + s_LogDir = "/tmp"; +#else + s_LogDir = QDir::tempPath(); +#endif + s_BoxArtCacheDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/boxart"; + } +} diff --git a/app/path.h b/app/path.h new file mode 100644 index 00000000..4b17ed83 --- /dev/null +++ b/app/path.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +class Path +{ +public: + static QString getLogDir(); + + static QString getBoxArtCacheDir(); + + static void initialize(bool portable); + + static QString s_LogDir; + static QString s_BoxArtCacheDir; +}; diff --git a/scripts/generate-installers.bat b/scripts/generate-installers.bat index 4ead99af..fa79a1f4 100644 --- a/scripts/generate-installers.bat +++ b/scripts/generate-installers.bat @@ -120,6 +120,8 @@ echo Building portable package rem This must be done after WiX harvesting and signing, since the VCRT dlls are MS signed rem and should not be harvested for inclusion in the full installer copy "%VCREDIST_PATH%\%ARCH%\Microsoft.VC141.CRT\*.dll" %DEPLOY_FOLDER% +rem This file tells Moonlight that it's a portable installation +echo. > %DEPLOY_FOLDER%\portable.dat if !ERRORLEVEL! NEQ 0 goto Error 7z a %INSTALLER_FOLDER%\MoonlightPortable.zip %DEPLOY_FOLDER%\* if !ERRORLEVEL! NEQ 0 goto Error