#ifndef BlobData_h
#define BlobData_h
#include "BlobDataFileReference.h"
#include "URL.h"
#include <wtf/Forward.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
class RawData : public RefCounted<RawData> {
public:
static PassRefPtr<RawData> create(Vector<char>&& data)
{
return adoptRef(new RawData(WTF::move(data)));
}
static PassRefPtr<RawData> create(const char* data, size_t size)
{
Vector<char> dataVector(size);
memcpy(dataVector.data(), data, size);
return adoptRef(new RawData(WTF::move(dataVector)));
}
const char* data() const { return m_data.data(); }
size_t length() const { return m_data.size(); }
private:
RawData(Vector<char>&& data)
: m_data(WTF::move(data))
{
}
Vector<char> m_data;
};
struct BlobDataItem {
static const long long toEndOfFile;
enum {
Data,
File
} type;
RefPtr<RawData> data;
RefPtr<BlobDataFileReference> file;
long long offset() const { return m_offset; }
long long length() const;
private:
friend class BlobData;
explicit BlobDataItem(PassRefPtr<BlobDataFileReference> file)
: type(File)
, file(file)
, m_offset(0)
, m_length(toEndOfFile)
{
}
BlobDataItem(PassRefPtr<RawData> data, long long offset, long long length)
: type(Data)
, data(data)
, m_offset(offset)
, m_length(length)
{
}
BlobDataItem(BlobDataFileReference* file, long long offset, long long length)
: type(File)
, file(file)
, m_offset(offset)
, m_length(length)
{
}
long long m_offset;
long long m_length;
};
typedef Vector<BlobDataItem> BlobDataItemList;
class BlobData : public RefCounted<BlobData> {
public:
static PassRefPtr<BlobData> create()
{
return adoptRef(new BlobData);
}
const String& contentType() const { return m_contentType; }
void setContentType(const String&);
const BlobDataItemList& items() const { return m_items; }
void swapItems(BlobDataItemList&);
void appendData(PassRefPtr<RawData>);
void appendFile(PassRefPtr<BlobDataFileReference>);
private:
friend class BlobRegistryImpl;
void appendData(PassRefPtr<RawData>, long long offset, long long length);
void appendFile(BlobDataFileReference*, long long offset, long long length);
String m_contentType;
BlobDataItemList m_items;
};
}
#endif // BlobData_h