mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 21:17:01 +02:00
Have stack manager use bundled stack
This commit is contained in:
parent
b7cdca75b7
commit
766f0dbd32
8 changed files with 25 additions and 254 deletions
|
@ -221,3 +221,18 @@ if (HIFI_MEMORY_DEBUGGING)
|
||||||
MESSAGE("-- Memory debugging is enabled")
|
MESSAGE("-- Memory debugging is enabled")
|
||||||
endif (UNIX)
|
endif (UNIX)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
set(CPACK_PACKAGE_NAME "High Fidelity")
|
||||||
|
set(CPACK_PACKAGE_VENDOR "High Fidelity, Inc")
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "High Fidelity Interface and Stack")
|
||||||
|
set(CPACK_PACKAGE_VERSION "${BUILD_SEQ}")
|
||||||
|
set(CPACK_PACKAGE_VERSION_MAJOR "${BUILD_SEQ}")
|
||||||
|
set(CPACK_PACKAGE_VERSION_MINOR "0")
|
||||||
|
set(CPACK_PACKAGE_VERSION_PATCH "0")
|
||||||
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "High Fidelity")
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
install(DIRECTORY ${CMAKE_BINARY_DIR}/full-stack-deployment/ DESTINATION "./")
|
||||||
|
endif (WIN32)
|
||||||
|
|
||||||
|
include(CPack)
|
|
@ -53,4 +53,4 @@ else()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
file(GLOB RUNTIME_PLUGINS "${BUNDLE_PLUGIN_DIR}/*.${PLUGIN_EXTENSION}")
|
file(GLOB RUNTIME_PLUGINS "${BUNDLE_PLUGIN_DIR}/*.${PLUGIN_EXTENSION}")
|
||||||
fixup_bundle("${BUNDLE_EXECUTABLE}" "${RUNTIME_PLUGINS}" "@FIXUP_LIBS@")
|
fixup_bundle("${BUNDLE_EXECUTABLE}" "${RUNTIME_PLUGINS}" "@FIXUP_LIBS@")
|
||||||
|
|
|
@ -194,7 +194,6 @@ else (APPLE)
|
||||||
|
|
||||||
# link target to external libraries
|
# link target to external libraries
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
# target_link_libraries(${TARGET_NAME} wsock32.lib Winmm.lib)
|
|
||||||
target_link_libraries(${TARGET_NAME} wsock32.lib Winmm.lib)
|
target_link_libraries(${TARGET_NAME} wsock32.lib Winmm.lib)
|
||||||
else (WIN32)
|
else (WIN32)
|
||||||
# Nothing else required on linux apparently
|
# Nothing else required on linux apparently
|
||||||
|
@ -202,3 +201,4 @@ else (APPLE)
|
||||||
endif (APPLE)
|
endif (APPLE)
|
||||||
|
|
||||||
package_libraries_for_deployment()
|
package_libraries_for_deployment()
|
||||||
|
consolidate_stack_components()
|
||||||
|
|
|
@ -2,6 +2,7 @@ set(TARGET_NAME "stack-manager")
|
||||||
set(BUILD_BUNDLE YES)
|
set(BUILD_BUNDLE YES)
|
||||||
setup_hifi_project(Widgets Gui Svg Core Network WebKitWidgets)
|
setup_hifi_project(Widgets Gui Svg Core Network WebKitWidgets)
|
||||||
add_dependencies(${TARGET_NAME} assignment-client domain-server)
|
add_dependencies(${TARGET_NAME} assignment-client domain-server)
|
||||||
|
include_application_version()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
target_zlib()
|
target_zlib()
|
||||||
|
|
|
@ -81,10 +81,6 @@ void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const Q
|
||||||
|
|
||||||
AppDelegate::AppDelegate(int argc, char* argv[]) :
|
AppDelegate::AppDelegate(int argc, char* argv[]) :
|
||||||
QApplication(argc, argv),
|
QApplication(argc, argv),
|
||||||
_qtReady(false),
|
|
||||||
_dsReady(false),
|
|
||||||
_dsResourcesReady(false),
|
|
||||||
_acReady(false),
|
|
||||||
_domainServerProcess(NULL),
|
_domainServerProcess(NULL),
|
||||||
_acMonitorProcess(NULL),
|
_acMonitorProcess(NULL),
|
||||||
_domainServerName("localhost")
|
_domainServerName("localhost")
|
||||||
|
@ -115,14 +111,15 @@ AppDelegate::AppDelegate(int argc, char* argv[]) :
|
||||||
|
|
||||||
_window = new MainWindow();
|
_window = new MainWindow();
|
||||||
|
|
||||||
createExecutablePath();
|
|
||||||
downloadLatestExecutablesAndRequirements();
|
|
||||||
|
|
||||||
_checkVersionTimer.setInterval(0);
|
_checkVersionTimer.setInterval(0);
|
||||||
connect(&_checkVersionTimer, SIGNAL(timeout()), this, SLOT(checkVersion()));
|
connect(&_checkVersionTimer, SIGNAL(timeout()), this, SLOT(checkVersion()));
|
||||||
_checkVersionTimer.start();
|
_checkVersionTimer.start();
|
||||||
|
|
||||||
connect(this, &QApplication::aboutToQuit, this, &AppDelegate::stopStack);
|
connect(this, &QApplication::aboutToQuit, this, &AppDelegate::stopStack);
|
||||||
|
|
||||||
|
_window->setRequirementsLastChecked(QDateTime::currentDateTime().toString());
|
||||||
|
_window->show();
|
||||||
|
toggleStack(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
AppDelegate::~AppDelegate() {
|
AppDelegate::~AppDelegate() {
|
||||||
|
@ -427,227 +424,6 @@ void AppDelegate::handleContentSetDownloadFinished() {
|
||||||
emit domainAddressChanged();
|
emit domainAddressChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppDelegate::onFileSuccessfullyInstalled(const QUrl& url) {
|
|
||||||
if (url == GlobalData::getInstance().getRequirementsURL()) {
|
|
||||||
_qtReady = true;
|
|
||||||
} else if (url == GlobalData::getInstance().getAssignmentClientURL()) {
|
|
||||||
_acReady = true;
|
|
||||||
} else if (url == GlobalData::getInstance().getDomainServerURL()) {
|
|
||||||
_dsReady = true;
|
|
||||||
} else if (url == GlobalData::getInstance().getDomainServerResourcesURL()) {
|
|
||||||
_dsResourcesReady = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_qtReady && _acReady && _dsReady && _dsResourcesReady) {
|
|
||||||
_window->setRequirementsLastChecked(QDateTime::currentDateTime().toString());
|
|
||||||
_window->show();
|
|
||||||
toggleStack(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppDelegate::createExecutablePath() {
|
|
||||||
QDir launchDir(GlobalData::getInstance().getClientsLaunchPath());
|
|
||||||
QDir resourcesDir(GlobalData::getInstance().getClientsResourcesPath());
|
|
||||||
QDir logsDir(GlobalData::getInstance().getLogsPath());
|
|
||||||
if (!launchDir.exists()) {
|
|
||||||
if (QDir().mkpath(launchDir.absolutePath())) {
|
|
||||||
qDebug() << "Successfully created directory: "
|
|
||||||
<< launchDir.absolutePath();
|
|
||||||
} else {
|
|
||||||
qCritical() << "Failed to create directory: "
|
|
||||||
<< launchDir.absolutePath();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!resourcesDir.exists()) {
|
|
||||||
if (QDir().mkpath(resourcesDir.absolutePath())) {
|
|
||||||
qDebug() << "Successfully created directory: "
|
|
||||||
<< resourcesDir.absolutePath();
|
|
||||||
} else {
|
|
||||||
qCritical() << "Failed to create directory: "
|
|
||||||
<< resourcesDir.absolutePath();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!logsDir.exists()) {
|
|
||||||
if (QDir().mkpath(logsDir.absolutePath())) {
|
|
||||||
qDebug() << "Successfully created directory: "
|
|
||||||
<< logsDir.absolutePath();
|
|
||||||
} else {
|
|
||||||
qCritical() << "Failed to create directory: "
|
|
||||||
<< logsDir.absolutePath();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppDelegate::downloadLatestExecutablesAndRequirements() {
|
|
||||||
// Check if Qt is already installed
|
|
||||||
if (GlobalData::getInstance().getPlatform() == "mac") {
|
|
||||||
if (QDir(GlobalData::getInstance().getClientsLaunchPath() + "QtCore.framework").exists()) {
|
|
||||||
_qtReady = true;
|
|
||||||
}
|
|
||||||
} else if (GlobalData::getInstance().getPlatform() == "win") {
|
|
||||||
if (QFileInfo(GlobalData::getInstance().getClientsLaunchPath() + "Qt5Core.dll").exists()) {
|
|
||||||
_qtReady = true;
|
|
||||||
}
|
|
||||||
} else { // linux
|
|
||||||
if (QFileInfo(GlobalData::getInstance().getClientsLaunchPath() + "libQt5Core.so.5").exists()) {
|
|
||||||
_qtReady = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QFile reqZipFile(GlobalData::getInstance().getRequirementsZipPath());
|
|
||||||
QByteArray reqZipData;
|
|
||||||
if (reqZipFile.open(QIODevice::ReadOnly)) {
|
|
||||||
reqZipData = reqZipFile.readAll();
|
|
||||||
reqZipFile.close();
|
|
||||||
}
|
|
||||||
QFile resZipFile(GlobalData::getInstance().getDomainServerResourcesZipPath());
|
|
||||||
QByteArray resZipData;
|
|
||||||
if (resZipFile.open(QIODevice::ReadOnly)) {
|
|
||||||
resZipData = resZipFile.readAll();
|
|
||||||
resZipFile.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
QDir resourcesDir(GlobalData::getInstance().getClientsResourcesPath());
|
|
||||||
if (!(resourcesDir.entryInfoList(QDir::AllEntries).size() < 3)) {
|
|
||||||
_dsResourcesReady = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the user has set hifiBuildDirectory, don't attempt to download the domain-server or assignement-client
|
|
||||||
if (GlobalData::getInstance().isGetHifiBuildDirectorySet()) {
|
|
||||||
_dsReady = true;
|
|
||||||
_acReady = true;
|
|
||||||
} else {
|
|
||||||
QByteArray dsData;
|
|
||||||
QFile dsFile(GlobalData::getInstance().getDomainServerExecutablePath());
|
|
||||||
if (dsFile.open(QIODevice::ReadOnly)) {
|
|
||||||
dsData = dsFile.readAll();
|
|
||||||
dsFile.close();
|
|
||||||
}
|
|
||||||
QByteArray acData;
|
|
||||||
QFile acFile(GlobalData::getInstance().getAssignmentClientExecutablePath());
|
|
||||||
if (acFile.open(QIODevice::ReadOnly)) {
|
|
||||||
acData = acFile.readAll();
|
|
||||||
acFile.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
QNetworkRequest acReq(QUrl(GlobalData::getInstance().getAssignmentClientMD5URL()));
|
|
||||||
QNetworkReply* acReply = _manager->get(acReq);
|
|
||||||
QEventLoop acLoop;
|
|
||||||
connect(acReply, SIGNAL(finished()), &acLoop, SLOT(quit()));
|
|
||||||
acLoop.exec();
|
|
||||||
QByteArray acMd5Data = acReply->readAll().trimmed();
|
|
||||||
if (GlobalData::getInstance().getPlatform() == "win") {
|
|
||||||
// fix for reading the MD5 hash from Windows-generated
|
|
||||||
// binary data of the MD5 hash
|
|
||||||
QTextStream stream(acMd5Data);
|
|
||||||
stream >> acMd5Data;
|
|
||||||
}
|
|
||||||
|
|
||||||
// fix for Mac and Linux network accessibility
|
|
||||||
if (acMd5Data.size() == 0) {
|
|
||||||
// network is not accessible
|
|
||||||
qDebug() << "Could not connect to the internet.";
|
|
||||||
_window->show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
qDebug() << "AC MD5: " << acMd5Data;
|
|
||||||
if (acMd5Data.toLower() == QCryptographicHash::hash(acData, QCryptographicHash::Md5).toHex()) {
|
|
||||||
_acReady = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QNetworkRequest dsReq(QUrl(GlobalData::getInstance().getDomainServerMD5URL()));
|
|
||||||
QNetworkReply* dsReply = _manager->get(dsReq);
|
|
||||||
QEventLoop dsLoop;
|
|
||||||
connect(dsReply, SIGNAL(finished()), &dsLoop, SLOT(quit()));
|
|
||||||
dsLoop.exec();
|
|
||||||
QByteArray dsMd5Data = dsReply->readAll().trimmed();
|
|
||||||
if (GlobalData::getInstance().getPlatform() == "win") {
|
|
||||||
// fix for reading the MD5 hash from Windows generated
|
|
||||||
// binary data of the MD5 hash
|
|
||||||
QTextStream stream(dsMd5Data);
|
|
||||||
stream >> dsMd5Data;
|
|
||||||
}
|
|
||||||
qDebug() << "DS MD5: " << dsMd5Data;
|
|
||||||
if (dsMd5Data.toLower() == QCryptographicHash::hash(dsData, QCryptographicHash::Md5).toHex()) {
|
|
||||||
_dsReady = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_qtReady) {
|
|
||||||
// check MD5 of requirements.zip only if Qt is found
|
|
||||||
QNetworkRequest reqZipReq(QUrl(GlobalData::getInstance().getRequirementsMD5URL()));
|
|
||||||
QNetworkReply* reqZipReply = _manager->get(reqZipReq);
|
|
||||||
QEventLoop reqZipLoop;
|
|
||||||
connect(reqZipReply, SIGNAL(finished()), &reqZipLoop, SLOT(quit()));
|
|
||||||
reqZipLoop.exec();
|
|
||||||
QByteArray reqZipMd5Data = reqZipReply->readAll().trimmed();
|
|
||||||
if (GlobalData::getInstance().getPlatform() == "win") {
|
|
||||||
// fix for reading the MD5 hash from Windows generated
|
|
||||||
// binary data of the MD5 hash
|
|
||||||
QTextStream stream(reqZipMd5Data);
|
|
||||||
stream >> reqZipMd5Data;
|
|
||||||
}
|
|
||||||
qDebug() << "Requirements ZIP MD5: " << reqZipMd5Data;
|
|
||||||
if (reqZipMd5Data.toLower() != QCryptographicHash::hash(reqZipData, QCryptographicHash::Md5).toHex()) {
|
|
||||||
_qtReady = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_dsResourcesReady) {
|
|
||||||
// check MD5 of resources.zip only if Domain Server
|
|
||||||
// resources are installed
|
|
||||||
QNetworkRequest resZipReq(QUrl(GlobalData::getInstance().getDomainServerResourcesMD5URL()));
|
|
||||||
QNetworkReply* resZipReply = _manager->get(resZipReq);
|
|
||||||
QEventLoop resZipLoop;
|
|
||||||
connect(resZipReply, SIGNAL(finished()), &resZipLoop, SLOT(quit()));
|
|
||||||
resZipLoop.exec();
|
|
||||||
QByteArray resZipMd5Data = resZipReply->readAll().trimmed();
|
|
||||||
if (GlobalData::getInstance().getPlatform() == "win") {
|
|
||||||
// fix for reading the MD5 hash from Windows generated
|
|
||||||
// binary data of the MD5 hash
|
|
||||||
QTextStream stream(resZipMd5Data);
|
|
||||||
stream >> resZipMd5Data;
|
|
||||||
}
|
|
||||||
qDebug() << "Domain Server Resources ZIP MD5: " << resZipMd5Data;
|
|
||||||
if (resZipMd5Data.toLower() != QCryptographicHash::hash(resZipData, QCryptographicHash::Md5).toHex()) {
|
|
||||||
_dsResourcesReady = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DownloadManager* downloadManager = 0;
|
|
||||||
if (!_qtReady || !_acReady || !_dsReady || !_dsResourcesReady) {
|
|
||||||
// initialise DownloadManager
|
|
||||||
downloadManager = new DownloadManager(_manager);
|
|
||||||
downloadManager->setWindowModality(Qt::ApplicationModal);
|
|
||||||
connect(downloadManager, SIGNAL(fileSuccessfullyInstalled(QUrl)),
|
|
||||||
SLOT(onFileSuccessfullyInstalled(QUrl)));
|
|
||||||
downloadManager->show();
|
|
||||||
} else {
|
|
||||||
_window->setRequirementsLastChecked(QDateTime::currentDateTime().toString());
|
|
||||||
_window->show();
|
|
||||||
toggleStack(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_qtReady) {
|
|
||||||
downloadManager->downloadFile(GlobalData::getInstance().getRequirementsURL());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_acReady) {
|
|
||||||
downloadManager->downloadFile(GlobalData::getInstance().getAssignmentClientURL());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_dsReady) {
|
|
||||||
downloadManager->downloadFile(GlobalData::getInstance().getDomainServerURL());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_dsResourcesReady) {
|
|
||||||
downloadManager->downloadFile(GlobalData::getInstance().getDomainServerResourcesURL());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppDelegate::checkVersion() {
|
void AppDelegate::checkVersion() {
|
||||||
QNetworkRequest latestVersionRequest((QUrl(CHECK_BUILDS_URL)));
|
QNetworkRequest latestVersionRequest((QUrl(CHECK_BUILDS_URL)));
|
||||||
latestVersionRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
|
latestVersionRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
|
||||||
|
|
|
@ -53,7 +53,6 @@ signals:
|
||||||
void indexPathChangeResponse(bool wasSuccessful);
|
void indexPathChangeResponse(bool wasSuccessful);
|
||||||
void stackStateChanged(bool isOn);
|
void stackStateChanged(bool isOn);
|
||||||
private slots:
|
private slots:
|
||||||
void onFileSuccessfullyInstalled(const QUrl& url);
|
|
||||||
void requestDomainServerID();
|
void requestDomainServerID();
|
||||||
void handleDomainIDReply();
|
void handleDomainIDReply();
|
||||||
void handleDomainGetReply();
|
void handleDomainGetReply();
|
||||||
|
@ -64,16 +63,10 @@ private slots:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void parseCommandLine();
|
void parseCommandLine();
|
||||||
void createExecutablePath();
|
|
||||||
void downloadLatestExecutablesAndRequirements();
|
|
||||||
|
|
||||||
void changeDomainServerIndexPath(const QString& newPath);
|
void changeDomainServerIndexPath(const QString& newPath);
|
||||||
|
|
||||||
QNetworkAccessManager* _manager;
|
QNetworkAccessManager* _manager;
|
||||||
bool _qtReady;
|
|
||||||
bool _dsReady;
|
|
||||||
bool _dsResourcesReady;
|
|
||||||
bool _acReady;
|
|
||||||
BackgroundProcess* _domainServerProcess;
|
BackgroundProcess* _domainServerProcess;
|
||||||
BackgroundProcess* _acMonitorProcess;
|
BackgroundProcess* _acMonitorProcess;
|
||||||
QHash<QUuid, BackgroundProcess*> _scriptProcesses;
|
QHash<QUuid, BackgroundProcess*> _scriptProcesses;
|
||||||
|
|
|
@ -32,11 +32,8 @@ GlobalData::GlobalData() {
|
||||||
_resourcePath = "resources/";
|
_resourcePath = "resources/";
|
||||||
_assignmentClientExecutable = "assignment-client";
|
_assignmentClientExecutable = "assignment-client";
|
||||||
_domainServerExecutable = "domain-server";
|
_domainServerExecutable = "domain-server";
|
||||||
QString applicationSupportDirectory = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
|
QString applicationSupportDirectory = QCoreApplication::applicationDirPath();
|
||||||
if (PR_BUILD) {
|
|
||||||
applicationSupportDirectory += "/pr-binaries";
|
|
||||||
}
|
|
||||||
|
|
||||||
_clientsLaunchPath = QDir::toNativeSeparators(applicationSupportDirectory + "/");
|
_clientsLaunchPath = QDir::toNativeSeparators(applicationSupportDirectory + "/");
|
||||||
_clientsResourcePath = QDir::toNativeSeparators(applicationSupportDirectory + "/" + _resourcePath);
|
_clientsResourcePath = QDir::toNativeSeparators(applicationSupportDirectory + "/" + _resourcePath);
|
||||||
|
|
||||||
|
@ -49,18 +46,6 @@ GlobalData::GlobalData() {
|
||||||
_domainServerExecutablePath.append(".exe");
|
_domainServerExecutablePath.append(".exe");
|
||||||
}
|
}
|
||||||
|
|
||||||
_requirementsURL = urlBase + "/binaries/" + _platform + "/requirements/requirements.zip";
|
|
||||||
_requirementsZipPath = _clientsLaunchPath + "requirements.zip";
|
|
||||||
_requirementsMD5URL = urlBase + "/binaries/" + _platform + "/requirements/requirements.md5";
|
|
||||||
_assignmentClientURL = urlBase + "/binaries/" + _platform + "/assignment-client" + (_platform == "win" ? "/assignment-client.exe" : "/assignment-client");
|
|
||||||
_domainServerResourcesURL = urlBase + "/binaries/" + _platform + "/domain-server/resources.zip";
|
|
||||||
_domainServerResourcesZipPath = _clientsLaunchPath + "resources.zip";
|
|
||||||
_domainServerResourcesMD5URL = urlBase + "/binaries/" + _platform + "/domain-server/resources.md5";
|
|
||||||
_domainServerURL = urlBase + "/binaries/" + _platform + "/domain-server" + (_platform == "win" ? "/domain-server.exe" : "/domain-server");
|
|
||||||
|
|
||||||
_assignmentClientMD5URL = urlBase + "/binaries/" + _platform + "/assignment-client/assignment-client.md5";
|
|
||||||
_domainServerMD5URL = urlBase + "/binaries/" + _platform + "/domain-server/domain-server.md5";
|
|
||||||
|
|
||||||
_defaultDomain = "localhost";
|
_defaultDomain = "localhost";
|
||||||
_logsPath = QDir::toNativeSeparators(_clientsLaunchPath + "logs/");
|
_logsPath = QDir::toNativeSeparators(_clientsLaunchPath + "logs/");
|
||||||
_availableAssignmentTypes.insert("audio-mixer", 0);
|
_availableAssignmentTypes.insert("audio-mixer", 0);
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#ifndef hifi_GlobalData_h
|
#ifndef hifi_GlobalData_h
|
||||||
#define hifi_GlobalData_h
|
#define hifi_GlobalData_h
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue