From 17c8189dcfa8dc2d3fd8f79a9348dffb494cfcd9 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Fri, 20 Jan 2012 15:46:33 -0800 Subject: [PATCH] Add and use scoped_cftyperef from Chromium. --- debian/copyright | 1 + src/core/mac_startup.mm | 9 ++--- src/core/scoped_cftyperef.h | 77 +++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 src/core/scoped_cftyperef.h diff --git a/debian/copyright b/debian/copyright index eb93792c7..560c27a86 100644 --- a/debian/copyright +++ b/debian/copyright @@ -46,6 +46,7 @@ Copyright: 2004, Melchior FRANZ License: GPL-2+ Files: src/core/scoped_nsobject.h + src/core/scoped_cftyperef.h Copyright: 2011, The Chromium Authors License: BSD-Google diff --git a/src/core/mac_startup.mm b/src/core/mac_startup.mm index 19a85a86c..25ca89ae7 100644 --- a/src/core/mac_startup.mm +++ b/src/core/mac_startup.mm @@ -46,6 +46,7 @@ #include "macglobalshortcutbackend.h" #include "utilities.h" #include "core/logging.h" +#include "core/scoped_cftyperef.h" #ifdef HAVE_SPARKLE #import @@ -259,12 +260,10 @@ void CheckForUpdates() { } QString GetBundlePath() { - CFURLRef app_url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - CFStringRef mac_path = CFURLCopyFileSystemPath(app_url, kCFURLPOSIXPathStyle); - const char* path = CFStringGetCStringPtr(mac_path, CFStringGetSystemEncoding()); + ScopedCFTypeRef app_url(CFBundleCopyBundleURL(CFBundleGetMainBundle())); + ScopedCFTypeRef mac_path(CFURLCopyFileSystemPath(app_url.get(), kCFURLPOSIXPathStyle)); + const char* path = CFStringGetCStringPtr(mac_path.get(), CFStringGetSystemEncoding()); QString bundle_path = QString::fromUtf8(path); - CFRelease(app_url); - CFRelease(mac_path); return bundle_path; } diff --git a/src/core/scoped_cftyperef.h b/src/core/scoped_cftyperef.h new file mode 100644 index 000000000..b516de217 --- /dev/null +++ b/src/core/scoped_cftyperef.h @@ -0,0 +1,77 @@ +// Copyright (c) 2010 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_MAC_SCOPED_CFTYPEREF_H_ +#define BASE_MAC_SCOPED_CFTYPEREF_H_ + +#include + +// ScopedCFTypeRef<> is patterned after scoped_ptr<>, but maintains ownership +// of a CoreFoundation object: any object that can be represented as a +// CFTypeRef. Style deviations here are solely for compatibility with +// scoped_ptr<>'s interface, with which everyone is already familiar. +// +// When ScopedCFTypeRef<> takes ownership of an object (in the constructor or +// in reset()), it takes over the caller's existing ownership claim. The +// caller must own the object it gives to ScopedCFTypeRef<>, and relinquishes +// an ownership claim to that object. ScopedCFTypeRef<> does not call +// CFRetain(). +template +class ScopedCFTypeRef { + public: + typedef CFT element_type; + + explicit ScopedCFTypeRef(CFT object = NULL) + : object_(object) { + } + + ~ScopedCFTypeRef() { + if (object_) + CFRelease(object_); + } + + void reset(CFT object = NULL) { + if (object_) + CFRelease(object_); + object_ = object; + } + + bool operator==(CFT that) const { + return object_ == that; + } + + bool operator!=(CFT that) const { + return object_ != that; + } + + operator CFT() const { + return object_; + } + + CFT get() const { + return object_; + } + + void swap(ScopedCFTypeRef& that) { + CFT temp = that.object_; + that.object_ = object_; + object_ = temp; + } + + // ScopedCFTypeRef<>::release() is like scoped_ptr<>::release. It is NOT + // a wrapper for CFRelease(). To force a ScopedCFTypeRef<> object to call + // CFRelease(), use ScopedCFTypeRef<>::reset(). + CFT release() __attribute__((warn_unused_result)) { + CFT temp = object_; + object_ = NULL; + return temp; + } + + private: + CFT object_; + + Q_DISABLE_COPY(ScopedCFTypeRef); +}; + +#endif // BASE_MAC_SCOPED_CFTYPEREF_H_