From 369b1c55c99aa8bdcd2d57ab4aad3633343f1417 Mon Sep 17 00:00:00 2001 From: Orochimarufan Date: Wed, 13 Feb 2013 04:03:15 +0100 Subject: implement desktop shortcut creation. windows code not tested. --- util/userutil.cpp | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 util/userutil.cpp (limited to 'util/userutil.cpp') diff --git a/util/userutil.cpp b/util/userutil.cpp new file mode 100644 index 00000000..9a7b2e12 --- /dev/null +++ b/util/userutil.cpp @@ -0,0 +1,113 @@ +#include "userutil.h" + +#include +#include +#include + +#include "osutils.h" +#include "pathutils.h" + +// Win32 crap +#if WINDOWS + +#include +#include +#include +#include +#include +#include +#include + +bool called_coinit = false; + +HRESULT CreateLink(LPCSTR linkPath, LPCWSTR targetPath, LPCWSTR args) +{ + HRESULT hres; + + if (!called_coinit) + { + hres = CoInitialize(NULL); + called_coinit = true; + + if (!SUCCEEDED(hres)) + { + qWarning("Failed to initialize COM. Error 0x%08X", hres); + return hres; + } + } + + + IShellLink* link; + hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&link); + + if (SUCCEEDED(hres)) + { + IPersistFile* persistFile; + + link->SetPath(targetPath); + link->SetArguments(args); + + hres = link->QueryInterface(IID_IPersistFile, (LPVOID*)&persistFile); + if (SUCCEEDED(hres)) + { + WCHAR wstr[MAX_PATH]; + + MultiByteToWideChar(CP_ACP, 0, linkPath, -1, wstr, MAX_PATH); + + hres = persistFile->Save(wstr, TRUE); + persistFile->Release(); + } + link->Release(); + } + return hres; +} + +#endif + +QString Util::getDesktopDir() +{ + return QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); +} + +// Cross-platform Shortcut creation +bool Util::createShortCut(QString location, QString dest, QStringList args, QString name, QString icon) +{ +#if LINUX + location = PathCombine(location, name + ".desktop"); + qDebug("location: %s", qPrintable(location)); + + QFile f(location); + f.open(QIODevice::WriteOnly | QIODevice::Text); + QTextStream stream(&f); + + QString argstring; + if (!args.empty()) + argstring = " '" + args.join("' '") + "'"; + + stream << "[Desktop Entry]" << "\n"; + stream << "Type=Application" << "\n"; + stream << "TryExec=" << dest.toLocal8Bit() << "\n"; + stream << "Exec=" << dest.toLocal8Bit() << argstring.toLocal8Bit() << "\n"; + stream << "Name=" << name.toLocal8Bit() << "\n"; + stream << "Icon=" << icon.toLocal8Bit() << "\n"; + + stream.flush(); + f.close(); + + f.setPermissions(f.permissions() | QFileDevice::ExeOwner | QFileDevice::ExeGroup | QFileDevice::ExeOther); + + return true; +#elif WINDOWS + QFile file(path, name + ".lnk"); + WCHAR *file_w; + WCHAR *dest_w; + WCHAR *args_w; + file.fileName().toWCharArray(file_w); + dest.toWCharArray(dest_w); + args.toWCharArray(args_w); + return SUCCEEDED(CreateLink(file_w, dest_w, args_w)); +#else + qWarning("Desktop Shortcuts not supported on your platform!"); + return false; +#endif +} -- cgit v1.2.3