124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CFData.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 "CFData.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CFData constructor
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFData::CFData(CFDataRef data) :
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFReleaser<CFDataRef>(data)
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CFData copy constructor
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFData::CFData(const CFData& rhs) :
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFReleaser<CFDataRef>(rhs)
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CFData copy constructor
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFData&
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFData::operator=(const CFData& rhs)
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    *this = rhs;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFData::~CFData()
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFIndex
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFData::GetLength() const
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFDataRef data = get();
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data)
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return CFDataGetLength (data);
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst uint8_t*
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFData::GetBytePtr() const
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFDataRef data = get();
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (data)
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return CFDataGetBytePtr (data);
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFDataRef
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCFData::Serialize(CFPropertyListRef plist, CFPropertyListFormat format)
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFAllocatorRef alloc = kCFAllocatorDefault;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    reset();
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFReleaser<CFWriteStreamRef> stream (::CFWriteStreamCreateWithAllocatedBuffers (alloc, alloc));
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ::CFWriteStreamOpen (stream.get());
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CFIndex len = ::CFPropertyListWriteToStream (plist, stream.get(), format, NULL);
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (len > 0)
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        reset((CFDataRef)::CFWriteStreamCopyProperty (stream.get(), kCFStreamPropertyDataWritten));
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ::CFWriteStreamClose (stream.get());
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return get();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86