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

#include "CFCData.h"

//----------------------------------------------------------------------
// CFCData constructor
//----------------------------------------------------------------------
CFCData::CFCData(CFDataRef data) :
    CFCReleaser<CFDataRef>(data)
{

}

//----------------------------------------------------------------------
// CFCData copy constructor
//----------------------------------------------------------------------
CFCData::CFCData(const CFCData& rhs) :
    CFCReleaser<CFDataRef>(rhs)
{

}

//----------------------------------------------------------------------
// CFCData copy constructor
//----------------------------------------------------------------------
CFCData&
CFCData::operator=(const CFCData& rhs)

{
    if (this != &rhs)
        *this = rhs;
    return *this;
}

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


CFIndex
CFCData::GetLength() const
{
    CFDataRef data = get();
    if (data)
        return CFDataGetLength (data);
    return 0;
}


const uint8_t*
CFCData::GetBytePtr() const
{
    CFDataRef data = get();
    if (data)
        return CFDataGetBytePtr (data);
    return NULL;
}

CFDataRef
CFCData::Serialize(CFPropertyListRef plist, CFPropertyListFormat format)
{
    CFAllocatorRef alloc = kCFAllocatorDefault;
    reset();
    CFCReleaser<CFWriteStreamRef> stream (::CFWriteStreamCreateWithAllocatedBuffers (alloc, alloc));
    ::CFWriteStreamOpen (stream.get());
    CFIndex len = ::CFPropertyListWriteToStream (plist, stream.get(), format, NULL);
    if (len > 0)
        reset((CFDataRef)::CFWriteStreamCopyProperty (stream.get(), kCFStreamPropertyDataWritten));
    ::CFWriteStreamClose (stream.get());
    return get();
}

