[test] Replace check_output with low level version
[bitcoinplatinum.git] / src / qt / macnotificationhandler.mm
blob4c96d08c8ab54e48d047d743fa76b123fef05d42
1 // Copyright (c) 2011-2013 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 #include "macnotificationhandler.h"
7 #undef slots
8 #import <objc/runtime.h>
9 #include <Cocoa/Cocoa.h>
11 // Add an obj-c category (extension) to return the expected bundle identifier
12 @implementation NSBundle(returnCorrectIdentifier)
13 - (NSString *)__bundleIdentifier
15     if (self == [NSBundle mainBundle]) {
16         return @"org.bitcoinfoundation.Bitcoin-Qt";
17     } else {
18         return [self __bundleIdentifier];
19     }
21 @end
23 void MacNotificationHandler::showNotification(const QString &title, const QString &text)
25     // check if users OS has support for NSUserNotification
26     if(this->hasUserNotificationCenterSupport()) {
27         // okay, seems like 10.8+
28         QByteArray utf8 = title.toUtf8();
29         char* cString = (char *)utf8.constData();
30         NSString *titleMac = [[NSString alloc] initWithUTF8String:cString];
32         utf8 = text.toUtf8();
33         cString = (char *)utf8.constData();
34         NSString *textMac = [[NSString alloc] initWithUTF8String:cString];
36         // do everything weak linked (because we will keep <10.8 compatibility)
37         id userNotification = [[NSClassFromString(@"NSUserNotification") alloc] init];
38         [userNotification performSelector:@selector(setTitle:) withObject:titleMac];
39         [userNotification performSelector:@selector(setInformativeText:) withObject:textMac];
41         id notificationCenterInstance = [NSClassFromString(@"NSUserNotificationCenter") performSelector:@selector(defaultUserNotificationCenter)];
42         [notificationCenterInstance performSelector:@selector(deliverNotification:) withObject:userNotification];
44         [titleMac release];
45         [textMac release];
46         [userNotification release];
47     }
50 // sendAppleScript just take a QString and executes it as apple script
51 void MacNotificationHandler::sendAppleScript(const QString &script)
53     QByteArray utf8 = script.toUtf8();
54     char* cString = (char *)utf8.constData();
55     NSString *scriptApple = [[NSString alloc] initWithUTF8String:cString];
57     NSAppleScript *as = [[NSAppleScript alloc] initWithSource:scriptApple];
58     NSDictionary *err = nil;
59     [as executeAndReturnError:&err];
60     [as release];
61     [scriptApple release];
64 bool MacNotificationHandler::hasUserNotificationCenterSupport(void)
66     Class possibleClass = NSClassFromString(@"NSUserNotificationCenter");
68     // check if users OS has support for NSUserNotification
69     if(possibleClass!=nil) {
70         return true;
71     }
72     return false;
76 MacNotificationHandler *MacNotificationHandler::instance()
78     static MacNotificationHandler *s_instance = nullptr;
79     if (!s_instance) {
80         s_instance = new MacNotificationHandler();
81         
82         Class aPossibleClass = objc_getClass("NSBundle");
83         if (aPossibleClass) {
84             // change NSBundle -bundleIdentifier method to return a correct bundle identifier
85             // a bundle identifier is required to use OSXs User Notification Center
86             method_exchangeImplementations(class_getInstanceMethod(aPossibleClass, @selector(bundleIdentifier)),
87                                            class_getInstanceMethod(aPossibleClass, @selector(__bundleIdentifier)));
88         }
89     }
90     return s_instance;