Merge branch 'qt-launcher' of github.com:danteruiz/hifi into qt-launcher

This commit is contained in:
danteruiz 2019-10-23 14:40:49 -07:00
commit 0c81f30a3c
20 changed files with 199 additions and 142 deletions

View file

@ -66,7 +66,12 @@ if (WIN32)
list(APPEND CMAKE_PREFIX_PATH ${SOURCE_DIR}/lib/cmake)
set(SSL_DIR ${SOURCE_DIR}/ssl)
set(OPENSSL_ROOT_DIR ${SSL_DIR})
message("SSL dir is ${SSL_DIR}")
set(OPENSSL_USE_STATIC_LIBS TRUE)
find_package(OpenSSL REQUIRED)
message("-- Found OpenSSL Libs ${OPENSSL_LIBRARIES}")
endif ()
@ -220,8 +225,9 @@ if (WIN32)
target_link_libraries(${PROJECT_NAME}
wsock32 ws2_32 Winmm version imm32 dwmapi
Crypt32 Iphlpapi
"${SSL_DIR}/lib/libeay32.lib"
"${SSL_DIR}/lib/ssleay32.lib"
#"${SSL_DIR}/lib/libeay32.lib"
#"${SSL_DIR}/lib/ssleay32.lib"
${OPENSSL_LIBRARIES}
"${_qt5Core_install_prefix}/qml/QtQuick.2/qtquick2plugin.lib"
"${_qt5Core_install_prefix}/qml/QtQuick/Controls.2/qtquickcontrols2plugin.lib"
"${_qt5Core_install_prefix}/qml/QtQuick/Templates.2/qtquicktemplates2plugin.lib")

View file

@ -54,7 +54,7 @@ Item {
HFTextRegular {
id: secondText
text: "We're getting everything setup for you."
text: "We're getting everything set up for you."
anchors {
top: firstText.bottom

View file

@ -8,7 +8,7 @@ import HQLauncher 1.0
Item {
id: root
anchors.centerIn: parent
property string titleText: "Sign-in and pick a password"
property string titleText: "Sign in and pick a password"
property string usernamePlaceholder: "Username"
property string passwordPlaceholder: "Set a password (must be at least 6 characters)"
property int marginLeft: root.width * 0.15
@ -30,7 +30,7 @@ Item {
width: 481
lineHeight: 35
lineHeightMode: Text.FixedHeight
text: LauncherState.lastSignupErrorMessage.length == 0 ? root.titleText : "Uh oh."
text: LauncherState.lastSignupErrorMessage.length == 0 ? root.titleText : "Uh oh"
anchors {
top: root.top
topMargin: 29
@ -43,7 +43,7 @@ Item {
id: instruction
width: 425
text: "Use the email address you applied for access with."
text: "Use the email address you applied for access with"
visible: LauncherState.lastSignupErrorMessage.length == 0
anchors {
@ -136,7 +136,7 @@ Item {
HFTextRegular {
id: displayNameText
text: "This is the display name other people see in world, it can be changed at anytime, from your profile."
text: "This is the display name other people see in High Fidelity. It can be changed at any time from your profile."
wrapMode: Text.Wrap
width: 430
@ -164,7 +164,11 @@ Item {
topMargin: 4
}
onAccepted: LauncherState.signup(email.text, username.text, password.text, displayName.text)
onAccepted: {
if (root.enabled && email.text.length > 0 && username.text.length > 0 && password.text.length > 0 && displayName.text.length > 0) {
LauncherState.signup(email.text, username.text, password.text, displayName.text);
}
}
}
HFButton {
@ -214,7 +218,6 @@ Item {
bottom: root.bottom
bottomMargin: 46
right: displayName.right
rightMargin: 30
}
}

View file

@ -33,10 +33,6 @@ Item {
HFTextHeader {
id: header
width: 87
height: 31
text: "Uh oh."
anchors {
@ -49,10 +45,7 @@ Item {
HFTextRegular {
id: description
text: "We seem to have a problem.\nPlease restart Launcher"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: "We seem to have a problem.\n Please restart Launcher."
anchors {
top: header.bottom

View file

@ -21,7 +21,7 @@ Item {
}
Item {
width: 353
width: 430
height: root.height
@ -32,9 +32,8 @@ Item {
HFTextHeader {
id: title
font.bold: true
lineHeight: 35
lineHeightMode: Text.FixedHeight
text: "Please Log in"
anchors {
@ -75,6 +74,7 @@ Item {
id: username
enabled: root.enabled
width: 430
text: LauncherState.lastUsedUsername
placeholderText: "Username"
@ -91,7 +91,7 @@ Item {
HFTextField {
id: password
width: 430
enabled: root.enabled
placeholderText: "Password"
@ -111,7 +111,8 @@ Item {
HFTextRegular {
id: displayText
text: "You can change this at anytime from your profile."
text: "This is the display name other people see in High Fidelity. It can be changed at any time from your profile."
wrapMode: Text.Wrap
anchors {
top: password.bottom
@ -124,7 +125,7 @@ Item {
HFTextField {
id: displayName
width: 430
enabled: root.enabled
placeholderText: "Display name"
@ -136,12 +137,16 @@ Item {
left: parent.left
right: parent.right;
}
onAccepted: LauncherState.login(username.text, password.text, displayName.text)
onAccepted: {
if (root.enabled && username.text.length > 0 && password.text.length > 0 && displayName.text.length > 0) {
LauncherState.login(username.text, password.text, displayName.text);
}
}
}
HFButton {
id: button
width: 110
width: 134
enabled: root.enabled && username.text.length > 0 && password.text.length > 0 && displayName.text.length > 0
@ -160,7 +165,7 @@ Item {
Text {
id: createAccountLink
text: "Create New Account"
text: "Sign up"
font.family: "Graphik"
font.pixelSize: 14
color: "#009EE0"
@ -190,8 +195,8 @@ Item {
right: parent.right
}
}
}
}
Component.onCompleted: {
root.parent.setBuildInfoState("right");
}

View file

@ -14,7 +14,7 @@ Button {
property int backgroundWidth: 2
font.family: "Graphik Semibold"
font.pointSize: 12
font.pixelSize: 15
background: Rectangle {
implicitWidth: 100

View file

@ -7,7 +7,7 @@ TextField {
height: 50
font.family: "Graphik Regular"
font.pointSize: 10.5
font.pixelSize: 14
color: (text.length == 0 || !enabled) ? "#7e8c81" : "#000000"
property bool togglePasswordField: false

View file

@ -3,6 +3,6 @@ import QtQuick 2.1
Text {
font.family: "Graphik Semibold"
font.pointSize: 24
font.pixelSize: 32
color: "#ffffff"
}

View file

@ -5,7 +5,7 @@ Text {
text: "High Fidelity"
font.bold: true
font.family: "Graphik Semibold"
font.pointSize: 14
font.pixelSize: 17
font.letterSpacing: -1
color: "#FFFFFF"
}

View file

@ -5,7 +5,7 @@ Text {
id: root
font.family: "Graphik Regular"
font.pointSize: 10.5
font.pixelSize: 14
color: "#C4C4C4"
linkColor: color

View file

@ -7,8 +7,6 @@ import "HFControls"
Item {
id: root
width: 627
height: 540
Loader {
anchors.fill: parent
id: loader
@ -34,8 +32,6 @@ Item {
HFTextRegular {
id: buildInfo
font.pixelSize: 12
anchors {
leftMargin: 10
rightMargin: 10

View file

@ -20,14 +20,12 @@ void CommandlineOptions::parse(const int argc, char** argv) {
for (int index = 1; index < argc; index++) {
std::string option = argv[index];
if (isCommandlineOption(option)) {
qDebug() << "adding commandline option: " << QString::fromStdString(option);
_commandlineOptions.push_back(option);
}
}
}
void CommandlineOptions::append(const std::string& command) {
qDebug() << "appending option: " << QString::fromStdString(command);
_commandlineOptions.push_back(command);
}

View file

@ -1,5 +1,7 @@
#include "Helper.h"
#include "PathUtils.h"
#include <QCoreApplication>
#include <QDebug>
#include <QFileInfo>
@ -47,9 +49,9 @@ void messageHandler(QtMsgType type, const QMessageLogContext& context, const QSt
break;
}
QDir launcherDirectory = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
launcherDirectory.mkpath(launcherDirectory.absolutePath());
QString filename = launcherDirectory.absoluteFilePath("Log.txt");
QDir logsDir = PathUtils::getLogsDirectory();
logsDir.mkpath(logsDir.absolutePath());
QString filename = logsDir.absoluteFilePath("Log.txt");
QFile outFile(filename);
outFile.open(QIODevice::WriteOnly | QIODevice::Append);

View file

@ -33,6 +33,8 @@ Launcher::Launcher(int& argc, char**argv) : QGuiApplication(argc, argv) {
QFontDatabase::addApplicationFont(PathUtils::fontPath("Graphik-Semibold.ttf"));
_launcherWindow->setSource(QUrl(PathUtils::resourcePath("qml/root.qml")));
_launcherWindow->setHeight(540);
_launcherWindow->setWidth(627);
_launcherWindow->setResizeMode(QQuickView::SizeRootObjectToView);
_launcherWindow->show();
}

View file

@ -2,6 +2,7 @@
#include "CommandlineOptions.h"
#include "Helper.h"
#include "PathUtils.h"
#include <string>
#include <chrono>
@ -15,10 +16,11 @@
#include <QDebug>
LauncherInstaller::LauncherInstaller(const QString& applicationFilePath) {
_launcherInstallDir = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
_launcherApplicationsDir = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/Launcher";
_launcherInstallDir = PathUtils::getLauncherDirectory();
_launcherApplicationsDir = PathUtils::getApplicationsDirectory();
qDebug() << "Launcher install dir: " << _launcherInstallDir.absolutePath();
qDebug() << "Launcher Application dir: " << _launcherApplicationsDir.absolutePath();
_launcherInstallDir.mkpath(_launcherInstallDir.absolutePath());
_launcherApplicationsDir.mkpath(_launcherApplicationsDir.absolutePath());
QFileInfo fileInfo(applicationFilePath);
@ -36,7 +38,7 @@ void LauncherInstaller::install() {
if (runningOutsideOfInstallDir()) {
qDebug() << "Installing HQ Launcher....";
uninstallOldLauncher();
QString oldLauncherPath = _launcherInstallDir.absolutePath() + "/HQ Launcher.exe";
QString oldLauncherPath = PathUtils::getLauncherFilePath();
if (QFile::exists(oldLauncherPath)) {
bool didRemove = QFile::remove(oldLauncherPath);
@ -59,15 +61,15 @@ void LauncherInstaller::install() {
}
void LauncherInstaller::createShortcuts() {
QString launcherPath = _launcherInstallDir.absolutePath() + "/HQ Launcher.exe";
QString launcherPath = PathUtils::getLauncherFilePath();
QString uninstallLinkPath = _launcherInstallDir.absolutePath() + "/Uninstall HQ.lnk";
QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QString applicationPath = _launcherApplicationsDir.absolutePath();
QString uninstallLinkPath = _launcherInstallDir.absoluteFilePath("Uninstall HQ.lnk");
QString appStartLinkPath = applicationPath + "/HQ Launcher.lnk";
QString uninstallAppStartLinkPath = applicationPath + "/Uninstall HQ.lnk";
QString desktopAppLinkPath = desktopPath + "/HQ Launcher.lnk";
QDir desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QString appStartLinkPath = _launcherApplicationsDir.absoluteFilePath("HQ Launcher.lnk");
QString uninstallAppStartLinkPath = _launcherApplicationsDir.absoluteFilePath("Uninstall HQ.lnk");
QString desktopAppLinkPath = desktopDir.absoluteFilePath("HQ Launcher.lnk");
createSymbolicLink((LPCSTR)launcherPath.toStdString().c_str(), (LPCSTR)uninstallLinkPath.toStdString().c_str(),
@ -136,7 +138,7 @@ void LauncherInstaller::uninstall() {
}
return;
}
QString launcherPath = _launcherInstallDir.absolutePath() + "/HQ Launcher.exe";
QString launcherPath = _launcherInstallDir.absoluteFilePath("HQ Launcher.exe");
if (QFile::exists(launcherPath)) {
bool removed = QFile::remove(launcherPath);
qDebug() << "Successfully removed " << launcherPath << ": " << removed;
@ -145,58 +147,58 @@ void LauncherInstaller::uninstall() {
}
void LauncherInstaller::deleteShortcuts() {
QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QDir desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QString applicationPath = _launcherApplicationsDir.absolutePath();
QString uninstallLinkPath = _launcherInstallDir.absolutePath() + "/Uninstall HQ.lnk";
QString uninstallLinkPath = _launcherInstallDir.absoluteFilePath("Uninstall HQ.lnk");
if (QFile::exists(uninstallLinkPath)) {
QFile::remove(uninstallLinkPath);
}
QString appStartLinkPath = applicationPath + "/HQ Launcher.lnk";
QString appStartLinkPath = _launcherApplicationsDir.absoluteFilePath("HQ Launcher.lnk");
if (QFile::exists(appStartLinkPath)) {
QFile::remove(appStartLinkPath);
}
QString uninstallAppStartLinkPath = applicationPath + "/Uninstall HQ.lnk";
QString uninstallAppStartLinkPath = _launcherApplicationsDir.absoluteFilePath("Uninstall HQ.lnk");
if (QFile::exists(uninstallAppStartLinkPath)) {
QFile::remove(uninstallAppStartLinkPath);
}
QString desktopAppLinkPath = desktopPath + "/HQ Launcher.lnk";
QString desktopAppLinkPath = desktopDir.absoluteFilePath("HQ Launcher.lnk");
if (QFile::exists(desktopAppLinkPath)) {
QFile::remove(desktopAppLinkPath);
}
}
void LauncherInstaller::uninstallOldLauncher() {
QDir localAppPath = QStandardPaths::standardLocations(QStandardPaths::AppLocalDataLocation).value(0) + "/../../HQ";
QDir startAppPath = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation).value(0) + "/HQ";
QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QDir localAppDir = QStandardPaths::standardLocations(QStandardPaths::AppLocalDataLocation).value(0) + "/../../HQ";
QDir startAppDir = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation).value(0) + "/HQ";
QDir desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
qDebug() << localAppPath.absolutePath();
qDebug() << startAppPath.absolutePath();
QString desktopAppLinkPath = desktopPath + "/HQ Launcher.lnk";
qDebug() << localAppDir.absolutePath();
qDebug() << startAppDir.absolutePath();
QString desktopAppLinkPath = desktopDir.absoluteFilePath("HQ Launcher.lnk");
if (QFile::exists(desktopAppLinkPath)) {
QFile::remove(desktopAppLinkPath);
}
QString uninstallLinkPath = localAppPath.absolutePath() + "/Uninstall HQ.lnk";
QString uninstallLinkPath = localAppDir.absoluteFilePath("Uninstall HQ.lnk");
if (QFile::exists(uninstallLinkPath)) {
QFile::remove(uninstallLinkPath);
}
QString applicationPath = localAppPath.absolutePath() + "/HQ Launcher.exe";
QString applicationPath = localAppDir.absoluteFilePath("HQ Launcher.exe");
if (QFile::exists(applicationPath)) {
QFile::remove(applicationPath);
}
QString appStartLinkPath = startAppPath.absolutePath() + "/HQ Launcher.lnk";
QString appStartLinkPath = startAppDir.absoluteFilePath("HQ Launcher.lnk");
if (QFile::exists(appStartLinkPath)) {
QFile::remove(appStartLinkPath);
}
QString uninstallAppStartLinkPath = startAppPath.absolutePath() + "/Uninstall HQ.lnk";
QString uninstallAppStartLinkPath = startAppDir.absoluteFilePath("Uninstall HQ.lnk");
if (QFile::exists(uninstallAppStartLinkPath)) {
QFile::remove(uninstallAppStartLinkPath);
}

View file

@ -23,7 +23,6 @@
#include <QThreadPool>
#include <QStandardPaths>
#include <QEventLoop>
#include <qregularexpression.h>
@ -33,6 +32,7 @@
#endif
//#define BREAK_ON_ERROR
//#define DEBUG_UI
const QString configHomeLocationKey { "homeLocation" };
const QString configLastLoginKey { "lastLogin" };
@ -48,6 +48,7 @@ Q_INVOKABLE void LauncherState::openURLInBrowser(QString url) {
}
void LauncherState::toggleDebugState() {
#ifdef DEBUG_UI
_isDebuggingScreens = !_isDebuggingScreens;
UIState updatedUIState = getUIState();
@ -56,8 +57,10 @@ void LauncherState::toggleDebugState() {
emit updateSourceUrl(PathUtils::resourcePath(getCurrentUISource()));
_uiState = getUIState();
}
#endif
}
void LauncherState::gotoNextDebugScreen() {
#ifdef DEBUG_UI
if (_currentDebugScreen < (UIState::UI_STATE_NUM - 1)) {
_currentDebugScreen = (UIState)(_currentDebugScreen + 1);
//UIState updatedUIState = getUIState();
@ -65,48 +68,21 @@ void LauncherState::gotoNextDebugScreen() {
emit updateSourceUrl(PathUtils::resourcePath(getCurrentUISource()));
_uiState = getUIState();
}
#endif
}
void LauncherState::gotoPreviousDebugScreen() {
#ifdef DEBUG_UI
if (_currentDebugScreen > 0) {
_currentDebugScreen = (UIState)(_currentDebugScreen - 1);
emit uiStateChanged();
emit updateSourceUrl(PathUtils::resourcePath(getCurrentUISource()));
_uiState = getUIState();
}
}
QString LauncherState::getContentCachePath() const {
return _launcherDirectory.filePath("cache");
}
QString LauncherState::getClientDirectory() const {
return _launcherDirectory.filePath("interface_install");
}
QString LauncherState::getClientExecutablePath() const {
QDir clientDirectory = getClientDirectory();
#if defined(Q_OS_WIN)
return clientDirectory.absoluteFilePath("interface.exe");
#elif defined(Q_OS_MACOS)
return clientDirectory.absoluteFilePath("interface.app/Contents/MacOS/interface");
#endif
}
QString LauncherState::getConfigFilePath() const {
QDir clientDirectory = getClientDirectory();
return clientDirectory.absoluteFilePath("config.json");
}
QString LauncherState::getLauncherFilePath() const {
#if defined(Q_OS_WIN)
return _launcherDirectory.absoluteFilePath("launcher.exe");
#elif defined(Q_OS_MACOS)
return getBundlePath() + "/Contents/MacOS/HQ Launcher";
#endif
}
bool LauncherState::shouldDownloadContentCache() const {
return !_contentCacheURL.isEmpty() && !QFile::exists(getContentCachePath());
return !_contentCacheURL.isEmpty() && !QFile::exists(PathUtils::getContentCachePath());
}
void LauncherState::setLastSignupErrorMessage(const QString& msg) {
@ -146,10 +122,10 @@ void LauncherState::ASSERT_STATE(const std::vector<ApplicationState>& states) {
}
LauncherState::LauncherState() {
_launcherDirectory = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
// TODO Fix launcher directory
_launcherDirectory = PathUtils::getLauncherDirectory();
qDebug() << "Launcher directory: " << _launcherDirectory.absolutePath();
_launcherDirectory.mkpath(_launcherDirectory.absolutePath());
_launcherDirectory.mkpath(PathUtils::getDownloadDirectory().absolutePath());
requestBuilds();
}
@ -255,7 +231,7 @@ void LauncherState::getCurrentClientVersion() {
connect(&client, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), &loop, &QEventLoop::exit, Qt::QueuedConnection);
connect(&client, &QProcess::errorOccurred, &loop, &QEventLoop::exit, Qt::QueuedConnection);
client.start(getClientExecutablePath(), { "--version" });
client.start(PathUtils::getClientExecutablePath(), { "--version" });
loop.exec();
// TODO Handle errors
@ -273,14 +249,14 @@ void LauncherState::getCurrentClientVersion() {
qDebug() << "Current client version is: " << _currentClientVersion;
{
auto path = getConfigFilePath();
auto path = PathUtils::getConfigFilePath();
QFile configFile{ path };
if (configFile.open(QIODevice::ReadOnly)) {
QJsonDocument doc = QJsonDocument::fromJson(configFile.readAll());
auto root = doc.object();
_config.launcherPath = getLauncherFilePath();
_config.launcherPath = PathUtils::getLauncherFilePath();
_config.loggedIn = false;
if (root.contains(configLoggedInKey)) {
_config.loggedIn = root[configLoggedInKey].toBool();
@ -358,27 +334,27 @@ void LauncherState::signup(QString email, QString username, QString password, QS
auto err = signupRequest->getError();
if (err == SignupRequest::Error::ExistingUsername) {
setLastSignupErrorMessage(_username + " is already taken - please try a different username.");
setLastSignupErrorMessage(_username + " is already taken. Please try a different username.");
setApplicationState(ApplicationState::WaitingForSignup);
return;
} else if (err == SignupRequest::Error::BadPassword) {
setLastSignupErrorMessage("That's an invalid password - must be at least 6 characters.");
setLastSignupErrorMessage("That's an invalid password. Must be at least 6 characters.");
setApplicationState(ApplicationState::WaitingForSignup);
return;
} else if (err == SignupRequest::Error::BadUsername) {
setLastSignupErrorMessage("That's an invalid username - please try another username.");
setLastSignupErrorMessage("That's an invalid username. Please try another username.");
setApplicationState(ApplicationState::WaitingForSignup);
return;
} else if (err == SignupRequest::Error::UserProfileAlreadyCompleted) {
setLastSignupErrorMessage("This email exists, if it's yours please <b><a href='login'>login</a></b>.");
setLastSignupErrorMessage("An account with this email already exists. Please <b><a href='login'>log in</a></b>.");
setApplicationState(ApplicationState::WaitingForSignup);
return;
} else if (err == SignupRequest::Error::NoSuchEmail) {
setLastSignupErrorMessage("That email isn't setup yet. <a href='https://www.highfidelity.com/hq-support'>Request Access</a>.");
setLastSignupErrorMessage("That email isn't setup yet. <a href='https://www.highfidelity.com/hq-support'>Request access</a>.");
setApplicationState(ApplicationState::WaitingForSignup);
return;
} else if (err != SignupRequest::Error::None) {
setApplicationStateError("Failed to sign up");
setApplicationStateError("Failed to sign up. Please try again.");
return;
}
@ -397,11 +373,11 @@ void LauncherState::signup(QString email, QString username, QString password, QS
auto err = loginRequest->getError();
if (err == LoginRequest::Error::BadUsernameOrPassword) {
setLastLoginErrorMessage("Bad username or password");
setLastLoginErrorMessage("Invalid username or password.");
setApplicationState(ApplicationState::WaitingForLogin);
return;
} else if (err != LoginRequest::Error::None) {
setApplicationStateError("Failed to login");
setApplicationStateError("Failed to login. Please try again.");
return;
}
@ -436,11 +412,11 @@ void LauncherState::login(QString username, QString password, QString displayNam
auto err = request->getError();
if (err == LoginRequest::Error::BadUsernameOrPassword) {
setLastLoginErrorMessage("Bad username or password");
setLastLoginErrorMessage("Invalid username or password");
setApplicationState(ApplicationState::WaitingForLogin);
return;
} else if (err != LoginRequest::Error::None) {
setApplicationStateError("Failed to login");
setApplicationStateError("Failed to login. Please try again.");
return;
}
@ -509,7 +485,8 @@ void LauncherState::downloadClient() {
auto request = new QNetworkRequest(QUrl(build.installerZipURL));
auto reply = _networkAccessManager.get(*request);
_clientZipFile.setFileName(_launcherDirectory.absoluteFilePath("client.zip"));
QDir downloadDir{ PathUtils::getDownloadDirectory() };
_clientZipFile.setFileName(downloadDir.absoluteFilePath("client.zip"));
qDebug() << "Opening " << _clientZipFile.fileName();
if (!_clientZipFile.open(QIODevice::WriteOnly)) {
@ -566,15 +543,18 @@ void LauncherState::installClient() {
ASSERT_STATE(ApplicationState::DownloadingClient);
setApplicationState(ApplicationState::InstallingClient);
_launcherDirectory.rmpath("interface_install");
_launcherDirectory.mkpath("interface_install");
auto installDir = _launcherDirectory.absoluteFilePath("interface_install");
auto clientDir = PathUtils::getClientDirectory();
auto clientPath = clientDir.absolutePath();
_launcherDirectory.rmpath(clientPath);
_launcherDirectory.mkpath(clientPath);
_interfaceInstallProgress = 0;
qDebug() << "Unzipping " << _clientZipFile.fileName() << " to " << installDir;
qDebug() << "Unzipping " << _clientZipFile.fileName() << " to " << clientDir.absolutePath();
auto unzipper = new Unzipper(_clientZipFile.fileName(), QDir(installDir));
auto unzipper = new Unzipper(_clientZipFile.fileName(), clientDir);
unzipper->setAutoDelete(true);
connect(unzipper, &Unzipper::progress, this, [this](float progress) {
_interfaceInstallProgress = progress;
@ -666,7 +646,8 @@ void LauncherState::downloadContentCache() {
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
auto reply = _networkAccessManager.get(request);
_contentZipFile.setFileName(_launcherDirectory.absoluteFilePath("content_cache.zip"));
QDir downloadDir{ PathUtils::getDownloadDirectory() };
_contentZipFile.setFileName(downloadDir.absoluteFilePath("content_cache.zip"));
qDebug() << "Opening " << _contentZipFile.fileName();
if (!_contentZipFile.open(QIODevice::WriteOnly)) {
@ -692,6 +673,8 @@ void LauncherState::contentCacheDownloadComplete() {
if (reply->error()) {
qDebug() << "Error downloading content cache: " << reply->error() << reply->readAll();
qDebug() << "Continuing to launch client";
_contentDownloadProgress = 100.0f;
_contentInstallProgress = 100.0f;
launchClient();
return;
}
@ -713,7 +696,7 @@ void LauncherState::installContentCache() {
ASSERT_STATE(ApplicationState::DownloadingContentCache);
setApplicationState(ApplicationState::InstallingContentCache);
auto installDir = getContentCachePath();
auto installDir = PathUtils::getContentCachePath();
qDebug() << "Unzipping " << _contentZipFile.fileName() << " to " << installDir;
@ -750,15 +733,10 @@ void LauncherState::launchClient() {
setApplicationState(ApplicationState::LaunchingHighFidelity);
QDir installDirectory = _launcherDirectory.filePath("interface_install");
QString clientPath;
#if defined(Q_OS_WIN)
clientPath = installDirectory.absoluteFilePath("interface.exe");
#elif defined(Q_OS_MACOS)
clientPath = installDirectory.absoluteFilePath("interface.app/Contents/MacOS/interface");
#endif
QDir installDirectory = PathUtils::getClientDirectory();
QString clientPath = PathUtils::getClientExecutablePath();
auto path = getConfigFilePath();
auto path = PathUtils::getConfigFilePath();
QFile configFile{ path };
if (configFile.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
QJsonDocument doc = QJsonDocument::fromJson(configFile.readAll());
@ -766,7 +744,7 @@ void LauncherState::launchClient() {
{ configHomeLocationKey, _config.homeLocation },
{ configLastLoginKey, _config.lastLogin },
{ configLoggedInKey, _config.loggedIn },
{ configLauncherPathKey, getLauncherFilePath() },
{ configLauncherPathKey, PathUtils::getLauncherFilePath() },
});
qint64 result = configFile.write(doc.toJson());
configFile.close();

View file

@ -155,12 +155,6 @@ private:
bool shouldDownloadContentCache() const;
void getCurrentClientVersion();
QString getContentCachePath() const;
QString getClientDirectory() const;
QString getClientExecutablePath() const;
QString getConfigFilePath() const;
QString getLauncherFilePath() const;
float calculateDownloadProgress() const;
bool shouldDownloadLauncher();

View file

@ -1,6 +1,10 @@
#include "PathUtils.h"
#include "Helper.h"
#include <QDir>
#include <QDebug>
#include <QStandardPaths>
QUrl PathUtils::resourcePath(const QString& source) {
QString filePath = RESOURCE_PREFIX_URL + source;
@ -18,3 +22,56 @@ QString PathUtils::fontPath(const QString& fontName) {
return ":/fonts/" + fontName;
#endif
}
QDir PathUtils::getLauncherDirectory() {
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
}
QDir PathUtils::getApplicationsDirectory() {
return QDir(QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation)).absoluteFilePath("Launcher");
}
// The client directory is where interface is installed to.
QDir PathUtils::getClientDirectory() {
return getLauncherDirectory().filePath("client");
}
QDir PathUtils::getLogsDirectory() {
return getLauncherDirectory().filePath("logs");
}
// The download directory is used to store files downloaded during installation.
QDir PathUtils::getDownloadDirectory() {
return getLauncherDirectory().filePath("downloads");
}
// The content cache path is the directory interface uses for caching data.
// It is pre-populated on startup with domain content.
QString PathUtils::getContentCachePath() {
return getLauncherDirectory().filePath("contentcache");
}
// The path to the interface binary.
QString PathUtils::getClientExecutablePath() {
QDir clientDirectory = getClientDirectory();
#if defined(Q_OS_WIN)
return clientDirectory.absoluteFilePath("interface.exe");
#elif defined(Q_OS_MACOS)
return clientDirectory.absoluteFilePath("interface.app/Contents/MacOS/interface");
#endif
}
// The path to the config.json file that the launcher uses to store information like
// the last user that logged in.
QString PathUtils::getConfigFilePath() {
return getClientDirectory().absoluteFilePath("config.json");
}
// The path to the launcher binary.
QString PathUtils::getLauncherFilePath() {
#if defined(Q_OS_WIN)
return getLauncherDirectory().absoluteFilePath("HQ Launcher.exe");
#elif defined(Q_OS_MACOS)
return getBundlePath() + "/Contents/MacOS/HQ Launcher";
#endif
}

View file

@ -1,14 +1,28 @@
#pragma once
#include <QDir>
#include <QObject>
#include <QString>
#include <QFile>
#include <QUrl>
class PathUtils : public QObject {
Q_OBJECT
public:
PathUtils() = default;
~PathUtils() = default;
Q_INVOKABLE static QUrl resourcePath(const QString& source);
QString static fontPath(const QString& fontName);
static QString fontPath(const QString& fontName);
static QDir getLauncherDirectory();
static QDir getApplicationsDirectory();
static QDir getDownloadDirectory();
static QDir getClientDirectory();
static QDir getLogsDirectory();
static QString getContentCachePath();
static QString getClientExecutablePath();
static QString getConfigFilePath();
static QString getLauncherFilePath();
};

View file

@ -30,16 +30,17 @@ bool hasSuffix(const std::string& path, const std::string& suffix) {
}
int main(int argc, char *argv[]) {
QString name { "High Fidelity" };
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QCoreApplication::setOrganizationName(name);
QCoreApplication::setOrganizationName("High Fidelity");
QCoreApplication::setApplicationName("Launcher");
Q_INIT_RESOURCE(resources);
cleanLogFile();
qInstallMessageHandler(messageHandler);
CommandlineOptions* options = CommandlineOptions::getInstance();
options->parse(argc, argv);
bool didUpdate = false;
#ifdef Q_OS_MAC
if (isLauncherAlreadyRunning()) {
return 0;
@ -48,7 +49,7 @@ int main(int argc, char *argv[]) {
if (argc == 3) {
if (hasSuffix(argv[1], "app") && hasSuffix(argv[2], "app")) {
bool success = swapLaunchers(argv[1], argv[2]);
qDebug() << "Launcher install success: " << success;
qDebug() << "Successfully installed Launcher: " << success;
if (!success) {
options->append("--noUpdate");
}
@ -56,6 +57,12 @@ int main(int argc, char *argv[]) {
}
}
#endif
if (options->contains("--version")) {
std::cout << LAUNCHER_BUILD_VERSION << std::endl;
return 0;
}
#ifdef Q_OS_WIN
LauncherInstaller launcherInstaller(argv[0]);
if (options->contains("--uninstall") || options->contains("--resumeUninstall")) {
@ -69,7 +76,6 @@ int main(int argc, char *argv[]) {
if (isProcessRunning("interface.exe", interfacePID)) {
shutdownProcess(interfacePID, 0);
}
#endif
QProcessEnvironment processEnvironment = QProcessEnvironment::systemEnvironment();
@ -78,6 +84,7 @@ int main(int argc, char *argv[]) {
options->append("--noUpdate");
}
}
Launcher launcher(argc, argv);
return launcher.exec();
}