124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CFBundle.cpp --------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Created by Greg Clayton on 1/16/08.
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CFBundle.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CFString.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CFBundle constructor
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFBundle::CFBundle(const char *path) :
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFReleaser<CFBundleRef>(),
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_bundle_url()
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (path && path[0])
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetPath(path);
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CFBundle copy constructor
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFBundle::CFBundle(const CFBundle& rhs) :
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFReleaser<CFBundleRef>(rhs),
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_bundle_url(rhs.m_bundle_url)
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CFBundle copy constructor
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFBundle&
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFBundle::operator=(const CFBundle& rhs)
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *this = rhs;
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFBundle::~CFBundle()
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Set the path for a bundle by supplying a
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFBundle::SetPath (const char *path)
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFAllocatorRef alloc = kCFAllocatorDefault;
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Release our old bundle and ULR
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    reset();    // This class is a CFReleaser<CFBundleRef>
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_bundle_url.reset();
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make a CFStringRef from the supplied path
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFString cf_path;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    cf_path.SetFileSystemRepresentation(path);
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cf_path.get())
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Make our Bundle URL
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_bundle_url.reset (::CFURLCreateWithFileSystemPath (alloc, cf_path.get(), kCFURLPOSIXPathStyle, true));
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_bundle_url.get())
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            reset (::CFBundleCreate (alloc, m_bundle_url.get()));
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return get() != NULL;
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFStringRef
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFBundle::GetIdentifier () const
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFBundleRef bundle = get();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bundle != NULL)
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ::CFBundleGetIdentifier (bundle);
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg Clayton
89a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg Clayton
90a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg ClaytonCFURLRef
91a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg ClaytonCFBundle::CopyExecutableURL () const
92a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg Clayton{
93a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg Clayton    CFBundleRef bundle = get();
94a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg Clayton    if (bundle != NULL)
95a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg Clayton        return CFBundleCopyExecutableURL(bundle);
96a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg Clayton    return NULL;
97a5c92b6c0af7b68ae999d9efd87a060255aa7a37Greg Clayton}
98