diff options
author | Tobias Markmann <tm@ayena.de> | 2016-03-09 14:38:57 (GMT) |
---|---|---|
committer | Tobias Markmann <tm@ayena.de> | 2016-03-15 15:53:03 (GMT) |
commit | f7de41c770be1bc6c45e825ff0fbdd6bfb799fae (patch) | |
tree | 60f7802290dd1d06399f7a7c59fa621046321e18 /SwifTools | |
parent | 8cdebcff1d1e8321b070c7e675f9a9709a2b0b81 (diff) | |
download | swift-f7de41c770be1bc6c45e825ff0fbdd6bfb799fae.zip swift-f7de41c770be1bc6c45e825ff0fbdd6bfb799fae.tar.bz2 |
Explicitly convert between nullable and non-nullable on OS X
Clang was complaining about implicit conversions between
nullable and non-nullable NSString pointers. Adjusted our
std::string -> NSString* conversion utilities to check for
nil and return an empty std::string in that case.
Replaced uses of [NSString stringWithUTF8String] with our
STD2NSSTRING macro.
Turned std::string <-> NSString* conversion macros into
functions.
Test-Information:
Builds without the warning on OS X 10.11.3 and Swift runs
without issues.
Change-Id: I949f2f3332018391aead58ef362764f4b7955b01
Diffstat (limited to 'SwifTools')
-rw-r--r-- | SwifTools/Cocoa/CocoaUtil.h | 30 | ||||
-rw-r--r-- | SwifTools/Notifier/GrowlNotifier.mm | 14 | ||||
-rw-r--r-- | SwifTools/Notifier/NotificationCenterNotifier.mm | 10 | ||||
-rw-r--r-- | SwifTools/Notifier/NotificationCenterNotifierDelegate.mm | 4 |
4 files changed, 39 insertions, 19 deletions
diff --git a/SwifTools/Cocoa/CocoaUtil.h b/SwifTools/Cocoa/CocoaUtil.h index 49ed682..83d95b6 100644 --- a/SwifTools/Cocoa/CocoaUtil.h +++ b/SwifTools/Cocoa/CocoaUtil.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Isode Limited. + * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,16 +7,36 @@ #pragma once // Conversion utilities -#define NS2STDSTRING(a) (a == nil ? std::string() : std::string([a cStringUsingEncoding:NSUTF8StringEncoding])) -#define STD2NSSTRING(a) [NSString stringWithCString:a.c_str() encoding:NSUTF8StringEncoding] +namespace { + +inline std::string ns2StdString(NSString* _Nullable nsString); +inline std::string ns2StdString(NSString* _Nullable nsString) { + std::string stdString; + if (nsString != nil) { + stdString = std::string([nsString cStringUsingEncoding:NSUTF8StringEncoding]); + } + return stdString; +} + +inline NSString* _Nonnull std2NSString(const std::string& stdString); +inline NSString* _Nonnull std2NSString(const std::string& stdString) { + NSString* _Nullable nsString = [NSString stringWithUTF8String:stdString.c_str()]; + if (nsString == nil) { + nsString = @""; + } + // At this point nsString is guaranteed to be not null/nil. + return static_cast<NSString* _Nonnull>(nsString); +} + +} // Intrusive pointer for NSObjects namespace boost { - inline void intrusive_ptr_add_ref(NSObject* object) { + inline void intrusive_ptr_add_ref(NSObject* _Nonnull object) { [object retain]; } - inline void intrusive_ptr_release(NSObject* object) { + inline void intrusive_ptr_release(NSObject* _Nonnull object) { [object release]; } } diff --git a/SwifTools/Notifier/GrowlNotifier.mm b/SwifTools/Notifier/GrowlNotifier.mm index acaf45c..d5bdf6f 100644 --- a/SwifTools/Notifier/GrowlNotifier.mm +++ b/SwifTools/Notifier/GrowlNotifier.mm @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2011 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -36,16 +36,16 @@ GrowlNotifier::GrowlNotifier(const std::string& name) { p = boost::make_shared<Private>(); p->delegate = boost::intrusive_ptr<GrowlNotifierDelegate>([[GrowlNotifierDelegate alloc] init], false); p->delegate.get().notifier = this; - p->delegate.get().name = STD2NSSTRING(name); + p->delegate.get().name = std2NSString(name); NSMutableArray* allNotifications = [[NSMutableArray alloc] init]; foreach(Type type, getAllTypes()) { - [allNotifications addObject: STD2NSSTRING(typeToString(type))]; + [allNotifications addObject: std2NSString(typeToString(type))]; } NSMutableArray* defaultNotifications = [[NSMutableArray alloc] init]; foreach(Type type, getDefaultTypes()) { - [defaultNotifications addObject: STD2NSSTRING(typeToString(type))]; + [defaultNotifications addObject: std2NSString(typeToString(type))]; } p->delegate.get().registrationDictionary = [[[NSDictionary alloc] @@ -73,9 +73,9 @@ void GrowlNotifier::showMessage(Type type, const std::string& subject, const std p->pendingNotifications.insert(context); [GrowlApplicationBridge - notifyWithTitle: STD2NSSTRING(subject) - description: STD2NSSTRING(description) - notificationName: STD2NSSTRING(typeToString(type)) + notifyWithTitle: std2NSString(subject) + description: std2NSString(description) + notificationName: std2NSString(typeToString(type)) iconData: [NSData dataWithBytes: vecptr(picture) length: picture.size()] priority: 0 isSticky: NO diff --git a/SwifTools/Notifier/NotificationCenterNotifier.mm b/SwifTools/Notifier/NotificationCenterNotifier.mm index 10319c8..01e6368 100644 --- a/SwifTools/Notifier/NotificationCenterNotifier.mm +++ b/SwifTools/Notifier/NotificationCenterNotifier.mm @@ -57,11 +57,11 @@ void NotificationCenterNotifier::showMessage(Type type, const std::string& subje if (std::find(defaultTypes.begin(), defaultTypes.end(), type) == defaultTypes.end()) { return; } - NSImage* image = [[NSImage alloc] initWithContentsOfFile: STD2NSSTRING(picture.string())]; + NSImage* image = [[NSImage alloc] initWithContentsOfFile: std2NSString(picture.string())]; NSUserNotification* notification = [[NSUserNotification alloc] init]; - [notification setTitle:STD2NSSTRING(typeToString(type))]; - [notification setSubtitle:STD2NSSTRING(subject)]; - [notification setInformativeText:STD2NSSTRING(description)]; + [notification setTitle:std2NSString(typeToString(type))]; + [notification setSubtitle:std2NSString(subject)]; + [notification setInformativeText:std2NSString(description)]; [notification setContentImage: image]; [image release]; @@ -73,7 +73,7 @@ void NotificationCenterNotifier::showMessage(Type type, const std::string& subje /// \todo Currently the elements are only removed on application exit. Ideally the notifications not required anymore /// are removed from the map; e.g. when visiting a chat view, all notifications from that view can be removed from /// the map and the NSUserNotificationCenter. - p->callbacksForNotifications[NS2STDSTRING(notification.identifier)] = boost::make_shared<Context>(callback); + p->callbacksForNotifications[ns2StdString(notification.identifier)] = boost::make_shared<Context>(callback); [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; [notification release]; } diff --git a/SwifTools/Notifier/NotificationCenterNotifierDelegate.mm b/SwifTools/Notifier/NotificationCenterNotifierDelegate.mm index 617619c..2b1c2a4 100644 --- a/SwifTools/Notifier/NotificationCenterNotifierDelegate.mm +++ b/SwifTools/Notifier/NotificationCenterNotifierDelegate.mm @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Isode Limited. + * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -19,7 +19,7 @@ using namespace Swift; - (void)userNotificationCenter:(NSUserNotificationCenter *) center didActivateNotification:(NSUserNotification *)notification { (void)center; - std::string identifier = NS2STDSTRING(notification.identifier); + std::string identifier = ns2StdString(notification.identifier); notifier->handleUserNotificationActivated(identifier); } |