diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index fc4de6ef8..5bfa8b7fa 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -51,6 +51,10 @@ #include #endif +#ifdef Q_OS_MAC +#include +#endif + #include #include "base/utils/fs.h" #include "base/utils/misc.h" @@ -1879,6 +1883,62 @@ void Preferences::setMagnetLinkAssoc(bool set) } #endif +#ifdef Q_OS_MAC +namespace +{ + CFStringRef torrentExtension = CFSTR("torrent"); + CFStringRef magnetUrlScheme = CFSTR("magnet"); +} + +bool Preferences::isTorrentFileAssocSet() +{ + bool isSet = false; + CFStringRef torrentId = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, torrentExtension, NULL); + if (torrentId != NULL) { + CFStringRef defaultHandlerId = LSCopyDefaultRoleHandlerForContentType(torrentId, kLSRolesViewer); + if (defaultHandlerId != NULL) { + CFStringRef myBundleId = CFBundleGetIdentifier(CFBundleGetMainBundle()); + isSet = CFStringCompare(myBundleId, defaultHandlerId, 0) == kCFCompareEqualTo; + CFRelease(defaultHandlerId); + } + CFRelease(torrentId); + } + return isSet; +} + +bool Preferences::isMagnetLinkAssocSet() +{ + bool isSet = false; + CFStringRef defaultHandlerId = LSCopyDefaultHandlerForURLScheme(magnetUrlScheme); + if (defaultHandlerId != NULL) { + CFStringRef myBundleId = CFBundleGetIdentifier(CFBundleGetMainBundle()); + isSet = CFStringCompare(myBundleId, defaultHandlerId, 0) == kCFCompareEqualTo; + CFRelease(defaultHandlerId); + } + return isSet; +} + +void Preferences::setTorrentFileAssoc() +{ + if (isTorrentFileAssocSet()) + return; + CFStringRef torrentId = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, torrentExtension, NULL); + if (torrentId != NULL) { + CFStringRef myBundleId = CFBundleGetIdentifier(CFBundleGetMainBundle()); + LSSetDefaultRoleHandlerForContentType(torrentId, kLSRolesViewer, myBundleId); + CFRelease(torrentId); + } +} + +void Preferences::setMagnetLinkAssoc() +{ + if (isMagnetLinkAssocSet()) + return; + CFStringRef myBundleId = CFBundleGetIdentifier(CFBundleGetMainBundle()); + LSSetDefaultHandlerForURLScheme(magnetUrlScheme, myBundleId); +} +#endif + bool Preferences::isTrackerEnabled() const { return value("Preferences/Advanced/trackerEnabled", false).toBool(); diff --git a/src/base/preferences.h b/src/base/preferences.h index cab8e559d..84d1d67ef 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -417,6 +417,12 @@ public: static bool isMagnetLinkAssocSet(); static void setTorrentFileAssoc(bool set); static void setMagnetLinkAssoc(bool set); +#endif +#ifdef Q_OS_MAC + static bool isTorrentFileAssocSet(); + static bool isMagnetLinkAssocSet(); + static void setTorrentFileAssoc(); + static void setMagnetLinkAssoc(); #endif bool isTrackerEnabled() const; void setTrackerEnabled(bool enabled); diff --git a/src/gui/options_imp.cpp b/src/gui/options_imp.cpp index f1426fcab..a2c7d2f2e 100644 --- a/src/gui/options_imp.cpp +++ b/src/gui/options_imp.cpp @@ -126,6 +126,9 @@ options_imp::options_imp(QWidget *parent) #ifndef Q_OS_WIN checkStartup->setVisible(false); +#endif + +#if !(defined(Q_OS_WIN) || defined(Q_OS_MAC)) groupFileAssociation->setVisible(false); #endif @@ -152,7 +155,7 @@ options_imp::options_imp(QWidget *parent) #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && !defined(QT_DBUS_LIB) checkPreventFromSuspend->setDisabled(true); #endif -#ifdef Q_OS_WIN +#if defined(Q_OS_WIN) || defined(Q_OS_MAC) connect(checkAssociateTorrents, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(checkAssociateMagnetLinks, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); #endif @@ -406,6 +409,18 @@ void options_imp::saveOptions() // Windows: file association settings Preferences::setTorrentFileAssoc(checkAssociateTorrents->isChecked()); Preferences::setMagnetLinkAssoc(checkAssociateMagnetLinks->isChecked()); +#endif +#ifdef Q_OS_MAC + if (checkAssociateTorrents->isChecked()) { + Preferences::setTorrentFileAssoc(); + checkAssociateTorrents->setChecked(Preferences::isTorrentFileAssocSet()); + checkAssociateTorrents->setEnabled(!checkAssociateTorrents->isChecked()); + } + if (checkAssociateMagnetLinks->isChecked()) { + Preferences::setMagnetLinkAssoc(); + checkAssociateMagnetLinks->setChecked(Preferences::isMagnetLinkAssocSet()); + checkAssociateMagnetLinks->setEnabled(!checkAssociateMagnetLinks->isChecked()); + } #endif // End General preferences @@ -580,6 +595,12 @@ void options_imp::loadOptions() checkStartup->setChecked(pref->WinStartup()); checkAssociateTorrents->setChecked(Preferences::isTorrentFileAssocSet()); checkAssociateMagnetLinks->setChecked(Preferences::isMagnetLinkAssocSet()); +#endif +#ifdef Q_OS_MAC + checkAssociateTorrents->setChecked(Preferences::isTorrentFileAssocSet()); + checkAssociateTorrents->setEnabled(!checkAssociateTorrents->isChecked()); + checkAssociateMagnetLinks->setChecked(Preferences::isMagnetLinkAssocSet()); + checkAssociateMagnetLinks->setEnabled(!checkAssociateMagnetLinks->isChecked()); #endif // End General preferences