Merge with develop

This commit is contained in:
kervala 2016-06-18 22:41:12 +02:00
parent 1bff654c7b
commit f54109d279
14 changed files with 279 additions and 99 deletions

View file

@ -1784,7 +1784,9 @@ std::string CPath::getApplicationDirectory(const std::string &appName, bool loca
std::string CFileContainer::getApplicationDirectory(const std::string &appName, bool local) std::string CFileContainer::getApplicationDirectory(const std::string &appName, bool local)
{ {
static std::string appPaths[2]; static std::string appPaths[2];
std::string &appPath = appPaths[local ? 1 : 0]; std::string &appPath = appPaths[local ? 1 : 0];
if (appPath.empty()) if (appPath.empty())
{ {
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
@ -1800,26 +1802,21 @@ std::string CFileContainer::getApplicationDirectory(const std::string &appName,
SHGetSpecialFolderPathW(NULL, buffer, CSIDL_APPDATA, TRUE); SHGetSpecialFolderPathW(NULL, buffer, CSIDL_APPDATA, TRUE);
} }
appPath = CPath::standardizePath(wideToUtf8(buffer)); appPath = CPath::standardizePath(wideToUtf8(buffer));
#elif defined(NL_OS_MAC)
appPath = CPath::standardizePath(getenv("HOME"));
appPath += "/Library/Application Support/";
#else #else
appPath = CPath::standardizePath(getenv("HOME")); // get user home directory from HOME environment variable
const char* homePath = getenv("HOME");
appPath = CPath::standardizePath(homePath ? homePath : ".");
#if defined(NL_OS_MAC)
appPath += "Library/Application Support/";
#else
// recommended for applications data that are owned by user
appPath += ".local/share/";
#endif
#endif #endif
} }
std::string path = appPath; return CPath::standardizePath(appPath + appName);
#ifdef NL_OS_WINDOWS
if (!appName.empty())
path = CPath::standardizePath(path + appName);
#elif defined(NL_OS_MAC)
path = CPath::standardizePath(path + appName);
#else
if (!appName.empty())
path = CPath::standardizePath(path + "." + toLower(appName));
#endif
return path;
} }
std::string CPath::getTemporaryDirectory() std::string CPath::getTemporaryDirectory()

View file

@ -45,7 +45,7 @@ CConfigFile::CConfigFile(QObject *parent):QObject(parent), m_defaultServerIndex(
m_language = QLocale::system().name().left(2); // only keep language ISO 639 code m_language = QLocale::system().name().left(2); // only keep language ISO 639 code
m_defaultConfigPath = QApplication::applicationDirPath() + "/installer.ini"; m_defaultConfigPath = QApplication::applicationDirPath() + "/installer.ini";
m_configPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/installer.ini"; m_configPath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/installer.ini";
} }
CConfigFile::~CConfigFile() CConfigFile::~CConfigFile()
@ -608,9 +608,24 @@ bool CConfigFile::foundTemporaryFiles(const QString &directory) const
bool CConfigFile::shouldCreateDesktopShortcut() const bool CConfigFile::shouldCreateDesktopShortcut() const
{ {
#ifdef Q_OS_WIN32
const CProfile &profile = getProfile(); const CProfile &profile = getProfile();
return profile.desktopShortcut && !QFile::exists(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/Ryzom.lnk"); return profile.desktopShortcut && !NLMISC::CFile::isExists(qToUtf8(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/Ryzom.lnk"));
#else
return false;
#endif
}
bool CConfigFile::shouldCreateMenuShortcut() const
{
#ifdef Q_OS_WIN32
const CProfile &profile = getProfile();
return profile.menuShortcut && !NLMISC::CFile::isExists(qToUtf8(QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/Ryzom/Ryzom.lnk"));
#else
return false;
#endif
} }
QString CConfigFile::getProfileClientFullPath(int profileIndex) const QString CConfigFile::getProfileClientFullPath(int profileIndex) const
@ -704,7 +719,7 @@ OperationStep CConfigFile::getInstallNextStep() const
// downloaded files are kept in server directory // downloaded files are kept in server directory
QString dataFile = getInstallationDirectory() + "/" + server.dataDownloadFilename; QString dataFile = getInstallationDirectory() + "/" + server.dataDownloadFilename;
QString clientFile = getInstallationDirectory() + "/" + server.clientDownloadFilename; QString clientFile = getInstallationDirectory() + "/" + expandVariables(server.clientDownloadFilename);
// data are not copied // data are not copied
if (!areRyzomDataInstalledIn(serverDirectory)) if (!areRyzomDataInstalledIn(serverDirectory))
@ -760,7 +775,7 @@ OperationStep CConfigFile::getInstallNextStep() const
return ExtractBnpClient; return ExtractBnpClient;
} }
QString clientFile = getInstallationDirectory() + "/" + server.clientDownloadFilename; QString clientFile = getInstallationDirectory() + "/" + expandVariables(server.clientDownloadFilename);
// when file is not finished, it has .part extension // when file is not finished, it has .part extension
if (!QFile::exists(clientFile)) if (!QFile::exists(clientFile))
@ -799,8 +814,12 @@ OperationStep CConfigFile::getInstallNextStep() const
if (shouldCreateDesktopShortcut()) if (shouldCreateDesktopShortcut())
{ {
// TODO: check they point to getClientFullPath() return CreateDesktopShortcut;
return CreateShortcuts; }
if (shouldCreateMenuShortcut())
{
return CreateMenuShortcut;
} }
#ifdef Q_OS_WIN #ifdef Q_OS_WIN

View file

@ -153,6 +153,7 @@ public:
bool foundTemporaryFiles(const QString &directory) const; bool foundTemporaryFiles(const QString &directory) const;
bool shouldCreateDesktopShortcut() const; bool shouldCreateDesktopShortcut() const;
bool shouldCreateMenuShortcut() const;
// installation choices // installation choices
bool use64BitsClient() const; bool use64BitsClient() const;

View file

@ -147,6 +147,8 @@ void CDownloader::getFileHead()
{ {
// file is already downloaded // file is already downloaded
if (m_listener) m_listener->operationSuccess(m_size); if (m_listener) m_listener->operationSuccess(m_size);
emit downloadDone();
} }
else else
{ {
@ -339,6 +341,10 @@ void CDownloader::onHeadFinished()
downloadFile(); downloadFile();
} }
} }
else
{
emit downloadPrepared();
}
} }
void CDownloader::onDownloadFinished() void CDownloader::onDownloadFinished()
@ -357,6 +363,8 @@ void CDownloader::onDownloadFinished()
bool ok = NLMISC::CFile::setFileModificationDate(m_fullPath.toUtf8().constData(), m_lastModified.toTime_t()); bool ok = NLMISC::CFile::setFileModificationDate(m_fullPath.toUtf8().constData(), m_lastModified.toTime_t());
if (m_listener) m_listener->operationSuccess(m_size); if (m_listener) m_listener->operationSuccess(m_size);
emit downloadDone();
} }
} }
@ -380,7 +388,7 @@ void CDownloader::onDownloadProgress(qint64 current, qint64 total)
if (!m_listener) return; if (!m_listener) return;
m_listener->operationProgress(m_offset + current, ""); // TODO: put file m_listener->operationProgress(m_offset + current, m_url);
// abort download // abort download
if (m_listener->operationShouldStop() && m_reply) m_reply->abort(); if (m_listener->operationShouldStop() && m_reply) m_reply->abort();

View file

@ -42,7 +42,11 @@ public:
bool isDownloading() const { return m_file != NULL; } bool isDownloading() const { return m_file != NULL; }
QString getFileFullPath() const { return m_fullPath; }
signals: signals:
void downloadPrepared();
void downloadDone();
void htmlPageContent(const QString &html); void htmlPageContent(const QString &html);
private slots: private slots:

View file

@ -92,6 +92,7 @@ void CMainWindow::onPlayClicked()
CConfigFile *config = CConfigFile::getInstance(); CConfigFile *config = CConfigFile::getInstance();
const CProfile &profile = config->getProfile(profileIndex); const CProfile &profile = config->getProfile(profileIndex);
const CServer &server = config->getServer(profile.server);
// get full path of client executable // get full path of client executable
QString executable = config->getProfileClientFullPath(profileIndex); QString executable = config->getProfileClientFullPath(profileIndex);
@ -104,8 +105,8 @@ void CMainWindow::onPlayClicked()
arguments << profile.id; arguments << profile.id;
arguments << profile.arguments.split(' '); arguments << profile.arguments.split(' ');
// launch the game with all arguments // launch the game with all arguments and from server root directory (to use right data)
bool started = QProcess::startDetached(executable, arguments); bool started = QProcess::startDetached(executable, arguments, server.getDirectory());
// define this profile as default one // define this profile as default one
CConfigFile::getInstance()->setDefaultProfileIndex(profileIndex); CConfigFile::getInstance()->setDefaultProfileIndex(profileIndex);

View file

@ -62,7 +62,8 @@ enum OperationStep
CopyInstaller, CopyInstaller,
UninstallOldClient, UninstallOldClient,
CreateProfile, CreateProfile,
CreateShortcuts, CreateDesktopShortcut,
CreateMenuShortcut,
CreateAddRemoveEntry, CreateAddRemoveEntry,
Done Done
}; };

View file

@ -21,6 +21,7 @@
#include "configfile.h" #include "configfile.h"
#include "config.h" #include "config.h"
#include "profilesmodel.h" #include "profilesmodel.h"
#include "utils.h"
#include "filescopier.h" #include "filescopier.h"
#include "filesextractor.h" #include "filesextractor.h"
@ -54,6 +55,9 @@ COperationDialog::COperationDialog(QWidget *parent):QDialog(parent), m_aborting(
// downloader // downloader
m_downloader = new CDownloader(this, this); m_downloader = new CDownloader(this, this);
connect(m_downloader, SIGNAL(downloadPrepared()), SLOT(onDownloadPrepared()));
connect(m_downloader, SIGNAL(downloadDone()), SLOT(onDownloadDone()));
connect(operationButtonBox, SIGNAL(clicked(QAbstractButton*)), SLOT(onAbortClicked())); connect(operationButtonBox, SIGNAL(clicked(QAbstractButton*)), SLOT(onAbortClicked()));
// operations // operations
@ -164,8 +168,12 @@ void COperationDialog::processInstallNextStep()
createDefaultProfile(); createDefaultProfile();
break; break;
case CreateShortcuts: case CreateDesktopShortcut:
createDefaultShortcuts(); createClientDesktopShortcut(0);
break;
case CreateMenuShortcut:
createClientMenuShortcut(0);
break; break;
case CreateAddRemoveEntry: case CreateAddRemoveEntry:
@ -278,7 +286,7 @@ void COperationDialog::processUpdateProfilesNextStep()
} }
else else
{ {
QString clientFile = config->getInstallationDirectory() + "/" + server.clientDownloadFilename; QString clientFile = config->getInstallationDirectory() + "/" + config->expandVariables(server.clientDownloadFilename);
} }
} }
} }
@ -343,6 +351,19 @@ void COperationDialog::onAbortClicked()
m_aborting = true; m_aborting = true;
} }
void COperationDialog::onDownloadPrepared()
{
// actually download the file
m_downloader->getFile();
}
void COperationDialog::onDownloadDone()
{
renamePartFile();
emit done();
}
void COperationDialog::onProgressPrepare() void COperationDialog::onProgressPrepare()
{ {
operationProgressBar->setFormat(tr("%p% (%v/%m KiB)")); operationProgressBar->setFormat(tr("%p% (%v/%m KiB)"));
@ -419,15 +440,33 @@ void COperationDialog::downloadData()
const CServer &server = config->getServer(m_currentServerId); const CServer &server = config->getServer(m_currentServerId);
m_currentOperation = QApplication::tr("Download data required by server %1").arg(server.name); m_currentOperation = tr("Download data required by server %1").arg(server.name);
m_currentOperationProgressFormat = QApplication::tr("Downloading %1..."); m_currentOperationProgressFormat = tr("Downloading %1...");
m_downloader->prepareFile(config->expandVariables(server.dataDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.dataDownloadFilename) + ".part"); m_downloader->prepareFile(config->expandVariables(server.dataDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.dataDownloadFilename) + ".part");
} }
void COperationDialog::extractDownloadedData() void COperationDialog::extractDownloadedData()
{ {
// TODO: implement CConfigFile *config = CConfigFile::getInstance();
const CServer &server = config->getServer(m_currentServerId);
m_currentOperation = tr("Extract data files required by server %1").arg(server.name);
m_currentOperationProgressFormat = tr("Extracting %1...");
CFilesExtractor extractor(this);
extractor.setSourceFile(config->getInstallationDirectory() + "/" + server.dataDownloadFilename);
extractor.setDestinationDirectory(server.getDirectory());
if (extractor.exec())
{
}
else
{
}
emit done();
} }
void COperationDialog::downloadClient() void COperationDialog::downloadClient()
@ -436,8 +475,8 @@ void COperationDialog::downloadClient()
const CServer &server = config->getServer(m_currentServerId); const CServer &server = config->getServer(m_currentServerId);
m_currentOperation = QApplication::tr("Download client required by server %1").arg(server.name); m_currentOperation = tr("Download client required by server %1").arg(server.name);
m_currentOperationProgressFormat = QApplication::tr("Downloading %1..."); m_currentOperationProgressFormat = tr("Downloading %1...");
m_downloader->prepareFile(config->expandVariables(server.clientDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.clientDownloadFilename) + ".part"); m_downloader->prepareFile(config->expandVariables(server.clientDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.clientDownloadFilename) + ".part");
} }
@ -448,11 +487,11 @@ void COperationDialog::extractDownloadedClient()
const CServer &server = config->getServer(m_currentServerId); const CServer &server = config->getServer(m_currentServerId);
m_currentOperation = QApplication::tr("Extract data files required by server %1").arg(server.name); m_currentOperation = tr("Extract client files required by server %1").arg(server.name);
m_currentOperationProgressFormat = QApplication::tr("Extracting %1..."); m_currentOperationProgressFormat = tr("Extracting %1...");
CFilesExtractor extractor(this); CFilesExtractor extractor(this);
extractor.setSourceFile(config->getInstallationDirectory() + "/" + server.clientDownloadFilename); extractor.setSourceFile(config->getInstallationDirectory() + "/" + config->expandVariables(server.clientDownloadFilename));
extractor.setDestinationDirectory(server.getDirectory()); extractor.setDestinationDirectory(server.getDirectory());
if (extractor.exec()) if (extractor.exec())
@ -472,8 +511,8 @@ void COperationDialog::copyDataFiles()
// default server // default server
const CServer &server = config->getServer(m_currentServerId); const CServer &server = config->getServer(m_currentServerId);
m_currentOperation = QApplication::tr("Copy data files required by server %1").arg(server.name); m_currentOperation = tr("Copy data files required by server %1").arg(server.name);
m_currentOperationProgressFormat = QApplication::tr("Copying %1..."); m_currentOperationProgressFormat = tr("Copying %1...");
QStringList serverFiles; QStringList serverFiles;
serverFiles << "cfg"; serverFiles << "cfg";
@ -507,8 +546,8 @@ void COperationDialog::copyProfileFiles()
// default profile // default profile
const CProfile &profile = config->getProfile(); const CProfile &profile = config->getProfile();
m_currentOperation = QApplication::tr("Copy old profile to new location"); m_currentOperation = tr("Copy old profile to new location");
m_currentOperationProgressFormat = QApplication::tr("Copying %1..."); m_currentOperationProgressFormat = tr("Copying %1...");
QStringList profileFiles; QStringList profileFiles;
profileFiles << "cache"; profileFiles << "cache";
@ -540,8 +579,8 @@ void COperationDialog::extractBnpClient()
// default server // default server
const CServer &server = config->getServer(); const CServer &server = config->getServer();
m_currentOperation = QApplication::tr("Extract client to new location"); m_currentOperation = tr("Extract client to new location");
m_currentOperationProgressFormat = QApplication::tr("Extracting %1..."); m_currentOperationProgressFormat = tr("Extracting %1...");
QString destinationDirectory = server.getDirectory(); QString destinationDirectory = server.getDirectory();
@ -602,8 +641,8 @@ void COperationDialog::copyInstaller()
// default server // default server
const CServer &server = config->getServer(); const CServer &server = config->getServer();
m_currentOperation = QApplication::tr("Copy installer to new location"); m_currentOperation = tr("Copy installer to new location");
m_currentOperationProgressFormat = QApplication::tr("Copying %1..."); m_currentOperationProgressFormat = tr("Copying %1...");
QString destinationDirectory = config->getInstallationDirectory(); QString destinationDirectory = config->getInstallationDirectory();
@ -624,7 +663,7 @@ void COperationDialog::copyInstaller()
CFilesCopier copier(this); CFilesCopier copier(this);
copier.setIncludeFilter(filter); copier.setIncludeFilter(filter);
copier.addFile(oldInstallerFullPath); copier.addFile(oldInstallerFullPath);
copier.setSourceDirectory(config->getSrcServerDirectory()); copier.setSourceDirectory(config->getSrcServerDirectory().isEmpty() ? QApplication::applicationDirPath():config->getSrcServerDirectory());
copier.setDestinationDirectory(config->getInstallationDirectory()); copier.setDestinationDirectory(config->getInstallationDirectory());
copier.exec(); copier.exec();
@ -639,6 +678,8 @@ void COperationDialog::copyInstaller()
} }
} }
// TODO: create shortcuts for installer
emit done(); emit done();
} }
@ -687,8 +728,8 @@ void COperationDialog::cleanFiles()
// default server // default server
const CServer &server = config->getServer(); const CServer &server = config->getServer();
m_currentOperation = QApplication::tr("Clean obsolete files"); m_currentOperation = tr("Clean obsolete files");
m_currentOperationProgressFormat = QApplication::tr("Deleting %1..."); m_currentOperationProgressFormat = tr("Deleting %1...");
CFilesCleaner cleaner(this); CFilesCleaner cleaner(this);
cleaner.setDirectory(server.getDirectory()); cleaner.setDirectory(server.getDirectory());
@ -703,7 +744,7 @@ bool COperationDialog::createDefaultProfile()
CServer server = config->getServer(); CServer server = config->getServer();
m_currentOperation = QApplication::tr("Create default profile"); m_currentOperation = tr("Create default profile");
CProfile profile; CProfile profile;
@ -711,14 +752,42 @@ bool COperationDialog::createDefaultProfile()
profile.name = QString("Ryzom (%1)").arg(server.name); profile.name = QString("Ryzom (%1)").arg(server.name);
profile.server = server.id; profile.server = server.id;
profile.comments = "Default profile created by Ryzom Installer"; profile.comments = "Default profile created by Ryzom Installer";
profile.desktopShortcut = false;
profile.menuShortcut = false;
#ifdef Q_OS_WIN32 #ifdef Q_OS_WIN32
// C:\Users\Public\Desktop QStringList paths;
profile.desktopShortcut = QFile::exists(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/Ryzom.lnk");
#endif
// TODO // desktop
// profile.menuShortcut
// Windows XP
paths << "C:/Documents and Settings/All Users/Desktop";
// since Windows Vista
paths << "C:/Users/Public/Desktop";
// new location
paths << QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
foreach(const QString &path, paths)
{
if (QFile::exists(path + "/Ryzom.lnk")) profile.desktopShortcut = true;
}
paths.clear();
// start menu
// Windows XP
paths << "C:/Documents and Settings/All Users/Start Menu/Programs";
// since Windows Vista
paths << "C:/ProgramData/Microsoft/Windows/Start Menu/Programs";
// new location
paths << QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation);
foreach(const QString &path, paths)
{
if (QFile::exists(path + "/Ryzom/Ryzom.lnk")) profile.menuShortcut = true;
}
#endif
config->addProfile(profile); config->addProfile(profile);
config->save(); config->save();
@ -728,11 +797,51 @@ bool COperationDialog::createDefaultProfile()
return true; return true;
} }
bool COperationDialog::createDefaultShortcuts() bool COperationDialog::createClientDesktopShortcut(int profileIndex)
{ {
CConfigFile *config = CConfigFile::getInstance(); CConfigFile *config = CConfigFile::getInstance();
CServer server = config->getServer(); const CProfile &profile = config->getProfile(profileIndex);
const CServer &server = config->getServer(profile.server);
m_currentOperation = tr("Create desktop shortcut for profile %1").arg(profile.id);
#ifdef Q_OS_WIN32
if (profile.desktopShortcut)
{
QString shortcut = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/Ryzom.lnk";
CreateLink(config->getProfileClientFullPath(), shortcut, QString("--profile %1 %2").arg(profile.id).arg(profile.arguments), server.getDirectory(), "Default Ryzom client");
}
#endif
emit done();
return true;
}
bool COperationDialog::createClientMenuShortcut(int profileIndex)
{
CConfigFile *config = CConfigFile::getInstance();
const CProfile &profile = config->getProfile(profileIndex);
const CServer &server = config->getServer(profile.server);
m_currentOperation = tr("Create menu shortcut for profile %1").arg(profile.id);
#ifdef Q_OS_WIN32
if (profile.menuShortcut)
{
QString path = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/Ryzom";
QDir dir;
if (dir.mkpath(path))
{
QString shortcut = path + "/Ryzom.lnk";
CreateLink(config->getProfileClientFullPath(), shortcut, QString("--profile %1 %2").arg(profile.id).arg(profile.arguments), server.getDirectory(), "Default Ryzom client");
}
}
#endif
emit done(); emit done();
@ -803,8 +912,8 @@ bool COperationDialog::deleteAddRemoveEntry()
void COperationDialog::deleteComponentsServers() void COperationDialog::deleteComponentsServers()
{ {
m_currentOperation = QApplication::tr("Delete client files"); m_currentOperation = tr("Delete client files");
m_currentOperationProgressFormat = QApplication::tr("Deleting %1..."); m_currentOperationProgressFormat = tr("Deleting %1...");
emit prepare(); emit prepare();
emit init(0, m_components.servers.size()); emit init(0, m_components.servers.size());
@ -846,8 +955,8 @@ void COperationDialog::deleteComponentsServers()
void COperationDialog::deleteComponentsProfiles() void COperationDialog::deleteComponentsProfiles()
{ {
m_currentOperation = QApplication::tr("Delete profiles"); m_currentOperation = tr("Delete profiles");
m_currentOperationProgressFormat = QApplication::tr("Deleting profile %1..."); m_currentOperationProgressFormat = tr("Deleting profile %1...");
emit prepare(); emit prepare();
emit init(0, m_components.servers.size()); emit init(0, m_components.servers.size());
@ -894,8 +1003,8 @@ void COperationDialog::deleteComponentsProfiles()
void COperationDialog::deleteComponentsInstaller() void COperationDialog::deleteComponentsInstaller()
{ {
m_currentOperation = QApplication::tr("Delete installer"); m_currentOperation = tr("Delete installer");
m_currentOperationProgressFormat = QApplication::tr("Deleting %1..."); m_currentOperationProgressFormat = tr("Deleting %1...");
CConfigFile *config = CConfigFile::getInstance(); CConfigFile *config = CConfigFile::getInstance();
@ -948,3 +1057,16 @@ bool COperationDialog::operationShouldStop()
return m_aborting; return m_aborting;
} }
void COperationDialog::renamePartFile()
{
QString partFile = m_downloader->getFileFullPath();
QString finalFile = partFile;
finalFile.remove(".part");
if (partFile != finalFile)
{
QFile::rename(partFile, finalFile);
}
}

View file

@ -44,6 +44,9 @@ public:
public slots: public slots:
void onAbortClicked(); void onAbortClicked();
void onDownloadPrepared();
void onDownloadDone();
void onProgressPrepare(); void onProgressPrepare();
void onProgressInit(qint64 current, qint64 total); void onProgressInit(qint64 current, qint64 total);
void onProgressStart(); void onProgressStart();
@ -99,7 +102,8 @@ protected:
void copyInstaller(); void copyInstaller();
void uninstallOldClient(); void uninstallOldClient();
bool createDefaultProfile(); bool createDefaultProfile();
bool createDefaultShortcuts(); bool createClientDesktopShortcut(int profileIndex);
bool createClientMenuShortcut(int profileIndex);
bool createAddRemoveEntry(); bool createAddRemoveEntry();
bool deleteAddRemoveEntry(); bool deleteAddRemoveEntry();
void deleteComponentsServers(); void deleteComponentsServers();
@ -117,6 +121,8 @@ protected:
virtual bool operationShouldStop(); virtual bool operationShouldStop();
void renamePartFile();
QWinTaskbarButton *m_button; QWinTaskbarButton *m_button;
CDownloader *m_downloader; CDownloader *m_downloader;

View file

@ -31,6 +31,7 @@ CProfilesDialog::CProfilesDialog(QWidget *parent):QDialog(parent), m_currentProf
connect(addButton, SIGNAL(clicked()), SLOT(onAddProfile())); connect(addButton, SIGNAL(clicked()), SLOT(onAddProfile()));
connect(deleteButton, SIGNAL(clicked()), SLOT(onDeleteProfile())); connect(deleteButton, SIGNAL(clicked()), SLOT(onDeleteProfile()));
connect(profilesListView, SIGNAL(clicked(QModelIndex)), SLOT(onProfileClicked(QModelIndex))); connect(profilesListView, SIGNAL(clicked(QModelIndex)), SLOT(onProfileClicked(QModelIndex)));
connect(executableDefaultButton, SIGNAL(clicked()), SLOT(onExecutableDefaultClicked()));
connect(executableBrowseButton, SIGNAL(clicked()), SLOT(onExecutableBrowseClicked())); connect(executableBrowseButton, SIGNAL(clicked()), SLOT(onExecutableBrowseClicked()));
connect(directoryButton, SIGNAL(clicked()), SLOT(onProfileDirectoryClicked())); connect(directoryButton, SIGNAL(clicked()), SLOT(onProfileDirectoryClicked()));
@ -241,10 +242,21 @@ void CProfilesDialog::updateExecutableVersion(int index)
if (reg.indexIn(versionString) > -1) if (reg.indexIn(versionString) > -1)
{ {
executableVersionLabel->setText(reg.cap(2)); executablePathLabel->setText(QString("%1 (%2)").arg(QFileInfo(executable).fileName()).arg(reg.cap(2)));
} }
} }
void CProfilesDialog::onExecutableDefaultClicked()
{
if (m_currentProfileIndex < 0) return;
CProfile &profile = m_model->getProfiles()[m_currentProfileIndex];
profile.executable.clear();
updateExecutableVersion(m_currentProfileIndex);
}
void CProfilesDialog::onExecutableBrowseClicked() void CProfilesDialog::onExecutableBrowseClicked()
{ {
if (m_currentProfileIndex < 0) return; if (m_currentProfileIndex < 0) return;

View file

@ -51,6 +51,7 @@ private slots:
void updateExecutableVersion(int index); void updateExecutableVersion(int index);
void onExecutableDefaultClicked();
void onExecutableBrowseClicked(); void onExecutableBrowseClicked();
private: private:

View file

@ -111,22 +111,22 @@ wchar_t* qToWide(const QString &str)
// Shell link, stored in the Comment field of the link // Shell link, stored in the Comment field of the link
// properties. // properties.
HRESULT CreateLink(const QString &pathObj, const QString &pathLink, const QString &desc) bool CreateLink(const QString &pathObj, const QString &pathLink, const QString &arguments, const QString &workingDir, const QString &desc)
{ {
IShellLinkW* psl; IShellLinkW* psl;
// Get a pointer to the IShellLink interface. It is assumed that CoInitialize // Get a pointer to the IShellLink interface. It is assumed that CoInitialize
// has already been called. // has already been called.
HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID*)&psl);
if (SUCCEEDED(hres)) if (SUCCEEDED(hres))
{ {
IPersistFile* ppf; IPersistFile* ppf;
// Set the path to the shortcut target and add the description. // Set the path to the shortcut target and add the description.
psl->SetPath(qToWide(pathObj)); psl->SetPath(qToWide(QDir::toNativeSeparators(pathObj)));
psl->SetDescription(qToWide(desc)); psl->SetDescription(qToWide(desc));
psl->SetArguments(L"--profil "); psl->SetArguments(qToWide(arguments));
psl->SetWorkingDirectory(L""); psl->SetWorkingDirectory(qToWide(QDir::toNativeSeparators(workingDir)));
// Query IShellLink for the IPersistFile interface, used for saving the // Query IShellLink for the IPersistFile interface, used for saving the
// shortcut in persistent storage. // shortcut in persistent storage.
@ -138,12 +138,12 @@ HRESULT CreateLink(const QString &pathObj, const QString &pathLink, const QStrin
// for success. // for success.
// Save the link by calling IPersistFile::Save. // Save the link by calling IPersistFile::Save.
hres = ppf->Save(qToWide(pathLink), TRUE); hres = ppf->Save(qToWide(QDir::toNativeSeparators(pathLink)), TRUE);
ppf->Release(); ppf->Release();
} }
psl->Release(); psl->Release();
} }
return hres; return SUCCEEDED(hres);
} }
// ResolveIt - Uses the Shell's IShellLink and IPersistFile interfaces // ResolveIt - Uses the Shell's IShellLink and IPersistFile interfaces
@ -163,7 +163,7 @@ HRESULT CreateLink(const QString &pathObj, const QString &pathLink, const QStrin
// Shell link, stored in the Comment field of the link // Shell link, stored in the Comment field of the link
// properties. // properties.
HRESULT ResolveIt(HWND hwnd, const QString &linkFile, QString &path) bool ResolveLink(const QWidget &window, const QString &linkFile, QString &path)
{ {
IShellLinkW* psl; IShellLinkW* psl;
WIN32_FIND_DATAW wfd; WIN32_FIND_DATAW wfd;
@ -186,12 +186,12 @@ HRESULT ResolveIt(HWND hwnd, const QString &linkFile, QString &path)
// for success. // for success.
// Load the shortcut. // Load the shortcut.
hres = ppf->Load(qToWide(linkFile), STGM_READ); hres = ppf->Load(qToWide(QDir::toNativeSeparators(linkFile)), STGM_READ);
if (SUCCEEDED(hres)) if (SUCCEEDED(hres))
{ {
// Resolve the link. // Resolve the link.
hres = psl->Resolve(hwnd, 0); hres = psl->Resolve((HWND)window.winId(), 0);
if (SUCCEEDED(hres)) if (SUCCEEDED(hres))
{ {
@ -210,7 +210,7 @@ HRESULT ResolveIt(HWND hwnd, const QString &linkFile, QString &path)
if (SUCCEEDED(hres)) if (SUCCEEDED(hres))
{ {
// Handle success // Handle success
path = qFromWide(szGotPath); path = QDir::fromNativeSeparators(qFromWide(szGotPath));
} }
else else
{ {
@ -227,7 +227,19 @@ HRESULT ResolveIt(HWND hwnd, const QString &linkFile, QString &path)
psl->Release(); psl->Release();
} }
return hres; return SUCCEEDED(hres);
}
#else
bool CreateLink(const QString &pathObj, const QString &pathLink, const QString &arguments, const QString &workingDir, const QString &desc)
{
return false;
}
bool ResolveLink(const QWidget &window, const QString &pathLink, QString &pathObj)
{
return false;
} }
#endif #endif

View file

@ -48,4 +48,7 @@ QString qFromWide(const wchar_t *str);
wchar_t* qToWide(const QString &str); wchar_t* qToWide(const QString &str);
bool CreateLink(const QString &pathObj, const QString &pathLink, const QString &arguments, const QString &workingDir, const QString &desc);
bool ResolveLink(const QWidget &window, const QString &pathLink, QString &pathObj);
#endif #endif

View file

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>583</width> <width>583</width>
<height>348</height> <height>329</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -119,7 +119,7 @@
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<layout class="QHBoxLayout" name="executableLayout" stretch="1,0"> <layout class="QHBoxLayout" name="executableLayout" stretch="1,0,0">
<item> <item>
<widget class="QLabel" name="executablePathLabel"> <widget class="QLabel" name="executablePathLabel">
<property name="text"> <property name="text">
@ -127,6 +127,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="executableDefaultButton">
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="executableBrowseButton"> <widget class="QPushButton" name="executableBrowseButton">
<property name="text"> <property name="text">
@ -137,37 +144,23 @@
</layout> </layout>
</item> </item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="clientVersionLabel">
<property name="text">
<string>Client version:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="executableVersionLabel">
<property name="text">
<string>FV 3.0.0</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="argumentsLabel"> <widget class="QLabel" name="argumentsLabel">
<property name="text"> <property name="text">
<string>Arguments:</string> <string>Arguments:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1"> <item row="4" column="1">
<widget class="QLineEdit" name="argumentsEdit"/> <widget class="QLineEdit" name="argumentsEdit"/>
</item> </item>
<item row="6" column="0"> <item row="5" column="0">
<widget class="QLabel" name="commentsLabel"> <widget class="QLabel" name="commentsLabel">
<property name="text"> <property name="text">
<string>Comments:</string> <string>Comments:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="1"> <item row="5" column="1">
<widget class="QPlainTextEdit" name="commentsEdit"> <widget class="QPlainTextEdit" name="commentsEdit">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
@ -177,14 +170,14 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="0"> <item row="6" column="0">
<widget class="QLabel" name="directoryLabel"> <widget class="QLabel" name="directoryLabel">
<property name="text"> <property name="text">
<string>Directory:</string> <string>Directory:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="1"> <item row="6" column="1">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0"> <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0">
<item> <item>
<widget class="QLabel" name="directoryPathLabel"> <widget class="QLabel" name="directoryPathLabel">
@ -202,14 +195,14 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="8" column="0"> <item row="7" column="0">
<widget class="QLabel" name="shortcutsLabel"> <widget class="QLabel" name="shortcutsLabel">
<property name="text"> <property name="text">
<string>Create shortcuts:</string> <string>Create shortcuts:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="1"> <item row="7" column="1">
<layout class="QVBoxLayout" name="shortcutsLayout"> <layout class="QVBoxLayout" name="shortcutsLayout">
<item> <item>
<widget class="QCheckBox" name="desktopShortcutCheckBox"> <widget class="QCheckBox" name="desktopShortcutCheckBox">