130fdc8d8SChris Lattner //===-- CFBundle.cpp --------------------------------------------*- C++ -*-===//
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 //  Created by Greg Clayton on 1/16/08.
1030fdc8d8SChris Lattner //
1130fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
1230fdc8d8SChris Lattner 
1330fdc8d8SChris Lattner #include "CFBundle.h"
1430fdc8d8SChris Lattner #include "CFString.h"
1530fdc8d8SChris Lattner 
1630fdc8d8SChris Lattner // CFBundle constructor
CFBundle(const char * path)17b9c1b51eSKate Stone CFBundle::CFBundle(const char *path)
18b9c1b51eSKate Stone     : CFReleaser<CFBundleRef>(), m_bundle_url() {
1930fdc8d8SChris Lattner   if (path && path[0])
2030fdc8d8SChris Lattner     SetPath(path);
2130fdc8d8SChris Lattner }
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner // CFBundle copy constructor
24*24f9a2f5SShafik Yaghmour CFBundle::CFBundle(const CFBundle &rhs) = default;
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner // CFBundle copy constructor
operator =(const CFBundle & rhs)27b9c1b51eSKate Stone CFBundle &CFBundle::operator=(const CFBundle &rhs) {
2802f74b08SGreg Clayton   if (this != &rhs)
2930fdc8d8SChris Lattner     *this = rhs;
3030fdc8d8SChris Lattner   return *this;
3130fdc8d8SChris Lattner }
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner // Destructor
34*24f9a2f5SShafik Yaghmour CFBundle::~CFBundle() = default;
3530fdc8d8SChris Lattner 
3630fdc8d8SChris Lattner // Set the path for a bundle by supplying a
SetPath(const char * path)37b9c1b51eSKate Stone bool CFBundle::SetPath(const char *path) {
3830fdc8d8SChris Lattner   CFAllocatorRef alloc = kCFAllocatorDefault;
3930fdc8d8SChris Lattner   // Release our old bundle and ULR
4030fdc8d8SChris Lattner   reset(); // This class is a CFReleaser<CFBundleRef>
4130fdc8d8SChris Lattner   m_bundle_url.reset();
4230fdc8d8SChris Lattner   // Make a CFStringRef from the supplied path
4330fdc8d8SChris Lattner   CFString cf_path;
4430fdc8d8SChris Lattner   cf_path.SetFileSystemRepresentation(path);
45b9c1b51eSKate Stone   if (cf_path.get()) {
4630fdc8d8SChris Lattner     // Make our Bundle URL
47b9c1b51eSKate Stone     m_bundle_url.reset(::CFURLCreateWithFileSystemPath(
48b9c1b51eSKate Stone         alloc, cf_path.get(), kCFURLPOSIXPathStyle, true));
49b9c1b51eSKate Stone     if (m_bundle_url.get()) {
5030fdc8d8SChris Lattner       reset(::CFBundleCreate(alloc, m_bundle_url.get()));
5130fdc8d8SChris Lattner     }
5230fdc8d8SChris Lattner   }
5330fdc8d8SChris Lattner   return get() != NULL;
5430fdc8d8SChris Lattner }
5530fdc8d8SChris Lattner 
GetIdentifier() const56b9c1b51eSKate Stone CFStringRef CFBundle::GetIdentifier() const {
5730fdc8d8SChris Lattner   CFBundleRef bundle = get();
5830fdc8d8SChris Lattner   if (bundle != NULL)
5930fdc8d8SChris Lattner     return ::CFBundleGetIdentifier(bundle);
6030fdc8d8SChris Lattner   return NULL;
6130fdc8d8SChris Lattner }
6248baf7a7SGreg Clayton 
CopyExecutableURL() const63b9c1b51eSKate Stone CFURLRef CFBundle::CopyExecutableURL() const {
6448baf7a7SGreg Clayton   CFBundleRef bundle = get();
6548baf7a7SGreg Clayton   if (bundle != NULL)
6648baf7a7SGreg Clayton     return CFBundleCopyExecutableURL(bundle);
6748baf7a7SGreg Clayton   return NULL;
6848baf7a7SGreg Clayton }
69