diff --git a/code/nel/src/misc/path.cpp b/code/nel/src/misc/path.cpp
index 061c938a5..9737589f7 100644
--- a/code/nel/src/misc/path.cpp
+++ b/code/nel/src/misc/path.cpp
@@ -1784,7 +1784,9 @@ std::string CPath::getApplicationDirectory(const std::string &appName, bool loca
std::string CFileContainer::getApplicationDirectory(const std::string &appName, bool local)
{
static std::string appPaths[2];
+
std::string &appPath = appPaths[local ? 1 : 0];
+
if (appPath.empty())
{
#ifdef NL_OS_WINDOWS
@@ -1800,26 +1802,21 @@ std::string CFileContainer::getApplicationDirectory(const std::string &appName,
SHGetSpecialFolderPathW(NULL, buffer, CSIDL_APPDATA, TRUE);
}
appPath = CPath::standardizePath(wideToUtf8(buffer));
-#elif defined(NL_OS_MAC)
- appPath = CPath::standardizePath(getenv("HOME"));
- appPath += "/Library/Application Support/";
#else
- appPath = CPath::standardizePath(getenv("HOME"));
-#endif
- }
+ // get user home directory from HOME environment variable
+ const char* homePath = getenv("HOME");
+ appPath = CPath::standardizePath(homePath ? homePath : ".");
- std::string path = appPath;
-#ifdef NL_OS_WINDOWS
- if (!appName.empty())
- path = CPath::standardizePath(path + appName);
-#elif defined(NL_OS_MAC)
- path = CPath::standardizePath(path + appName);
+#if defined(NL_OS_MAC)
+ appPath += "Library/Application Support/";
#else
- if (!appName.empty())
- path = CPath::standardizePath(path + "." + toLower(appName));
+ // recommended for applications data that are owned by user
+ appPath += ".local/share/";
+#endif
#endif
+ }
- return path;
+ return CPath::standardizePath(appPath + appName);
}
std::string CPath::getTemporaryDirectory()
diff --git a/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp b/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp
index 4cb77cfff..594bf9d1c 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp
+++ b/code/ryzom/tools/client/ryzom_installer/src/configfile.cpp
@@ -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_defaultConfigPath = QApplication::applicationDirPath() + "/installer.ini";
- m_configPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/installer.ini";
+ m_configPath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/installer.ini";
}
CConfigFile::~CConfigFile()
@@ -608,9 +608,24 @@ bool CConfigFile::foundTemporaryFiles(const QString &directory) const
bool CConfigFile::shouldCreateDesktopShortcut() const
{
+#ifdef Q_OS_WIN32
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
@@ -704,7 +719,7 @@ OperationStep CConfigFile::getInstallNextStep() const
// downloaded files are kept in server directory
QString dataFile = getInstallationDirectory() + "/" + server.dataDownloadFilename;
- QString clientFile = getInstallationDirectory() + "/" + server.clientDownloadFilename;
+ QString clientFile = getInstallationDirectory() + "/" + expandVariables(server.clientDownloadFilename);
// data are not copied
if (!areRyzomDataInstalledIn(serverDirectory))
@@ -760,7 +775,7 @@ OperationStep CConfigFile::getInstallNextStep() const
return ExtractBnpClient;
}
- QString clientFile = getInstallationDirectory() + "/" + server.clientDownloadFilename;
+ QString clientFile = getInstallationDirectory() + "/" + expandVariables(server.clientDownloadFilename);
// when file is not finished, it has .part extension
if (!QFile::exists(clientFile))
@@ -799,8 +814,12 @@ OperationStep CConfigFile::getInstallNextStep() const
if (shouldCreateDesktopShortcut())
{
- // TODO: check they point to getClientFullPath()
- return CreateShortcuts;
+ return CreateDesktopShortcut;
+ }
+
+ if (shouldCreateMenuShortcut())
+ {
+ return CreateMenuShortcut;
}
#ifdef Q_OS_WIN
diff --git a/code/ryzom/tools/client/ryzom_installer/src/configfile.h b/code/ryzom/tools/client/ryzom_installer/src/configfile.h
index 2ecd3e211..dd00b94e8 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/configfile.h
+++ b/code/ryzom/tools/client/ryzom_installer/src/configfile.h
@@ -153,6 +153,7 @@ public:
bool foundTemporaryFiles(const QString &directory) const;
bool shouldCreateDesktopShortcut() const;
+ bool shouldCreateMenuShortcut() const;
// installation choices
bool use64BitsClient() const;
diff --git a/code/ryzom/tools/client/ryzom_installer/src/downloader.cpp b/code/ryzom/tools/client/ryzom_installer/src/downloader.cpp
index 3c85a8031..ba49a8842 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/downloader.cpp
+++ b/code/ryzom/tools/client/ryzom_installer/src/downloader.cpp
@@ -147,6 +147,8 @@ void CDownloader::getFileHead()
{
// file is already downloaded
if (m_listener) m_listener->operationSuccess(m_size);
+
+ emit downloadDone();
}
else
{
@@ -339,6 +341,10 @@ void CDownloader::onHeadFinished()
downloadFile();
}
}
+ else
+ {
+ emit downloadPrepared();
+ }
}
void CDownloader::onDownloadFinished()
@@ -357,6 +363,8 @@ void CDownloader::onDownloadFinished()
bool ok = NLMISC::CFile::setFileModificationDate(m_fullPath.toUtf8().constData(), m_lastModified.toTime_t());
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;
- m_listener->operationProgress(m_offset + current, ""); // TODO: put file
+ m_listener->operationProgress(m_offset + current, m_url);
// abort download
if (m_listener->operationShouldStop() && m_reply) m_reply->abort();
diff --git a/code/ryzom/tools/client/ryzom_installer/src/downloader.h b/code/ryzom/tools/client/ryzom_installer/src/downloader.h
index 4d3163723..585e4d59a 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/downloader.h
+++ b/code/ryzom/tools/client/ryzom_installer/src/downloader.h
@@ -42,7 +42,11 @@ public:
bool isDownloading() const { return m_file != NULL; }
+ QString getFileFullPath() const { return m_fullPath; }
+
signals:
+ void downloadPrepared();
+ void downloadDone();
void htmlPageContent(const QString &html);
private slots:
diff --git a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp
index 52109f703..27bd38a32 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp
+++ b/code/ryzom/tools/client/ryzom_installer/src/mainwindow.cpp
@@ -92,6 +92,7 @@ void CMainWindow::onPlayClicked()
CConfigFile *config = CConfigFile::getInstance();
const CProfile &profile = config->getProfile(profileIndex);
+ const CServer &server = config->getServer(profile.server);
// get full path of client executable
QString executable = config->getProfileClientFullPath(profileIndex);
@@ -104,8 +105,8 @@ void CMainWindow::onPlayClicked()
arguments << profile.id;
arguments << profile.arguments.split(' ');
- // launch the game with all arguments
- bool started = QProcess::startDetached(executable, arguments);
+ // launch the game with all arguments and from server root directory (to use right data)
+ bool started = QProcess::startDetached(executable, arguments, server.getDirectory());
// define this profile as default one
CConfigFile::getInstance()->setDefaultProfileIndex(profileIndex);
diff --git a/code/ryzom/tools/client/ryzom_installer/src/operation.h b/code/ryzom/tools/client/ryzom_installer/src/operation.h
index e8e0af678..4c3a88c07 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/operation.h
+++ b/code/ryzom/tools/client/ryzom_installer/src/operation.h
@@ -62,7 +62,8 @@ enum OperationStep
CopyInstaller,
UninstallOldClient,
CreateProfile,
- CreateShortcuts,
+ CreateDesktopShortcut,
+ CreateMenuShortcut,
CreateAddRemoveEntry,
Done
};
diff --git a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp
index 667dad6f4..fe5c8f372 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp
+++ b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.cpp
@@ -21,6 +21,7 @@
#include "configfile.h"
#include "config.h"
#include "profilesmodel.h"
+#include "utils.h"
#include "filescopier.h"
#include "filesextractor.h"
@@ -54,6 +55,9 @@ COperationDialog::COperationDialog(QWidget *parent):QDialog(parent), m_aborting(
// downloader
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()));
// operations
@@ -164,8 +168,12 @@ void COperationDialog::processInstallNextStep()
createDefaultProfile();
break;
- case CreateShortcuts:
- createDefaultShortcuts();
+ case CreateDesktopShortcut:
+ createClientDesktopShortcut(0);
+ break;
+
+ case CreateMenuShortcut:
+ createClientMenuShortcut(0);
break;
case CreateAddRemoveEntry:
@@ -278,7 +286,7 @@ void COperationDialog::processUpdateProfilesNextStep()
}
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;
}
+void COperationDialog::onDownloadPrepared()
+{
+ // actually download the file
+ m_downloader->getFile();
+}
+
+void COperationDialog::onDownloadDone()
+{
+ renamePartFile();
+
+ emit done();
+}
+
void COperationDialog::onProgressPrepare()
{
operationProgressBar->setFormat(tr("%p% (%v/%m KiB)"));
@@ -419,15 +440,33 @@ void COperationDialog::downloadData()
const CServer &server = config->getServer(m_currentServerId);
- m_currentOperation = QApplication::tr("Download data required by server %1").arg(server.name);
- m_currentOperationProgressFormat = QApplication::tr("Downloading %1...");
+ m_currentOperation = tr("Download data required by server %1").arg(server.name);
+ m_currentOperationProgressFormat = tr("Downloading %1...");
m_downloader->prepareFile(config->expandVariables(server.dataDownloadUrl), config->getInstallationDirectory() + "/" + config->expandVariables(server.dataDownloadFilename) + ".part");
}
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()
@@ -436,8 +475,8 @@ void COperationDialog::downloadClient()
const CServer &server = config->getServer(m_currentServerId);
- m_currentOperation = QApplication::tr("Download client required by server %1").arg(server.name);
- m_currentOperationProgressFormat = QApplication::tr("Downloading %1...");
+ m_currentOperation = tr("Download client required by server %1").arg(server.name);
+ m_currentOperationProgressFormat = tr("Downloading %1...");
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);
- m_currentOperation = QApplication::tr("Extract data files required by server %1").arg(server.name);
- m_currentOperationProgressFormat = QApplication::tr("Extracting %1...");
+ m_currentOperation = tr("Extract client files required by server %1").arg(server.name);
+ m_currentOperationProgressFormat = tr("Extracting %1...");
CFilesExtractor extractor(this);
- extractor.setSourceFile(config->getInstallationDirectory() + "/" + server.clientDownloadFilename);
+ extractor.setSourceFile(config->getInstallationDirectory() + "/" + config->expandVariables(server.clientDownloadFilename));
extractor.setDestinationDirectory(server.getDirectory());
if (extractor.exec())
@@ -472,8 +511,8 @@ void COperationDialog::copyDataFiles()
// default server
const CServer &server = config->getServer(m_currentServerId);
- m_currentOperation = QApplication::tr("Copy data files required by server %1").arg(server.name);
- m_currentOperationProgressFormat = QApplication::tr("Copying %1...");
+ m_currentOperation = tr("Copy data files required by server %1").arg(server.name);
+ m_currentOperationProgressFormat = tr("Copying %1...");
QStringList serverFiles;
serverFiles << "cfg";
@@ -507,8 +546,8 @@ void COperationDialog::copyProfileFiles()
// default profile
const CProfile &profile = config->getProfile();
- m_currentOperation = QApplication::tr("Copy old profile to new location");
- m_currentOperationProgressFormat = QApplication::tr("Copying %1...");
+ m_currentOperation = tr("Copy old profile to new location");
+ m_currentOperationProgressFormat = tr("Copying %1...");
QStringList profileFiles;
profileFiles << "cache";
@@ -540,8 +579,8 @@ void COperationDialog::extractBnpClient()
// default server
const CServer &server = config->getServer();
- m_currentOperation = QApplication::tr("Extract client to new location");
- m_currentOperationProgressFormat = QApplication::tr("Extracting %1...");
+ m_currentOperation = tr("Extract client to new location");
+ m_currentOperationProgressFormat = tr("Extracting %1...");
QString destinationDirectory = server.getDirectory();
@@ -602,8 +641,8 @@ void COperationDialog::copyInstaller()
// default server
const CServer &server = config->getServer();
- m_currentOperation = QApplication::tr("Copy installer to new location");
- m_currentOperationProgressFormat = QApplication::tr("Copying %1...");
+ m_currentOperation = tr("Copy installer to new location");
+ m_currentOperationProgressFormat = tr("Copying %1...");
QString destinationDirectory = config->getInstallationDirectory();
@@ -624,7 +663,7 @@ void COperationDialog::copyInstaller()
CFilesCopier copier(this);
copier.setIncludeFilter(filter);
copier.addFile(oldInstallerFullPath);
- copier.setSourceDirectory(config->getSrcServerDirectory());
+ copier.setSourceDirectory(config->getSrcServerDirectory().isEmpty() ? QApplication::applicationDirPath():config->getSrcServerDirectory());
copier.setDestinationDirectory(config->getInstallationDirectory());
copier.exec();
@@ -639,6 +678,8 @@ void COperationDialog::copyInstaller()
}
}
+ // TODO: create shortcuts for installer
+
emit done();
}
@@ -687,8 +728,8 @@ void COperationDialog::cleanFiles()
// default server
const CServer &server = config->getServer();
- m_currentOperation = QApplication::tr("Clean obsolete files");
- m_currentOperationProgressFormat = QApplication::tr("Deleting %1...");
+ m_currentOperation = tr("Clean obsolete files");
+ m_currentOperationProgressFormat = tr("Deleting %1...");
CFilesCleaner cleaner(this);
cleaner.setDirectory(server.getDirectory());
@@ -703,7 +744,7 @@ bool COperationDialog::createDefaultProfile()
CServer server = config->getServer();
- m_currentOperation = QApplication::tr("Create default profile");
+ m_currentOperation = tr("Create default profile");
CProfile profile;
@@ -711,14 +752,42 @@ bool COperationDialog::createDefaultProfile()
profile.name = QString("Ryzom (%1)").arg(server.name);
profile.server = server.id;
profile.comments = "Default profile created by Ryzom Installer";
+ profile.desktopShortcut = false;
+ profile.menuShortcut = false;
#ifdef Q_OS_WIN32
-// C:\Users\Public\Desktop
- profile.desktopShortcut = QFile::exists(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/Ryzom.lnk");
-#endif
+ QStringList paths;
+
+ // desktop
+
+ // 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);
- // TODO
- // profile.menuShortcut
+ 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->save();
@@ -728,11 +797,51 @@ bool COperationDialog::createDefaultProfile()
return true;
}
-bool COperationDialog::createDefaultShortcuts()
+bool COperationDialog::createClientDesktopShortcut(int profileIndex)
{
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();
@@ -803,8 +912,8 @@ bool COperationDialog::deleteAddRemoveEntry()
void COperationDialog::deleteComponentsServers()
{
- m_currentOperation = QApplication::tr("Delete client files");
- m_currentOperationProgressFormat = QApplication::tr("Deleting %1...");
+ m_currentOperation = tr("Delete client files");
+ m_currentOperationProgressFormat = tr("Deleting %1...");
emit prepare();
emit init(0, m_components.servers.size());
@@ -846,8 +955,8 @@ void COperationDialog::deleteComponentsServers()
void COperationDialog::deleteComponentsProfiles()
{
- m_currentOperation = QApplication::tr("Delete profiles");
- m_currentOperationProgressFormat = QApplication::tr("Deleting profile %1...");
+ m_currentOperation = tr("Delete profiles");
+ m_currentOperationProgressFormat = tr("Deleting profile %1...");
emit prepare();
emit init(0, m_components.servers.size());
@@ -894,8 +1003,8 @@ void COperationDialog::deleteComponentsProfiles()
void COperationDialog::deleteComponentsInstaller()
{
- m_currentOperation = QApplication::tr("Delete installer");
- m_currentOperationProgressFormat = QApplication::tr("Deleting %1...");
+ m_currentOperation = tr("Delete installer");
+ m_currentOperationProgressFormat = tr("Deleting %1...");
CConfigFile *config = CConfigFile::getInstance();
@@ -948,3 +1057,16 @@ bool COperationDialog::operationShouldStop()
return m_aborting;
}
+
+void COperationDialog::renamePartFile()
+{
+ QString partFile = m_downloader->getFileFullPath();
+
+ QString finalFile = partFile;
+ finalFile.remove(".part");
+
+ if (partFile != finalFile)
+ {
+ QFile::rename(partFile, finalFile);
+ }
+}
diff --git a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h
index c37f08e42..a170c30a0 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h
+++ b/code/ryzom/tools/client/ryzom_installer/src/operationdialog.h
@@ -44,6 +44,9 @@ public:
public slots:
void onAbortClicked();
+ void onDownloadPrepared();
+ void onDownloadDone();
+
void onProgressPrepare();
void onProgressInit(qint64 current, qint64 total);
void onProgressStart();
@@ -99,7 +102,8 @@ protected:
void copyInstaller();
void uninstallOldClient();
bool createDefaultProfile();
- bool createDefaultShortcuts();
+ bool createClientDesktopShortcut(int profileIndex);
+ bool createClientMenuShortcut(int profileIndex);
bool createAddRemoveEntry();
bool deleteAddRemoveEntry();
void deleteComponentsServers();
@@ -117,6 +121,8 @@ protected:
virtual bool operationShouldStop();
+ void renamePartFile();
+
QWinTaskbarButton *m_button;
CDownloader *m_downloader;
diff --git a/code/ryzom/tools/client/ryzom_installer/src/profilesdialog.cpp b/code/ryzom/tools/client/ryzom_installer/src/profilesdialog.cpp
index 85c176219..cbfcacaf8 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/profilesdialog.cpp
+++ b/code/ryzom/tools/client/ryzom_installer/src/profilesdialog.cpp
@@ -31,6 +31,7 @@ CProfilesDialog::CProfilesDialog(QWidget *parent):QDialog(parent), m_currentProf
connect(addButton, SIGNAL(clicked()), SLOT(onAddProfile()));
connect(deleteButton, SIGNAL(clicked()), SLOT(onDeleteProfile()));
connect(profilesListView, SIGNAL(clicked(QModelIndex)), SLOT(onProfileClicked(QModelIndex)));
+ connect(executableDefaultButton, SIGNAL(clicked()), SLOT(onExecutableDefaultClicked()));
connect(executableBrowseButton, SIGNAL(clicked()), SLOT(onExecutableBrowseClicked()));
connect(directoryButton, SIGNAL(clicked()), SLOT(onProfileDirectoryClicked()));
@@ -241,10 +242,21 @@ void CProfilesDialog::updateExecutableVersion(int index)
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()
{
if (m_currentProfileIndex < 0) return;
diff --git a/code/ryzom/tools/client/ryzom_installer/src/profilesdialog.h b/code/ryzom/tools/client/ryzom_installer/src/profilesdialog.h
index 268525fd6..9f364f4ae 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/profilesdialog.h
+++ b/code/ryzom/tools/client/ryzom_installer/src/profilesdialog.h
@@ -51,6 +51,7 @@ private slots:
void updateExecutableVersion(int index);
+ void onExecutableDefaultClicked();
void onExecutableBrowseClicked();
private:
diff --git a/code/ryzom/tools/client/ryzom_installer/src/utils.cpp b/code/ryzom/tools/client/ryzom_installer/src/utils.cpp
index 5ab73f298..d9ebda4c0 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/utils.cpp
+++ b/code/ryzom/tools/client/ryzom_installer/src/utils.cpp
@@ -111,22 +111,22 @@ wchar_t* qToWide(const QString &str)
// Shell link, stored in the Comment field of the link
// 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;
// Get a pointer to the IShellLink interface. It is assumed that CoInitialize
// 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))
{
IPersistFile* ppf;
// 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->SetArguments(L"--profil ");
- psl->SetWorkingDirectory(L"");
+ psl->SetArguments(qToWide(arguments));
+ psl->SetWorkingDirectory(qToWide(QDir::toNativeSeparators(workingDir)));
// Query IShellLink for the IPersistFile interface, used for saving the
// shortcut in persistent storage.
@@ -138,12 +138,12 @@ HRESULT CreateLink(const QString &pathObj, const QString &pathLink, const QStrin
// for success.
// Save the link by calling IPersistFile::Save.
- hres = ppf->Save(qToWide(pathLink), TRUE);
+ hres = ppf->Save(qToWide(QDir::toNativeSeparators(pathLink)), TRUE);
ppf->Release();
}
psl->Release();
}
- return hres;
+ return SUCCEEDED(hres);
}
// 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
// properties.
-HRESULT ResolveIt(HWND hwnd, const QString &linkFile, QString &path)
+bool ResolveLink(const QWidget &window, const QString &linkFile, QString &path)
{
IShellLinkW* psl;
WIN32_FIND_DATAW wfd;
@@ -186,12 +186,12 @@ HRESULT ResolveIt(HWND hwnd, const QString &linkFile, QString &path)
// for success.
// Load the shortcut.
- hres = ppf->Load(qToWide(linkFile), STGM_READ);
+ hres = ppf->Load(qToWide(QDir::toNativeSeparators(linkFile)), STGM_READ);
if (SUCCEEDED(hres))
{
// Resolve the link.
- hres = psl->Resolve(hwnd, 0);
+ hres = psl->Resolve((HWND)window.winId(), 0);
if (SUCCEEDED(hres))
{
@@ -210,7 +210,7 @@ HRESULT ResolveIt(HWND hwnd, const QString &linkFile, QString &path)
if (SUCCEEDED(hres))
{
// Handle success
- path = qFromWide(szGotPath);
+ path = QDir::fromNativeSeparators(qFromWide(szGotPath));
}
else
{
@@ -227,7 +227,19 @@ HRESULT ResolveIt(HWND hwnd, const QString &linkFile, QString &path)
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
diff --git a/code/ryzom/tools/client/ryzom_installer/src/utils.h b/code/ryzom/tools/client/ryzom_installer/src/utils.h
index 8e760b400..6c2533076 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/utils.h
+++ b/code/ryzom/tools/client/ryzom_installer/src/utils.h
@@ -48,4 +48,7 @@ QString qFromWide(const wchar_t *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
diff --git a/code/ryzom/tools/client/ryzom_installer/ui/profilesdialog.ui b/code/ryzom/tools/client/ryzom_installer/ui/profilesdialog.ui
index c0c12bab2..670845482 100644
--- a/code/ryzom/tools/client/ryzom_installer/ui/profilesdialog.ui
+++ b/code/ryzom/tools/client/ryzom_installer/ui/profilesdialog.ui
@@ -7,7 +7,7 @@
0
0
583
- 348
+ 329
@@ -119,7 +119,7 @@
-
-
+
-
@@ -127,6 +127,13 @@
+ -
+
+
+ Default
+
+
+
-
@@ -137,37 +144,23 @@
-
-
-
- Client version:
-
-
-
- -
-
-
- FV 3.0.0
-
-
-
- -
Arguments:
- -
+
-
- -
+
-
Comments:
- -
+
-
@@ -177,14 +170,14 @@
- -
+
-
Directory:
- -
+
-
-
@@ -202,14 +195,14 @@
- -
+
-
Create shortcuts:
- -
+
-
-