diff options
Diffstat (limited to 'src/libs/installer/createshortcutoperation.cpp')
-rw-r--r-- | src/libs/installer/createshortcutoperation.cpp | 59 |
1 files changed, 38 insertions, 21 deletions
diff --git a/src/libs/installer/createshortcutoperation.cpp b/src/libs/installer/createshortcutoperation.cpp index 62f7cfa82..9f9084e05 100644 --- a/src/libs/installer/createshortcutoperation.cpp +++ b/src/libs/installer/createshortcutoperation.cpp @@ -79,12 +79,17 @@ struct DeCoInitializer }; #endif -struct StartsWithWorkingDirectory +struct StartsWith { - bool operator()(const QString &s) + StartsWith(const QString &searchTerm) + : m_searchTerm(searchTerm) {} + + bool operator()(const QString &searchString) { - return s.startsWith(QLatin1String("workingDirectory=")); + return searchString.startsWith(m_searchTerm); } + + QString m_searchTerm; }; static QString parentDirectory(const QString ¤t) @@ -92,23 +97,25 @@ static QString parentDirectory(const QString ¤t) return current.mid(0, current.lastIndexOf(QLatin1Char('/'))); } -static QString takeWorkingDirArgument(QStringList &args) +static QString takeArgument(const QString argument, QStringList *arguments) { - // if the arguments contain an option in the form "workingDirectory=...", find it and consume it - QStringList::iterator wdiropt = std::find_if (args.begin(), args.end(), StartsWithWorkingDirectory()); - if (wdiropt == args.end()) + // if the arguments contain an option in the form "argument=...", find it and consume it + QStringList::iterator it = std::find_if(arguments->begin(), arguments->end(), StartsWith(argument)); + if (it == arguments->end()) return QString(); - const QString workingDir = wdiropt->mid(QString::fromLatin1("workingDirectory=").size()); - args.erase(wdiropt); - return workingDir; + const QString value = it->mid(argument.size()); + arguments->erase(it); + return value; } static bool createLink(const QString &fileName, const QString &linkName, QString workingDir, - QString arguments = QString()) + const QString &arguments = QString(), const QString &iconPath = QString(), + const QString &iconId = QString()) { - bool success = QFile::link(fileName, linkName); #ifdef Q_OS_WIN + bool success = QFile::link(fileName, linkName); + if (!success) return success; @@ -128,10 +135,12 @@ static bool createLink(const QString &fileName, const QString &linkName, QString psl->SetWorkingDirectory((wchar_t *)workingDir.utf16()); if (!arguments.isNull()) psl->SetArguments((wchar_t*)arguments.utf16()); + if (!iconPath.isNull()) + psl->SetIconLocation((wchar_t*)(iconPath.utf16()), iconId.toInt()); IPersistFile *ppf = NULL; if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (void **)&ppf))) { - ppf->Save((wchar_t*)QDir::toNativeSeparators(linkName).utf16(), TRUE); + ppf->Save((wchar_t*)QDir::toNativeSeparators(linkName).utf16(), true); ppf->Release(); } psl->Release(); @@ -145,11 +154,17 @@ static bool createLink(const QString &fileName, const QString &linkName, QString SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, 0); CoTaskMemFree(pidl); } + + return success; #else Q_UNUSED(arguments) Q_UNUSED(workingDir) + Q_UNUSED(fileName) + Q_UNUSED(linkName) + Q_UNUSED(iconPath) + Q_UNUSED(iconId) + return true; #endif - return success; } @@ -177,12 +192,16 @@ void CreateShortcutOperation::backup() bool CreateShortcutOperation::performOperation() { QStringList args = arguments(); - const QString workingDir = takeWorkingDirArgument(args); + + const QString iconId = takeArgument(QString::fromLatin1("iconId="), &args); + const QString iconPath = takeArgument(QString::fromLatin1("iconPath="), &args); + const QString workingDir = takeArgument(QString::fromLatin1("workingDirectory="), &args); if (args.count() != 2 && args.count() != 3) { setError(InvalidArguments); setErrorString(tr("Invalid arguments in %0: %1 arguments given, %2 expected%3.") - .arg(name()).arg(arguments().count()).arg(tr("2 or 3"), tr(" (optional: 'workingDirectory=...')"))); + .arg(name()).arg(arguments().count()).arg(tr("2 or 3"), + tr(" (optional: 'workingDirectory=...', 'iconPath=...', 'iconId=...')"))); return false; } @@ -190,10 +209,8 @@ bool CreateShortcutOperation::performOperation() const QString linkLocation = args.at(1); const QString targetArguments = args.value(2); //used value because it could be not existing - const QString linkPath = QFileInfo(linkLocation).absolutePath(); - - const bool linkPathAlreadyExists = QDir(linkPath).exists(); - const bool created = linkPathAlreadyExists || QDir::root().mkpath(linkPath); + const QString linkPath = QFileInfo(linkLocation).absolutePath().trimmed(); + const bool created = QDir(linkPath).exists() || QDir::root().mkpath(linkPath); if (!created) { setError(UserDefinedError); @@ -219,7 +236,7 @@ bool CreateShortcutOperation::performOperation() return false; } - const bool linked = createLink(linkTarget, linkLocation, workingDir, targetArguments); + const bool linked = createLink(linkTarget, linkLocation, workingDir, targetArguments, iconPath, iconId); if (!linked) { setError(UserDefinedError); setErrorString(tr("Could not create link %1: %2").arg(QDir::toNativeSeparators(linkLocation), |