This source file includes following definitions.
- detachFromCurrentThread
- detachFromCurrentThread
- create
- detachFromCurrentThread
- appendData
- appendFile
- appendFile
- appendBlob
- appendFileSystemURL
- appendText
- appendBytes
- appendArrayBuffer
- appendArrayBufferView
- swapItems
- length
- m_size
- m_size
- m_size
#include "config.h"
#include "platform/blob/BlobData.h"
#include "platform/UUID.h"
#include "platform/blob/BlobRegistry.h"
#include "platform/text/LineEnding.h"
#include "wtf/ArrayBuffer.h"
#include "wtf/ArrayBufferView.h"
#include "wtf/OwnPtr.h"
#include "wtf/PassRefPtr.h"
#include "wtf/RefPtr.h"
#include "wtf/Vector.h"
#include "wtf/text/CString.h"
#include "wtf/text/TextEncoding.h"
namespace WebCore {
const long long BlobDataItem::toEndOfFile = -1;
RawData::RawData()
{
}
void RawData::detachFromCurrentThread()
{
}
void BlobDataItem::detachFromCurrentThread()
{
data->detachFromCurrentThread();
path = path.isolatedCopy();
fileSystemURL = fileSystemURL.copy();
}
PassOwnPtr<BlobData> BlobData::create()
{
return adoptPtr(new BlobData());
}
void BlobData::detachFromCurrentThread()
{
m_contentType = m_contentType.isolatedCopy();
m_contentDisposition = m_contentDisposition.isolatedCopy();
for (size_t i = 0; i < m_items.size(); ++i)
m_items.at(i).detachFromCurrentThread();
}
void BlobData::appendData(PassRefPtr<RawData> data, long long offset, long long length)
{
m_items.append(BlobDataItem(data, offset, length));
}
void BlobData::appendFile(const String& path)
{
m_items.append(BlobDataItem(path));
}
void BlobData::appendFile(const String& path, long long offset, long long length, double expectedModificationTime)
{
m_items.append(BlobDataItem(path, offset, length, expectedModificationTime));
}
void BlobData::appendBlob(PassRefPtr<BlobDataHandle> dataHandle, long long offset, long long length)
{
m_items.append(BlobDataItem(dataHandle, offset, length));
}
void BlobData::appendFileSystemURL(const KURL& url, long long offset, long long length, double expectedModificationTime)
{
m_items.append(BlobDataItem(url, offset, length, expectedModificationTime));
}
void BlobData::appendText(const String& text, bool doNormalizeLineEndingsToNative)
{
RefPtr<RawData> data = RawData::create();
Vector<char>* buffer = data->mutableData();
CString utf8Text = UTF8Encoding().normalizeAndEncode(text, WTF::EntitiesForUnencodables);
if (doNormalizeLineEndingsToNative) {
WebCore::normalizeLineEndingsToNative(utf8Text, *buffer);
} else {
buffer->append(utf8Text.data(), utf8Text.length());
}
m_items.append(BlobDataItem(data.release()));
}
void BlobData::appendBytes(const void* bytes, long long length)
{
RefPtr<RawData> data = RawData::create();
Vector<char>* buffer = data->mutableData();
buffer->append(static_cast<const char *>(bytes), length);
m_items.append(BlobDataItem(data.release()));
}
void BlobData::appendArrayBuffer(const ArrayBuffer* arrayBuffer)
{
appendBytes(arrayBuffer->data(), arrayBuffer->byteLength());
}
void BlobData::appendArrayBufferView(const ArrayBufferView* arrayBufferView)
{
appendBytes(arrayBufferView->baseAddress(), arrayBufferView->byteLength());
}
void BlobData::swapItems(BlobDataItemList& items)
{
m_items.swap(items);
}
long long BlobData::length() const
{
long long length = 0;
for (Vector<BlobDataItem>::const_iterator it = m_items.begin(); it != m_items.end(); ++it) {
const BlobDataItem& item = *it;
if (item.length != BlobDataItem::toEndOfFile) {
ASSERT(item.length >= 0);
length += item.length;
continue;
}
switch (item.type) {
case BlobDataItem::Data:
length += item.data->length();
break;
case BlobDataItem::File:
case BlobDataItem::Blob:
case BlobDataItem::FileSystemURL:
return BlobDataItem::toEndOfFile;
}
}
return length;
}
BlobDataHandle::BlobDataHandle()
: m_uuid(createCanonicalUUIDString())
, m_size(0)
{
BlobRegistry::registerBlobData(m_uuid, BlobData::create());
}
BlobDataHandle::BlobDataHandle(PassOwnPtr<BlobData> data, long long size)
: m_uuid(createCanonicalUUIDString())
, m_type(data->contentType().isolatedCopy())
, m_size(size)
{
BlobRegistry::registerBlobData(m_uuid, data);
}
BlobDataHandle::BlobDataHandle(const String& uuid, const String& type, long long size)
: m_uuid(uuid.isolatedCopy())
, m_type(type.isolatedCopy())
, m_size(size)
{
BlobRegistry::addBlobDataRef(m_uuid);
}
BlobDataHandle::~BlobDataHandle()
{
BlobRegistry::removeBlobDataRef(m_uuid);
}
}