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
This commit is contained in:
@ -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',
|
||||
])
|
||||
|
||||
|
@ -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 */,
|
||||
|
37
base/foundation_utils_mac.h
Normal file
37
base/foundation_utils_mac.h
Normal file
@ -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_
|
@ -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_
|
||||
|
||||
|
@ -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
|
Reference in New Issue
Block a user