diff options
Diffstat (limited to 'WebCore/fileapi/DOMFileSystemSync.cpp')
-rw-r--r-- | WebCore/fileapi/DOMFileSystemSync.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/WebCore/fileapi/DOMFileSystemSync.cpp b/WebCore/fileapi/DOMFileSystemSync.cpp index 3de64a7..dcbc9c7 100644 --- a/WebCore/fileapi/DOMFileSystemSync.cpp +++ b/WebCore/fileapi/DOMFileSystemSync.cpp @@ -35,11 +35,19 @@ #include "DOMFilePath.h" #include "DirectoryEntrySync.h" +#include "ErrorCallback.h" #include "File.h" #include "FileEntrySync.h" +#include "FileError.h" +#include "FileException.h" +#include "FileSystemCallbacks.h" +#include "FileWriterBaseCallback.h" +#include "FileWriterSync.h" namespace WebCore { +class FileWriterBase; + PassRefPtr<DOMFileSystemSync> DOMFileSystemSync::create(DOMFileSystemBase* fileSystem) { return adoptRef(new DOMFileSystemSync(fileSystem->m_name, fileSystem->m_asyncFileSystem.release())); @@ -66,6 +74,99 @@ PassRefPtr<File> DOMFileSystemSync::createFile(const FileEntrySync* fileEntry, E return File::create(platformPath); } +namespace { + +class ReceiveFileWriterCallback : public FileWriterBaseCallback { +public: + static PassRefPtr<ReceiveFileWriterCallback> create() + { + return adoptRef(new ReceiveFileWriterCallback()); + } + + bool handleEvent(FileWriterBase* fileWriterBase) + { +#ifndef NDEBUG + m_fileWriterBase = fileWriterBase; +#else + ASSERT_UNUSED(fileWriterBase, fileWriterBase); +#endif + return true; + } + +#ifndef NDEBUG + FileWriterBase* fileWriterBase() + { + return m_fileWriterBase; + } +#endif + +private: + ReceiveFileWriterCallback() +#ifndef NDEBUG + : m_fileWriterBase(0) +#endif + { + } + +#ifndef NDEBUG + FileWriterBase* m_fileWriterBase; +#endif +}; + +class LocalErrorCallback : public ErrorCallback { +public: + static PassRefPtr<LocalErrorCallback> create() + { + return adoptRef(new LocalErrorCallback()); + } + + bool handleEvent(FileError* error) + { + m_error = error; + return true; + } + + FileError* error() + { + return m_error.get(); + } + +private: + LocalErrorCallback() + { + } + RefPtr<FileError> m_error; +}; + +} + +PassRefPtr<FileWriterSync> DOMFileSystemSync::createWriter(const FileEntrySync* fileEntry, ExceptionCode& ec) +{ + ASSERT(fileEntry); + ec = 0; + + String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath()); + + RefPtr<FileWriterSync> fileWriter = FileWriterSync::create(); + RefPtr<ReceiveFileWriterCallback> successCallback = ReceiveFileWriterCallback::create(); + RefPtr<LocalErrorCallback> errorCallback = LocalErrorCallback::create(); + + OwnPtr<FileWriterBaseCallbacks> callbacks = FileWriterBaseCallbacks::create(fileWriter, successCallback, errorCallback); + m_asyncFileSystem->createWriter(fileWriter.get(), platformPath, callbacks.release()); + if (!m_asyncFileSystem->waitForOperationToComplete()) { + ec = FileException::ABORT_ERR; + return 0; + } + if (errorCallback->error()) { + ASSERT(!successCallback->fileWriterBase()); + ec = FileException::ErrorCodeToExceptionCode(errorCallback->error()->code()); + return 0; + } + ASSERT(successCallback->fileWriterBase()); + ASSERT(static_cast<FileWriterSync*>(successCallback->fileWriterBase()) == fileWriter.get()); + return fileWriter; +} + } #endif // ENABLE(FILE_SYSTEM) |