summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-08 21:02:56 +0000
committermark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-08 21:02:56 +0000
commit03d95ac0d42dd9eaa7333b068361e4205c28ca7d (patch)
tree8d433e8c73cf002cc1bea78d40f00dec51d6848c
parent89916bd485d5c6156030f9f4b62db0cadac87c85 (diff)
downloadchromium_src-03d95ac0d42dd9eaa7333b068361e4205c28ca7d.zip
chromium_src-03d95ac0d42dd9eaa7333b068361e4205c28ca7d.tar.gz
chromium_src-03d95ac0d42dd9eaa7333b068361e4205c28ca7d.tar.bz2
Provide converters to and from NSString* in sys_string_conversions
Review URL: http://codereview.chromium.org/6355 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@3050 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--base/SConscript2
-rw-r--r--base/base.xcodeproj/project.pbxproj10
-rw-r--r--base/foundation_utils_mac.h37
-rw-r--r--base/sys_string_conversions.h16
-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