//===-- CFCBundle.cpp -------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "CFCBundle.h"
#include "CFCString.h"

//----------------------------------------------------------------------
// CFCBundle constructor
//----------------------------------------------------------------------
CFCBundle::CFCBundle(const char *path) :
    CFCReleaser<CFBundleRef>()
{
    if (path && path[0])
        SetPath(path);
}

CFCBundle::CFCBundle(CFURLRef url) :
    CFCReleaser<CFBundleRef>(url ? CFBundleCreate(NULL, url) : NULL)
{
}

//----------------------------------------------------------------------
// Destructor
//----------------------------------------------------------------------
CFCBundle::~CFCBundle()
{
}

//----------------------------------------------------------------------
// Set the path for a bundle by supplying a
//----------------------------------------------------------------------
bool
CFCBundle::SetPath (const char *path)
{
    CFAllocatorRef alloc = kCFAllocatorDefault;
    // Release our old bundle and URL
    reset();

    // Make a CFStringRef from the supplied path
    CFCString cf_path;
    cf_path.SetFileSystemRepresentation(path);
    if (cf_path.get())
    {
        // Make our Bundle URL
        CFCReleaser<CFURLRef> bundle_url (::CFURLCreateWithFileSystemPath (alloc, cf_path.get(), kCFURLPOSIXPathStyle, true));
        if (bundle_url.get())
            reset (::CFBundleCreate (alloc, bundle_url.get()));
    }
    return get() != NULL;
}

CFStringRef
CFCBundle::GetIdentifier () const
{
    CFBundleRef bundle = get();
    if (bundle != NULL)
        return ::CFBundleGetIdentifier (bundle);
    return NULL;
}

CFTypeRef
CFCBundle::GetValueForInfoDictionaryKey(CFStringRef key) const
{
    CFBundleRef bundle = get();
    if (bundle != NULL)
        return ::CFBundleGetValueForInfoDictionaryKey(bundle, key);
    return NULL;
}

CFURLRef
CFCBundle::CopyExecutableURL () const
{
    CFBundleRef bundle = get();
    if (bundle != NULL)
        return CFBundleCopyExecutableURL(bundle);
    return NULL;
}
