180814287SRaphael Isemann //===-- CFCBundle.cpp -----------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include "CFCBundle.h"
1030fdc8d8SChris Lattner #include "CFCString.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner // CFCBundle constructor
CFCBundle(const char * path)13b9c1b51eSKate Stone CFCBundle::CFCBundle(const char *path) : CFCReleaser<CFBundleRef>() {
1430fdc8d8SChris Lattner   if (path && path[0])
1530fdc8d8SChris Lattner     SetPath(path);
1630fdc8d8SChris Lattner }
1730fdc8d8SChris Lattner 
CFCBundle(CFURLRef url)18b9c1b51eSKate Stone CFCBundle::CFCBundle(CFURLRef url)
19b9c1b51eSKate Stone     : CFCReleaser<CFBundleRef>(url ? CFBundleCreate(NULL, url) : NULL) {}
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner // Destructor
22*fd2433e1SJonas Devlieghere CFCBundle::~CFCBundle() = default;
2330fdc8d8SChris Lattner 
2430fdc8d8SChris Lattner // Set the path for a bundle by supplying a
SetPath(const char * path)25b9c1b51eSKate Stone bool CFCBundle::SetPath(const char *path) {
2630fdc8d8SChris Lattner   CFAllocatorRef alloc = kCFAllocatorDefault;
2730fdc8d8SChris Lattner   // Release our old bundle and URL
2830fdc8d8SChris Lattner   reset();
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner   // Make a CFStringRef from the supplied path
3130fdc8d8SChris Lattner   CFCString cf_path;
3230fdc8d8SChris Lattner   cf_path.SetFileSystemRepresentation(path);
33b9c1b51eSKate Stone   if (cf_path.get()) {
3430fdc8d8SChris Lattner     // Make our Bundle URL
35b9c1b51eSKate Stone     CFCReleaser<CFURLRef> bundle_url(::CFURLCreateWithFileSystemPath(
36b9c1b51eSKate Stone         alloc, cf_path.get(), kCFURLPOSIXPathStyle, true));
3730fdc8d8SChris Lattner     if (bundle_url.get())
3830fdc8d8SChris Lattner       reset(::CFBundleCreate(alloc, bundle_url.get()));
3930fdc8d8SChris Lattner   }
4030fdc8d8SChris Lattner   return get() != NULL;
4130fdc8d8SChris Lattner }
4230fdc8d8SChris Lattner 
GetPath(char * dst,size_t dst_len)43b9c1b51eSKate Stone bool CFCBundle::GetPath(char *dst, size_t dst_len) {
44c859e2d5SGreg Clayton   CFBundleRef bundle = get();
45b9c1b51eSKate Stone   if (bundle) {
46c859e2d5SGreg Clayton     CFCReleaser<CFURLRef> bundle_url(CFBundleCopyBundleURL(bundle));
47b9c1b51eSKate Stone     if (bundle_url.get()) {
48c859e2d5SGreg Clayton       Boolean resolveAgainstBase = 0;
49b9c1b51eSKate Stone       return ::CFURLGetFileSystemRepresentation(bundle_url.get(),
50b9c1b51eSKate Stone                                                 resolveAgainstBase,
51b9c1b51eSKate Stone                                                 (UInt8 *)dst, dst_len) != 0;
52c859e2d5SGreg Clayton     }
53c859e2d5SGreg Clayton   }
54c859e2d5SGreg Clayton   return false;
55c859e2d5SGreg Clayton }
56c859e2d5SGreg Clayton 
GetIdentifier() const57b9c1b51eSKate Stone CFStringRef CFCBundle::GetIdentifier() const {
5830fdc8d8SChris Lattner   CFBundleRef bundle = get();
5930fdc8d8SChris Lattner   if (bundle != NULL)
6030fdc8d8SChris Lattner     return ::CFBundleGetIdentifier(bundle);
6130fdc8d8SChris Lattner   return NULL;
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner 
GetValueForInfoDictionaryKey(CFStringRef key) const64b9c1b51eSKate Stone CFTypeRef CFCBundle::GetValueForInfoDictionaryKey(CFStringRef key) const {
6530fdc8d8SChris Lattner   CFBundleRef bundle = get();
6630fdc8d8SChris Lattner   if (bundle != NULL)
6730fdc8d8SChris Lattner     return ::CFBundleGetValueForInfoDictionaryKey(bundle, key);
6830fdc8d8SChris Lattner   return NULL;
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
CopyExecutableURL() const71b9c1b51eSKate Stone CFURLRef CFCBundle::CopyExecutableURL() const {
7230fdc8d8SChris Lattner   CFBundleRef bundle = get();
7330fdc8d8SChris Lattner   if (bundle != NULL)
7430fdc8d8SChris Lattner     return CFBundleCopyExecutableURL(bundle);
7530fdc8d8SChris Lattner   return NULL;
7630fdc8d8SChris Lattner }
77