diff options
-rw-r--r-- | base/SConscript | 2 | ||||
-rw-r--r-- | base/base.xcodeproj/project.pbxproj | 10 | ||||
-rw-r--r-- | base/foundation_utils_mac.h | 37 | ||||
-rw-r--r-- | base/sys_string_conversions.h | 16 | ||||
-rw-r--r-- | base/sys_string_conversions_mac.mm (renamed from base/sys_string_conversions_mac.cc) | 20 |
5 files changed, 77 insertions, 8 deletions
diff --git a/base/SConscript b/base/SConscript index 79e11b7..3b5c8f9 100644 --- a/base/SConscript +++ b/base/SConscript @@ -159,7 +159,7 @@ if env['PLATFORM'] == 'darwin': 'message_pump_mac.mm', 'platform_thread_mac.mm', 'scoped_nsautorelease_pool.mm', - 'sys_string_conversions_mac.cc', + 'sys_string_conversions_mac.mm', 'worker_pool_mac.mm', ]) diff --git a/base/base.xcodeproj/project.pbxproj b/base/base.xcodeproj/project.pbxproj index 3d8832f..b00cd28 100644 --- a/base/base.xcodeproj/project.pbxproj +++ b/base/base.xcodeproj/project.pbxproj @@ -42,7 +42,7 @@ 4D11B89F0E929F0700EF7617 /* file_path_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D11B89D0E929EFF00EF7617 /* file_path_unittest.cc */; }; 7B26302F0E82F218001CE27F /* message_pump_libevent.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7B26302D0E82F218001CE27F /* message_pump_libevent.cc */; }; 7B2630330E82F258001CE27F /* libevent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B2630240E82F1E6001CE27F /* libevent.a */; }; - 7B4C5F4A0E4B6BF900679E8F /* sys_string_conversions_mac.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C5F480E4B6BF900679E8F /* sys_string_conversions_mac.cc */; }; + 7B4C5F4A0E4B6BF900679E8F /* sys_string_conversions_mac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C5F480E4B6BF900679E8F /* sys_string_conversions_mac.mm */; }; 7B4DF5350E5B6A66004D7619 /* libskia.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B4DF5320E5B6A4B004D7619 /* libskia.a */; }; 7B6AF6340E80211C00F9F9CF /* sys_info_posix.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7B6AF6320E80211700F9F9CF /* sys_info_posix.cc */; }; 7B6AF6350E80211E00F9F9CF /* sys_info_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7B6AF6330E80211700F9F9CF /* sys_info_unittest.cc */; }; @@ -373,6 +373,7 @@ 4D11B89B0E929EFF00EF7617 /* file_path.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_path.cc; sourceTree = "<group>"; }; 4D11B89C0E929EFF00EF7617 /* file_path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_path.h; sourceTree = "<group>"; }; 4D11B89D0E929EFF00EF7617 /* file_path_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_path_unittest.cc; sourceTree = "<group>"; }; + 4D7BF2B20E9D3CDC009A6919 /* foundation_utils_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = foundation_utils_mac.h; sourceTree = "<group>"; }; 7B1435DE0E78416400901940 /* skia_utils_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = skia_utils_mac.h; sourceTree = "<group>"; }; 7B1435DF0E78419700901940 /* native_widget_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = native_widget_types.h; sourceTree = "<group>"; }; 7B26301F0E82F1E6001CE27F /* libevent.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = libevent.xcodeproj; path = third_party/libevent/libevent.xcodeproj; sourceTree = "<group>"; }; @@ -380,7 +381,7 @@ 7B26302E0E82F218001CE27F /* message_pump_libevent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = message_pump_libevent.h; sourceTree = "<group>"; }; 7B4C5D880E4915D800679E8F /* float_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = float_util.h; sourceTree = "<group>"; }; 7B4C5F470E4B6BF900679E8F /* sys_string_conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sys_string_conversions.h; sourceTree = "<group>"; }; - 7B4C5F480E4B6BF900679E8F /* sys_string_conversions_mac.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sys_string_conversions_mac.cc; sourceTree = "<group>"; }; + 7B4C5F480E4B6BF900679E8F /* sys_string_conversions_mac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = sys_string_conversions_mac.mm; sourceTree = "<group>"; }; 7B5AD60D0D9DD8050012BCF1 /* scoped_cftyperef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scoped_cftyperef.h; sourceTree = "<group>"; }; 7B6AF6310E80211700F9F9CF /* sys_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sys_info.h; sourceTree = "<group>"; }; 7B6AF6320E80211700F9F9CF /* sys_info_posix.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sys_info_posix.cc; sourceTree = "<group>"; }; @@ -857,6 +858,7 @@ 7BAF50750E50B8F100CA8A07 /* file_version_info_unittest.cc */, 8254030B0D92D1D10006B936 /* fix_wp64.h */, 7B4C5D880E4915D800679E8F /* float_util.h */, + 4D7BF2B20E9D3CDC009A6919 /* foundation_utils_mac.h */, 824652C00DC12044007C2BAA /* hash_tables.h */, 93611B160E5A875D00F9405D /* histogram.cc */, 93611B170E5A875D00F9405D /* histogram.h */, @@ -993,7 +995,7 @@ 7B6AF6320E80211700F9F9CF /* sys_info_posix.cc */, 7B6AF6330E80211700F9F9CF /* sys_info_unittest.cc */, 7B4C5F470E4B6BF900679E8F /* sys_string_conversions.h */, - 7B4C5F480E4B6BF900679E8F /* sys_string_conversions_mac.cc */, + 7B4C5F480E4B6BF900679E8F /* sys_string_conversions_mac.mm */, E4CE9D780E8C1FCA00D5378C /* system_monitor.cc */, E4CE9D770E8C1FCA00D5378C /* system_monitor.h */, E4CE9D760E8C1FCA00D5378C /* system_monitor_unittest.cc */, @@ -1386,7 +1388,7 @@ 829E36460DC0F6AC00819EBF /* string_util.cc in Sources */, 820EB4FA0E3A6178009668FC /* string_util_icu.cc in Sources */, 7B6AF6340E80211C00F9F9CF /* sys_info_posix.cc in Sources */, - 7B4C5F4A0E4B6BF900679E8F /* sys_string_conversions_mac.cc in Sources */, + 7B4C5F4A0E4B6BF900679E8F /* sys_string_conversions_mac.mm in Sources */, E4CE9D7A0E8C1FD400D5378C /* system_monitor.cc in Sources */, 93E703240E5D64F00046259B /* thread.cc in Sources */, 7BAE38AC0E6EFDBA00C3F750 /* thread_local_posix.cc in Sources */, diff --git a/base/foundation_utils_mac.h b/base/foundation_utils_mac.h new file mode 100644 index 0000000..64ebeda --- /dev/null +++ b/base/foundation_utils_mac.h @@ -0,0 +1,37 @@ +// Copyright (c) 2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FOUNDATION_UTILS_MAC_H_ +#define BASE_FOUNDATION_UTILS_MAC_H_ + +#include <CoreFoundation/CoreFoundation.h> +#import <Foundation/Foundation.h> + +// CFTypeRefToNSObjectAutorelease transfers ownership of a Core Foundation +// object (one derived from CFTypeRef) to the Foundation memory management +// system. In a traditional managed-memory environment, cf_object is +// autoreleased and returned as an NSObject. In a garbage-collected +// environment, cf_object is marked as eligible for garbage collection. +// +// This function should only be used to convert a concrete CFTypeRef type to +// its equivalent "toll-free bridged" NSObject subclass, for example, +// converting a CFStringRef to NSString. +// +// By calling this function, callers relinquish any ownership claim to +// cf_object. In a managed-memory environment, the object's ownership will be +// managed by the innermost NSAutoreleasePool, so after this function returns, +// callers should not assume that cf_object is valid any longer than the +// returned NSObject. +static inline id CFTypeRefToNSObjectAutorelease(CFTypeRef cf_object) { + // When GC is on, NSMakeCollectable marks cf_object for GC and autorelease + // is a no-op. + // + // In the traditional GC-less environment, NSMakeCollectable is a no-op, + // and cf_object is autoreleased, balancing out the caller's ownership claim. + // + // NSMakeCollectable returns nil when used on a NULL object. + return [NSMakeCollectable(cf_object) autorelease]; +} + +#endif // BASE_FOUNDATION_UTILS_MAC_H_ diff --git a/base/sys_string_conversions.h b/base/sys_string_conversions.h index 960f9050..7b56a21 100644 --- a/base/sys_string_conversions.h +++ b/base/sys_string_conversions.h @@ -14,7 +14,12 @@ #if defined(OS_MACOSX) #include <CoreFoundation/CoreFoundation.h> +#ifdef __OBJC__ +@class NSString; +#else +class NSString; #endif +#endif // OS_MACOSX class StringPiece; @@ -47,20 +52,27 @@ std::string SysWideToMultiByte(const std::wstring& wide, uint32 code_page); #if defined(OS_MACOSX) -// Converts between STL strings and CFStringRefs. +// Converts between STL strings and CFStringRefs/NSStrings. // Creates a string, and returns it with a refcount of 1. You are responsible // for releasing it. Returns NULL on failure. CFStringRef SysUTF8ToCFStringRef(const std::string& utf8); CFStringRef SysWideToCFStringRef(const std::wstring& wide); +// Same, but returns an autoreleased NSString. +NSString* SysUTF8ToNSString(const std::string& utf8); +NSString* SysWideToNSString(const std::wstring& wide); + // Converts a CFStringRef to an STL string. Returns an empty string on failure. std::string SysCFStringRefToUTF8(CFStringRef ref); std::wstring SysCFStringRefToWide(CFStringRef ref); +// Same, but accepts NSString input. +std::string SysNSStringToUTF8(NSString* ref); +std::wstring SysNSStringToWide(NSString* ref); + #endif // defined(OS_MACOSX) } // namespace base #endif // BASE_SYS_STRING_CONVERSIONS_H_ - diff --git a/base/sys_string_conversions_mac.cc b/base/sys_string_conversions_mac.mm index e93b617..02a4244 100644 --- a/base/sys_string_conversions_mac.cc +++ b/base/sys_string_conversions_mac.mm @@ -4,8 +4,11 @@ #include "base/sys_string_conversions.h" +#import <Foundation/Foundation.h> + #include <vector> +#include "base/foundation_utils_mac.h" #include "base/scoped_cftyperef.h" #include "base/string_piece.h" @@ -155,6 +158,14 @@ CFStringRef SysWideToCFStringRef(const std::wstring& wide) { return STLStringToCFStringWithEncodingsT(wide, kWideStringEncoding); } +NSString* SysUTF8ToNSString(const std::string& utf8) { + return CFTypeRefToNSObjectAutorelease(SysUTF8ToCFStringRef(utf8)); +} + +NSString* SysWideToNSString(const std::wstring& wide) { + return CFTypeRefToNSObjectAutorelease(SysWideToCFStringRef(wide)); +} + std::string SysCFStringRefToUTF8(CFStringRef ref) { return CFStringToSTLStringWithEncodingT<std::string>(ref, kNarrowStringEncoding); @@ -165,5 +176,12 @@ std::wstring SysCFStringRefToWide(CFStringRef ref) { kWideStringEncoding); } -} // namespace base +std::string SysNSStringToUTF8(NSString* nsstring) { + return SysCFStringRefToUTF8(reinterpret_cast<CFStringRef>(nsstring)); +} +std::wstring SysNSStringToWide(NSString* nsstring) { + return SysCFStringRefToWide(reinterpret_cast<CFStringRef>(nsstring)); +} + +} // namespace base |