15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/FileSystemCallbacks.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/ExecutionContext.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/fileapi/FileError.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/VoidCallback.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/DOMFilePath.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/DOMFileSystemBase.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/DirectoryEntry.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/DirectoryReader.h"
413c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "modules/filesystem/Entry.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/EntryCallback.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/ErrorCallback.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/FileEntry.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/FileSystemCallback.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/FileWriterBase.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/FileWriterBaseCallback.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/Metadata.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/MetadataCallback.h"
501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/FileMetadata.h"
51e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "public/platform/WebFileWriter.h"
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)FileSystemCallbacksBase::FileSystemCallbacksBase(PassOwnPtr<ErrorCallback> errorCallback, DOMFileSystemBase* fileSystem)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_errorCallback(errorCallback)
578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    , m_fileSystem(fileSystem)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_fileSystem)
608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        m_fileSystem->addPendingCallbacks();
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FileSystemCallbacksBase::~FileSystemCallbacksBase()
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_fileSystem)
668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        m_fileSystem->removePendingCallbacks();
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FileSystemCallbacksBase::didFail(int code)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_errorCallback) {
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_errorCallback->handleEvent(FileError::create(static_cast<FileError::ErrorCode>(code)).get());
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_errorCallback.clear();
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// EntryCallbacks -------------------------------------------------------------
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassOwnPtr<AsyncFileSystemCallbacks> EntryCallbacks::create(PassOwnPtr<EntryCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, PassRefPtr<DOMFileSystemBase> fileSystem, const String& expectedPath, bool isDirectory)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(new EntryCallbacks(successCallback, errorCallback, fileSystem, expectedPath, isDirectory));
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)EntryCallbacks::EntryCallbacks(PassOwnPtr<EntryCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, PassRefPtr<DOMFileSystemBase> fileSystem, const String& expectedPath, bool isDirectory)
858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    : FileSystemCallbacksBase(errorCallback, fileSystem.get())
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_successCallback(successCallback)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_expectedPath(expectedPath)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isDirectory(isDirectory)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EntryCallbacks::didSucceed()
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_successCallback) {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_isDirectory)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_successCallback->handleEvent(DirectoryEntry::create(m_fileSystem, m_expectedPath).get());
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_successCallback->handleEvent(FileEntry::create(m_fileSystem, m_expectedPath).get());
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_successCallback.clear();
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// EntriesCallbacks -----------------------------------------------------------
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassOwnPtr<AsyncFileSystemCallbacks> EntriesCallbacks::create(PassOwnPtr<EntriesCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, PassRefPtr<DirectoryReaderBase> directoryReader, const String& basePath)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(new EntriesCallbacks(successCallback, errorCallback, directoryReader, basePath));
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)EntriesCallbacks::EntriesCallbacks(PassOwnPtr<EntriesCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, PassRefPtr<DirectoryReaderBase> directoryReader, const String& basePath)
1118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    : FileSystemCallbacksBase(errorCallback, directoryReader->filesystem())
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_successCallback(successCallback)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_directoryReader(directoryReader)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_basePath(basePath)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_directoryReader);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EntriesCallbacks::didReadDirectoryEntry(const String& name, bool isDirectory)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isDirectory)
1223c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        m_entries.append(DirectoryEntry::create(m_directoryReader->filesystem(), DOMFilePath::append(m_basePath, name)));
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
1243c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        m_entries.append(FileEntry::create(m_directoryReader->filesystem(), DOMFilePath::append(m_basePath, name)));
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void EntriesCallbacks::didReadDirectoryEntries(bool hasMore)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_directoryReader->setHasMoreEntries(hasMore);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_successCallback)
1313c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        m_successCallback->handleEvent(m_entries);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FileSystemCallbacks --------------------------------------------------------
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassOwnPtr<AsyncFileSystemCallbacks> FileSystemCallbacks::create(PassOwnPtr<FileSystemCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, ExecutionContext* executionContext, FileSystemType type)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(new FileSystemCallbacks(successCallback, errorCallback, executionContext, type));
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
141a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)FileSystemCallbacks::FileSystemCallbacks(PassOwnPtr<FileSystemCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, ExecutionContext* context, FileSystemType type)
1428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    : FileSystemCallbacksBase(errorCallback, 0)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_successCallback(successCallback)
1441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_executionContext(context)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_type(type)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void FileSystemCallbacks::didOpenFileSystem(const String& name, const KURL& rootURL)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_successCallback) {
1521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        RefPtr<DOMFileSystem> fileSystem = DOMFileSystem::create(m_executionContext.get(), name, m_type, rootURL);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_successCallback->handleEvent(fileSystem.get());
1541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_executionContext.clear();
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_successCallback.clear();
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ResolveURICallbacks --------------------------------------------------------
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
161a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassOwnPtr<AsyncFileSystemCallbacks> ResolveURICallbacks::create(PassOwnPtr<EntryCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, ExecutionContext* executionContext)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(new ResolveURICallbacks(successCallback, errorCallback, executionContext));
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
166a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)ResolveURICallbacks::ResolveURICallbacks(PassOwnPtr<EntryCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, ExecutionContext* context)
1678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    : FileSystemCallbacksBase(errorCallback, 0)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_successCallback(successCallback)
1691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_executionContext(context)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1739bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void ResolveURICallbacks::didResolveURL(const String& name, const KURL& rootURL, FileSystemType type, const String& filePath, bool isDirectory)
1749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    RefPtr<DOMFileSystem> filesystem = DOMFileSystem::create(m_executionContext.get(), name, type, rootURL);
1769bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    RefPtr<DirectoryEntry> root = filesystem->root();
1779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1789bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    String absolutePath;
1799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!DOMFileSystemBase::pathToAbsolutePath(type, root.get(), filePath, absolutePath)) {
1809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_errorCallback->handleEvent(FileError::create(FileError::INVALID_MODIFICATION_ERR).get());
1819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_errorCallback.clear();
1829bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
1839bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
1849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1859bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (isDirectory)
1869bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_successCallback->handleEvent(DirectoryEntry::create(filesystem, absolutePath).get());
1879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    else
1889bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_successCallback->handleEvent(FileEntry::create(filesystem, absolutePath).get());
1899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_successCallback.clear();
1909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// MetadataCallbacks ----------------------------------------------------------
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassOwnPtr<AsyncFileSystemCallbacks> MetadataCallbacks::create(PassOwnPtr<MetadataCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, DOMFileSystemBase* fileSystem)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(new MetadataCallbacks(successCallback, errorCallback, fileSystem));
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
199a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)MetadataCallbacks::MetadataCallbacks(PassOwnPtr<MetadataCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, DOMFileSystemBase* fileSystem)
2008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    : FileSystemCallbacksBase(errorCallback, fileSystem)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_successCallback(successCallback)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void MetadataCallbacks::didReadMetadata(const FileMetadata& metadata)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_successCallback)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_successCallback->handleEvent(Metadata::create(metadata).get());
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_successCallback.clear();
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FileWriterBaseCallbacks ----------------------------------------------------------
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
214a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassOwnPtr<AsyncFileSystemCallbacks> FileWriterBaseCallbacks::create(PassRefPtr<FileWriterBase> fileWriter, PassOwnPtr<FileWriterBaseCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(new FileWriterBaseCallbacks(fileWriter, successCallback, errorCallback));
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
219a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)FileWriterBaseCallbacks::FileWriterBaseCallbacks(PassRefPtr<FileWriterBase> fileWriter, PassOwnPtr<FileWriterBaseCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback)
2208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    : FileSystemCallbacksBase(errorCallback, 0)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_fileWriter(fileWriter)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_successCallback(successCallback)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FileWriterBaseCallbacks::didCreateFileWriter(PassOwnPtr<blink::WebFileWriter> fileWriter, long long length)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
228e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_fileWriter->initialize(fileWriter, length);
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_successCallback)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_successCallback->handleEvent(m_fileWriter.release().get());
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_successCallback.clear();
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// VoidCallbacks --------------------------------------------------------------
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
236a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassOwnPtr<AsyncFileSystemCallbacks> VoidCallbacks::create(PassOwnPtr<VoidCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, DOMFileSystemBase* fileSystem)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adoptPtr(new VoidCallbacks(successCallback, errorCallback, fileSystem));
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
241a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)VoidCallbacks::VoidCallbacks(PassOwnPtr<VoidCallback> successCallback, PassOwnPtr<ErrorCallback> errorCallback, DOMFileSystemBase* fileSystem)
2428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    : FileSystemCallbacksBase(errorCallback, fileSystem)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_successCallback(successCallback)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void VoidCallbacks::didSucceed()
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_successCallback)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_successCallback->handleEvent();
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_successCallback.clear();
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
255