#include "config.h"
#if ENABLE(FILE_READER) || ENABLE(FILE_WRITER)
#include "FileStream.h"
#include "Blob.h"
#include "PlatformString.h"
namespace WebCore {
FileStream::FileStream(FileStreamClient* client)
: m_client(client)
, m_handle(invalidPlatformFileHandle)
, m_bytesProcessed(0)
, m_totalBytesToRead(0)
{
}
FileStream::~FileStream()
{
ASSERT(!isHandleValid(m_handle));
}
void FileStream::start()
{
ASSERT(!isMainThread());
m_client->didStart();
}
void FileStream::stop()
{
ASSERT(!isMainThread());
close();
m_client->didStop();
}
void FileStream::openForRead(Blob* blob)
{
ASSERT(!isMainThread());
if (isHandleValid(m_handle))
return;
time_t currentModificationTime;
if (!getFileModificationTime(blob->path(), currentModificationTime)) {
m_client->didFail(NOT_FOUND_ERR);
return;
}
m_handle = openFile(blob->path(), OpenForRead);
if (!isHandleValid(m_handle)) {
m_client->didFail(NOT_READABLE_ERR);
return;
}
#if ENABLE(BLOB_SLICE)
if (blob->modificationTime() != Blob::doNotCheckFileChange && static_cast<time_t>(blob->modificationTime()) != currentModificationTime) {
m_client->didFail(NOT_READABLE_ERR);
return;
}
if (blob->start() > 0) {
if (!seekFile(m_handle, blob->start(), SeekFromBeginning)) {
m_client->didFail(NOT_READABLE_ERR);
return;
}
}
#endif
#if ENABLE(BLOB_SLICE)
m_totalBytesToRead = blob->length();
if (m_totalBytesToRead == Blob::toEndOfFile)
m_totalBytesToRead = blob->size() - blob->start();
#else
m_total = blob->size();
#endif
m_client->didGetSize(m_totalBytesToRead);
}
void FileStream::openForWrite(const String&)
{
ASSERT(!isMainThread());
}
void FileStream::close()
{
ASSERT(!isMainThread());
if (isHandleValid(m_handle)) {
closeFile(m_handle);
m_handle = invalidPlatformFileHandle;
}
}
void FileStream::read(char* buffer, int length)
{
ASSERT(!isMainThread());
if (!isHandleValid(m_handle)) {
m_client->didFail(NOT_READABLE_ERR);
return;
}
if (m_bytesProcessed >= m_totalBytesToRead) {
m_client->didFinish();
return;
}
long long remaining = m_totalBytesToRead - m_bytesProcessed;
int bytesToRead = (remaining < length) ? static_cast<int>(remaining) : length;
int bytesRead = readFromFile(m_handle, buffer, bytesToRead);
if (bytesRead < 0) {
m_client->didFail(NOT_READABLE_ERR);
return;
}
if (!bytesRead) {
m_client->didFinish();
return;
}
m_bytesProcessed += bytesRead;
m_client->didRead(buffer, bytesRead);
}
void FileStream::write(Blob*, long long, int)
{
ASSERT(!isMainThread());
}
void FileStream::truncate(long long)
{
ASSERT(!isMainThread());
}
}
#endif // ENABLE(FILE_READER) || ENABLE(FILE_WRITER)