SharedBufferCF.cpp [plain text]
#include "config.h"
#include "SharedBuffer.h"
#include "PurgeableBuffer.h"
namespace WebCore {
SharedBuffer::SharedBuffer(CFDataRef cfData)
: m_size(0)
, m_cfData(cfData)
{
}
#if !PLATFORM(MAC)
CFDataRef SharedBuffer::createCFData()
{
if (m_cfData) {
CFRetain(m_cfData.get());
return m_cfData.get();
}
const Vector<char>& contiguousBuffer = buffer();
return CFDataCreate(0, reinterpret_cast<const UInt8*>(contiguousBuffer.data()), contiguousBuffer.size());
}
#endif
PassRefPtr<SharedBuffer> SharedBuffer::wrapCFData(CFDataRef data)
{
return adoptRef(new SharedBuffer(data));
}
bool SharedBuffer::hasPlatformData() const
{
return m_cfData;
}
const char* SharedBuffer::platformData() const
{
return (const char*)CFDataGetBytePtr(m_cfData.get());
}
unsigned SharedBuffer::platformDataSize() const
{
return CFDataGetLength(m_cfData.get());
}
void SharedBuffer::maybeTransferPlatformData()
{
if (!m_cfData)
return;
ASSERT(!m_size);
append((const char*)CFDataGetBytePtr(m_cfData.get()), CFDataGetLength(m_cfData.get()));
m_cfData = 0;
}
void SharedBuffer::clearPlatformData()
{
m_cfData = 0;
}
#if HAVE(CFNETWORK_DATA_ARRAY_CALLBACK)
void SharedBuffer::append(CFDataRef data)
{
ASSERT(data);
m_dataArray.append(data);
m_size += CFDataGetLength(data);
}
void SharedBuffer::copyDataArrayAndClear(char *destination, unsigned bytesToCopy) const
{
if (m_dataArray.isEmpty())
return;
CFIndex bytesLeft = bytesToCopy;
Vector<RetainPtr<CFDataRef> >::const_iterator end = m_dataArray.end();
for (Vector<RetainPtr<CFDataRef> >::const_iterator it = m_dataArray.begin(); it != end; ++it) {
CFIndex dataLen = CFDataGetLength(it->get());
ASSERT(bytesLeft >= dataLen);
memcpy(destination, CFDataGetBytePtr(it->get()), dataLen);
destination += dataLen;
bytesLeft -= dataLen;
}
m_dataArray.clear();
}
#endif
}