#ifndef FileReader_h
#define FileReader_h
#if ENABLE(FILE_READER)
#include "ActiveDOMObject.h"
#include "EventTarget.h"
#include "FileError.h"
#include "FileStreamClient.h"
#include "PlatformString.h"
#include "ScriptString.h"
#include "TextEncoding.h"
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#include <wtf/Vector.h>
namespace WebCore {
class Blob;
class File;
class FileStreamProxy;
class ScriptExecutionContext;
class FileReader : public RefCounted<FileReader>, public ActiveDOMObject, public EventTarget, public FileStreamClient {
public:
static PassRefPtr<FileReader> create(ScriptExecutionContext* context)
{
return adoptRef(new FileReader(context));
}
virtual ~FileReader();
enum ReadyState {
Empty = 0,
Loading = 1,
Done = 2
};
void readAsBinaryString(Blob*);
void readAsText(Blob*, const String& encoding = "");
void readAsDataURL(File*);
void abort();
ReadyState readyState() const { return m_state; }
PassRefPtr<FileError> error() { return m_error; }
const ScriptString& result();
virtual bool canSuspend() const;
virtual void stop();
virtual bool hasPendingActivity() const;
virtual FileReader* toFileReader() { return this; }
virtual ScriptExecutionContext* scriptExecutionContext() const { return ActiveDOMObject::scriptExecutionContext(); }
virtual void didStart();
virtual void didGetSize(long long);
virtual void didRead(const char*, int);
virtual void didFinish();
virtual void didFail(ExceptionCode);
using RefCounted<FileReader>::ref;
using RefCounted<FileReader>::deref;
DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
DEFINE_ATTRIBUTE_EVENT_LISTENER(progress);
DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
DEFINE_ATTRIBUTE_EVENT_LISTENER(loadend);
private:
enum ReadType {
ReadFileAsBinaryString,
ReadFileAsText,
ReadFileAsDataURL
};
FileReader(ScriptExecutionContext*);
virtual void refEventTarget() { ref(); }
virtual void derefEventTarget() { deref(); }
virtual EventTargetData* eventTargetData() { return &m_eventTargetData; }
virtual EventTargetData* ensureEventTargetData() { return &m_eventTargetData; }
void terminate();
void readInternal(Blob*, ReadType);
void fireEvent(const AtomicString& type);
void convertToText();
void convertToDataURL();
ReadyState m_state;
EventTargetData m_eventTargetData;
RefPtr<Blob> m_fileBlob;
ReadType m_readType;
ScriptString m_result;
Vector<char> m_rawData;
bool m_isRawDataConverted;
TextEncoding m_encoding;
String m_fileType;
RefPtr<FileStreamProxy> m_streamProxy;
Vector<char> m_buffer;
RefPtr<FileError> m_error;
long long m_bytesLoaded;
long long m_totalBytes;
double m_lastProgressNotificationTimeMS;
bool m_alreadyStarted;
};
}
#endif
#endif // FileReader_h