Fix Windows file associations creation.

Now qBittorrent create global ProgId during installation (using HKLM hive)
and allow to associate .torrent files with it (using HKCU).

Conflicts:
	src/preferences/preferences.h
	src/windows/installer.nsi
	src/windows/uninstaller.nsi
This commit is contained in:
Vladimir Golovnev (Glassez) 2014-02-23 14:31:02 +04:00 committed by sledgehammer999
commit c78ad12144

View file

@ -45,6 +45,10 @@
#include <QCoreApplication> #include <QCoreApplication>
#endif #endif
#ifdef Q_OS_WIN
#include <ShlObj.h>
#endif
#include "misc.h" #include "misc.h"
#include "fs_utils.h" #include "fs_utils.h"
#include "qinisettings.h" #include "qinisettings.h"
@ -1254,91 +1258,66 @@ public:
} }
static bool isTorrentFileAssocSet() { static bool isTorrentFileAssocSet() {
QSettings settings("HKEY_CLASSES_ROOT", QIniSettings::NativeFormat); QSettings settings("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat);
if (settings.value(".torrent/Default").toString() != "qBittorrent") { if (settings.value(".torrent/Default").toString() != "qBittorrent") {
qDebug(".torrent != qBittorrent"); qDebug(".torrent != qBittorrent");
return false; return false;
}
return true;
} }
qDebug("Checking shell command");
QString shell_command = settings.value("qBittorrent/shell/open/command/Default", "").toString();
qDebug("Shell command is: %s", qPrintable(shell_command));
QRegExp exe_reg("\"([^\"]+)\".*");
if (exe_reg.indexIn(shell_command) < 0)
return false;
QString assoc_exe = exe_reg.cap(1);
qDebug("exe: %s", qPrintable(assoc_exe));
if (assoc_exe.compare(qApp->applicationFilePath().replace("/", "\\"), Qt::CaseInsensitive) != 0)
return false;
// Icon
const QString icon_str = "\""+qApp->applicationFilePath().replace("/", "\\")+"\",1";
if (settings.value("qBittorrent/DefaultIcon/Default", icon_str).toString().compare(icon_str, Qt::CaseInsensitive) != 0)
return false;
return true; static bool isMagnetLinkAssocSet() {
} QSettings settings("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat);
static bool isMagnetLinkAssocSet() { // Check magnet link assoc
QSettings settings("HKEY_CLASSES_ROOT", QIniSettings::NativeFormat); QRegExp exe_reg("\"([^\"]+)\".*");
QString shell_command = settings.value("magnet/shell/open/command/Default", "").toString();
// Check magnet link assoc if (exe_reg.indexIn(shell_command) < 0)
QRegExp exe_reg("\"([^\"]+)\".*"); return false;
QString shell_command = settings.value("Magnet/shell/open/command/Default", "").toString(); QString assoc_exe = exe_reg.cap(1);
if (exe_reg.indexIn(shell_command) < 0) qDebug("exe: %s", qPrintable(assoc_exe));
return false; if (assoc_exe.compare(qApp->applicationFilePath(), Qt::CaseInsensitive) != 0)
QString assoc_exe = exe_reg.cap(1); return false;
qDebug("exe: %s", qPrintable(assoc_exe)); return true;
if (assoc_exe.compare(qApp->applicationFilePath().replace("/", "\\"), Qt::CaseInsensitive) != 0)
return false;
return true;
}
static void setTorrentFileAssoc(bool set) {
QSettings settings("HKEY_CLASSES_ROOT", QSettings::NativeFormat);
// .Torrent association
if (set) {
const QString command_str = "\""+qApp->applicationFilePath().replace("/", "\\")+"\" \"%1\"";
const QString icon_str = "\""+qApp->applicationFilePath().replace("/", "\\")+"\",1";
settings.setValue(".torrent/Default", "qBittorrent");
settings.setValue(".torrent/Content Type", "application/x-bittorrent");
settings.setValue("qBittorrent/shell/Default", "open");
settings.setValue("qBittorrent/shell/open/command/Default", command_str);
settings.setValue("qBittorrent/Content Type/Default", "application/x-bittorrent");
settings.setValue("qBittorrent/DefaultIcon/Default", icon_str);
} else if (isTorrentFileAssocSet()) {
settings.remove(".torrent/Default");
settings.remove(".torrent/Content Type");
settings.remove("qBittorrent/shell/Default");
settings.remove("qBittorrent/shell/open/command/Default");
settings.remove("qBittorrent/Content Type/Default");
settings.remove("qBittorrent/DefaultIcon/Default");
} }
}
static void setMagnetLinkAssoc(bool set) { static void setTorrentFileAssoc(bool set) {
QSettings settings("HKEY_CLASSES_ROOT", QSettings::NativeFormat); QSettings settings("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat);
// Magnet association // .Torrent association
if (set) { if (set) {
const QString command_str = "\""+qApp->applicationFilePath().replace("/", "\\")+"\" \"%1\""; QString old_progid = settings.value(".torrent/Default").toString();
const QString icon_str = "\""+qApp->applicationFilePath().replace("/", "\\")+"\",1"; if (!old_progid.isEmpty() && (old_progid != "qBittorrent"))
settings.setValue(".torrent/OpenWithProgids/" + old_progid, "");
settings.setValue(".torrent/Default", "qBittorrent");
} else if (isTorrentFileAssocSet()) {
settings.setValue(".torrent/Default", "");
}
settings.setValue("Magnet/Default", "Magnet URI"); SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
settings.setValue("Magnet/Content Type", "application/x-magnet"); }
settings.setValue("Magnet/URL Protocol", "");
settings.setValue("Magnet/DefaultIcon/Default", icon_str); static void setMagnetLinkAssoc(bool set) {
settings.setValue("Magnet/shell/Default", "open"); QSettings settings("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat);
settings.setValue("Magnet/shell/open/command/Default", command_str);
} else if (isMagnetLinkAssocSet()) { // Magnet association
settings.remove("Magnet/Default"); if (set) {
settings.remove("Magnet/Content Type"); const QString command_str = "\""+qApp->applicationFilePath()+"\" \"%1\"";
settings.remove("Magnet/URL Protocol"); const QString icon_str = "\""+qApp->applicationFilePath()+"\",1";
settings.remove("Magnet/DefaultIcon/Default");
settings.remove("Magnet/shell/Default"); settings.setValue("magnet/Default", "URL:Magnet link");
settings.remove("Magnet/shell/open/command/Default"); settings.setValue("magnet/Content Type", "application/x-magnet");
settings.setValue("magnet/URL Protocol", "");
settings.setValue("magnet/DefaultIcon/Default", icon_str);
settings.setValue("magnet/shell/Default", "open");
settings.setValue("magnet/shell/open/command/Default", command_str);
} else if (isMagnetLinkAssocSet()) {
settings.remove("magnet");
}
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
} }
}
#endif #endif
bool isTrackerEnabled() const { bool isTrackerEnabled() const {