Index: base/mac/mac_util.mm |
diff --git a/base/mac/mac_util.mm b/base/mac/mac_util.mm |
index 7f3be186daa8c0da82e4b5d58f21b1d70f27d756..2eddeae0c2e71f41e8e2936b65d5324e199b8d02 100644 |
--- a/base/mac/mac_util.mm |
+++ b/base/mac/mac_util.mm |
@@ -480,5 +480,77 @@ bool WasLaunchedAsHiddenLoginItem() { |
return IsHiddenLoginItem(item); |
} |
+// Definitions for the corresponding CF_TO_NS_CAST_DECL macros in mac_util.h. |
+#define CF_TO_NS_CAST_DEFN(TypeCF, TypeNS) \ |
+\ |
+TypeNS* CFToNSCast(TypeCF##Ref cf_val) { \ |
+ DCHECK(!cf_val || TypeCF##GetTypeID() == CFGetTypeID(cf_val)); \ |
+ TypeNS* ns_val = \ |
+ const_cast<TypeNS*>(reinterpret_cast<const TypeNS*>(cf_val)); \ |
+ return ns_val; \ |
+} \ |
+\ |
+TypeCF##Ref NSToCFCast(TypeNS* ns_val) { \ |
+ TypeCF##Ref cf_val = reinterpret_cast<TypeCF##Ref>(ns_val); \ |
+ DCHECK(!cf_val || TypeCF##GetTypeID() == CFGetTypeID(cf_val)); \ |
+ return cf_val; \ |
+} \ |
+ |
+#define CF_TO_NS_MUTABLE_CAST_DEFN(name) \ |
+CF_TO_NS_CAST_DEFN(CF##name, NS##name) \ |
+\ |
+NSMutable##name* CFToNSCast(CFMutable##name##Ref cf_val) { \ |
+ DCHECK(!cf_val || CF##name##GetTypeID() == CFGetTypeID(cf_val)); \ |
+ NSMutable##name* ns_val = reinterpret_cast<NSMutable##name*>(cf_val); \ |
+ return ns_val; \ |
+} \ |
+\ |
+CFMutable##name##Ref NSToCFCast(NSMutable##name* ns_val) { \ |
+ CFMutable##name##Ref cf_val = \ |
+ reinterpret_cast<CFMutable##name##Ref>(ns_val); \ |
+ DCHECK(!cf_val || CF##name##GetTypeID() == CFGetTypeID(cf_val)); \ |
+ return cf_val; \ |
+} \ |
+ |
+CF_TO_NS_MUTABLE_CAST_DEFN(Array); |
+CF_TO_NS_MUTABLE_CAST_DEFN(AttributedString); |
+CF_TO_NS_CAST_DEFN(CFCalendar, NSCalendar); |
+CF_TO_NS_MUTABLE_CAST_DEFN(CharacterSet); |
+CF_TO_NS_MUTABLE_CAST_DEFN(Data); |
+CF_TO_NS_CAST_DEFN(CFDate, NSDate); |
+CF_TO_NS_MUTABLE_CAST_DEFN(Dictionary); |
+CF_TO_NS_CAST_DEFN(CFError, NSError); |
+CF_TO_NS_CAST_DEFN(CFLocale, NSLocale); |
+CF_TO_NS_CAST_DEFN(CFNumber, NSNumber); |
+CF_TO_NS_CAST_DEFN(CFRunLoopTimer, NSTimer); |
+CF_TO_NS_CAST_DEFN(CFTimeZone, NSTimeZone); |
+CF_TO_NS_MUTABLE_CAST_DEFN(Set); |
+CF_TO_NS_CAST_DEFN(CFReadStream, NSInputStream); |
+CF_TO_NS_CAST_DEFN(CFWriteStream, NSOutputStream); |
+CF_TO_NS_MUTABLE_CAST_DEFN(String); |
+CF_TO_NS_CAST_DEFN(CFURL, NSURL); |
+ |
} // namespace mac |
} // namespace base |
+ |
+std::ostream& operator<<(std::ostream& o, const CFStringRef string) { |
+ return o << base::SysCFStringRefToUTF8(string); |
+} |
+ |
+std::ostream& operator<<(std::ostream& o, const CFErrorRef err) { |
+ base::mac::ScopedCFTypeRef<CFStringRef> desc(CFErrorCopyDescription(err)); |
+ base::mac::ScopedCFTypeRef<CFDictionaryRef> user_info( |
+ CFErrorCopyUserInfo(err)); |
+ CFStringRef errorDesc = NULL; |
+ if (user_info.get()) { |
+ errorDesc = reinterpret_cast<CFStringRef>( |
+ CFDictionaryGetValue(user_info.get(), kCFErrorDescriptionKey)); |
+ } |
+ o << "Code: " << CFErrorGetCode(err) |
+ << " Domain: " << CFErrorGetDomain(err) |
+ << " Desc: " << desc.get(); |
+ if(errorDesc) { |
+ o << "(" << errorDesc << ")"; |
+ } |
+ return o; |
+} |