1e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block/*
2e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * Copyright (C) 2010 Google Inc. All rights reserved.
3e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *
4e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * Redistribution and use in source and binary forms, with or without
5e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * modification, are permitted provided that the following conditions are
6e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * met:
7e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *
8e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     * Redistributions of source code must retain the above copyright
9e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * notice, this list of conditions and the following disclaimer.
10e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     * Redistributions in binary form must reproduce the above
11e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * copyright notice, this list of conditions and the following disclaimer
12e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * in the documentation and/or other materials provided with the
13e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * distribution.
14e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     * Neither the name of Google Inc. nor the names of its
15e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * contributors may be used to endorse or promote products derived from
16e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * this software without specific prior written permission.
17e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *
18e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block */
30e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
31e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "config.h"
32e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "FileSystemCallbacks.h"
33e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
34e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(FILE_SYSTEM)
35e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "AsyncFileSystem.h"
37bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "AsyncFileWriter.h"
385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "DOMFilePath.h"
39a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "DOMFileSystemBase.h"
40e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "DirectoryEntry.h"
41a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "DirectoryReader.h"
42e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "EntriesCallback.h"
43e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "EntryArray.h"
44e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "EntryCallback.h"
45e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "ErrorCallback.h"
46e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "FileEntry.h"
47e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "FileError.h"
48e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "FileMetadata.h"
49e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "FileSystemCallback.h"
504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "FileWriterBase.h"
514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "FileWriterBaseCallback.h"
52e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "Metadata.h"
53e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "MetadataCallback.h"
54e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "ScriptExecutionContext.h"
55e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "VoidCallback.h"
56e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
57e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocknamespace WebCore {
58e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
59e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockFileSystemCallbacksBase::FileSystemCallbacksBase(PassRefPtr<ErrorCallback> errorCallback)
60e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    : m_errorCallback(errorCallback)
61e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
62e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
63e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
64e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockFileSystemCallbacksBase::~FileSystemCallbacksBase()
65e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
66e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
67e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
68e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid FileSystemCallbacksBase::didSucceed()
69e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
70e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // Each subclass must implement an appropriate one.
71e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT_NOT_REACHED();
72e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
73e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid FileSystemCallbacksBase::didOpenFileSystem(const String&, PassOwnPtr<AsyncFileSystem>)
75e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
76e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // Each subclass must implement an appropriate one.
77e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT_NOT_REACHED();
78e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
79e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
80e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FileSystemCallbacksBase::didReadMetadata(const FileMetadata&)
81e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
82e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // Each subclass must implement an appropriate one.
83e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT_NOT_REACHED();
84e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
85e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid FileSystemCallbacksBase::didReadDirectoryEntries(bool)
87e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
88e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // Each subclass must implement an appropriate one.
89e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT_NOT_REACHED();
90e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
91e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
92e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid FileSystemCallbacksBase::didReadDirectoryEntry(const String&, bool)
93e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
94e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // Each subclass must implement an appropriate one.
95e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT_NOT_REACHED();
96e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
97e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid FileSystemCallbacksBase::didCreateFileWriter(PassOwnPtr<AsyncFileWriter>, long long)
99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Each subclass must implement an appropriate one.
101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ASSERT_NOT_REACHED();
102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid FileSystemCallbacksBase::didFail(int code)
105e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
106e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_errorCallback) {
107e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_errorCallback->handleEvent(FileError::create(static_cast<FileError::ErrorCode>(code)).get());
108e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_errorCallback.clear();
109e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
110e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
111e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
112e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block// EntryCallbacks -------------------------------------------------------------
113e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
114e14391e94c850b8bd03680c23b38978db68687a8John ReckPassOwnPtr<EntryCallbacks> EntryCallbacks::create(PassRefPtr<EntryCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, PassRefPtr<DOMFileSystemBase> fileSystem, const String& expectedPath, bool isDirectory)
115bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
116bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return adoptPtr(new EntryCallbacks(successCallback, errorCallback, fileSystem, expectedPath, isDirectory));
117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
119e14391e94c850b8bd03680c23b38978db68687a8John ReckEntryCallbacks::EntryCallbacks(PassRefPtr<EntryCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, PassRefPtr<DOMFileSystemBase> fileSystem, const String& expectedPath, bool isDirectory)
120e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    : FileSystemCallbacksBase(errorCallback)
121e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_successCallback(successCallback)
122e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_fileSystem(fileSystem)
123e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_expectedPath(expectedPath)
124e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_isDirectory(isDirectory)
125e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
126e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
127e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
128e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid EntryCallbacks::didSucceed()
129e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
130e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_successCallback) {
131e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        if (m_isDirectory)
132e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            m_successCallback->handleEvent(DirectoryEntry::create(m_fileSystem, m_expectedPath).get());
133e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        else
134e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            m_successCallback->handleEvent(FileEntry::create(m_fileSystem, m_expectedPath).get());
135e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    }
136e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_successCallback.clear();
137e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
138e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
139e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block// EntriesCallbacks -----------------------------------------------------------
140e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
141e14391e94c850b8bd03680c23b38978db68687a8John ReckPassOwnPtr<EntriesCallbacks> EntriesCallbacks::create(PassRefPtr<EntriesCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, PassRefPtr<DirectoryReaderBase> directoryReader, const String& basePath)
142bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
143a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return adoptPtr(new EntriesCallbacks(successCallback, errorCallback, directoryReader, basePath));
144bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
145bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
146e14391e94c850b8bd03680c23b38978db68687a8John ReckEntriesCallbacks::EntriesCallbacks(PassRefPtr<EntriesCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, PassRefPtr<DirectoryReaderBase> directoryReader, const String& basePath)
147e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    : FileSystemCallbacksBase(errorCallback)
148e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_successCallback(successCallback)
149a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_directoryReader(directoryReader)
150e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_basePath(basePath)
15168513a70bcd92384395513322f1b801e7bf9c729Steve Block    , m_entries(EntryArray::create())
152e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
153a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(m_directoryReader);
154e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
155e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
156e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid EntriesCallbacks::didReadDirectoryEntry(const String& name, bool isDirectory)
157e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
158e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (isDirectory)
159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_entries->append(DirectoryEntry::create(m_directoryReader->filesystem(), DOMFilePath::append(m_basePath, name)));
160e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    else
161a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_entries->append(FileEntry::create(m_directoryReader->filesystem(), DOMFilePath::append(m_basePath, name)));
162e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
163e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
1645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid EntriesCallbacks::didReadDirectoryEntries(bool hasMore)
165e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
166a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_directoryReader->setHasMoreEntries(hasMore);
167a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_successCallback)
168e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_successCallback->handleEvent(m_entries.get());
169e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
170e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
171e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block// FileSystemCallbacks --------------------------------------------------------
172e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenPassOwnPtr<FileSystemCallbacks> FileSystemCallbacks::create(PassRefPtr<FileSystemCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, ScriptExecutionContext* scriptExecutionContext)
174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return adoptPtr(new FileSystemCallbacks(successCallback, errorCallback, scriptExecutionContext));
176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenFileSystemCallbacks::FileSystemCallbacks(PassRefPtr<FileSystemCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, ScriptExecutionContext* context)
179e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    : FileSystemCallbacksBase(errorCallback)
180e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_successCallback(successCallback)
1815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_scriptExecutionContext(context)
182e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
183e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
184e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
1855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid FileSystemCallbacks::didOpenFileSystem(const String& name, PassOwnPtr<AsyncFileSystem> asyncFileSystem)
186e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
1875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (m_successCallback) {
1885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        ASSERT(asyncFileSystem);
1895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_successCallback->handleEvent(DOMFileSystem::create(m_scriptExecutionContext.get(), name, asyncFileSystem.leakPtr()).get());
1905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_scriptExecutionContext.clear();
1915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
192e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_successCallback.clear();
193e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
194e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
19581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// ResolveURICallbacks --------------------------------------------------------
19681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
19781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochnamespace {
19881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
19981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass ErrorCallbackWrapper : public ErrorCallback {
20081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochpublic:
20181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static PassRefPtr<ErrorCallbackWrapper> create(PassRefPtr<EntryCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, PassRefPtr<DirectoryEntry> root, const String& filePath)
20281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
20381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return adoptRef(new ErrorCallbackWrapper(successCallback, errorCallback, root, filePath));
20481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
20581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
20681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual bool handleEvent(FileError* error)
20781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
20881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ASSERT(error);
20981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (error->code() == FileError::TYPE_MISMATCH_ERR)
21081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_root->getFile(m_filePath, 0, m_successCallback, m_errorCallback);
21181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else if (m_errorCallback)
21281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_errorCallback->handleEvent(error);
21381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return true;
21481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
21581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
21681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprivate:
21781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ErrorCallbackWrapper(PassRefPtr<EntryCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, PassRefPtr<DirectoryEntry> root, const String& filePath)
21881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        : m_successCallback(successCallback)
21981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        , m_errorCallback(errorCallback)
22081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        , m_root(root)
22181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        , m_filePath(filePath)
22281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
22381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        ASSERT(m_root);
22481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
22581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
22681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<EntryCallback> m_successCallback;
22781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<ErrorCallback> m_errorCallback;
22881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<DirectoryEntry> m_root;
22981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    String m_filePath;
23081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
23181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
23281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} // namespace
23381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
23481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPassOwnPtr<ResolveURICallbacks> ResolveURICallbacks::create(PassRefPtr<EntryCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, ScriptExecutionContext* scriptExecutionContext, const String& filePath)
23581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
23681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return adoptPtr(new ResolveURICallbacks(successCallback, errorCallback, scriptExecutionContext, filePath));
23781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
23881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
23981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochResolveURICallbacks::ResolveURICallbacks(PassRefPtr<EntryCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback, ScriptExecutionContext* context, const String& filePath)
24081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : FileSystemCallbacksBase(errorCallback)
24181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_successCallback(successCallback)
24281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_scriptExecutionContext(context)
24381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_filePath(filePath)
24481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
24581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
24681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
24781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid ResolveURICallbacks::didOpenFileSystem(const String& name, PassOwnPtr<AsyncFileSystem> asyncFileSystem)
24881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
24981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(asyncFileSystem);
25081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<DirectoryEntry> root = DOMFileSystem::create(m_scriptExecutionContext.get(), name, asyncFileSystem.leakPtr())->root();
25181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    root->getDirectory(m_filePath, 0, m_successCallback, ErrorCallbackWrapper::create(m_successCallback, m_errorCallback, root, m_filePath));
25281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
25381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
254e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block// MetadataCallbacks ----------------------------------------------------------
255e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
256bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenPassOwnPtr<MetadataCallbacks> MetadataCallbacks::create(PassRefPtr<MetadataCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
257bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
258bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return adoptPtr(new MetadataCallbacks(successCallback, errorCallback));
259bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
260bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
261e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockMetadataCallbacks::MetadataCallbacks(PassRefPtr<MetadataCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
262e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    : FileSystemCallbacksBase(errorCallback)
263e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_successCallback(successCallback)
264e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
265e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
266e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
267e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid MetadataCallbacks::didReadMetadata(const FileMetadata& metadata)
268e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
269e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_successCallback)
270e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_successCallback->handleEvent(Metadata::create(metadata.modificationTime).get());
271e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_successCallback.clear();
272e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
273e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
2744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang// FileWriterBaseCallbacks ----------------------------------------------------------
275bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
2764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangPassOwnPtr<FileWriterBaseCallbacks> FileWriterBaseCallbacks::create(PassRefPtr<FileWriterBase> fileWriter, PassRefPtr<FileWriterBaseCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
277bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
2784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return adoptPtr(new FileWriterBaseCallbacks(fileWriter, successCallback, errorCallback));
279bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
280bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
2814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangFileWriterBaseCallbacks::FileWriterBaseCallbacks(PassRefPtr<FileWriterBase> fileWriter, PassRefPtr<FileWriterBaseCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
282bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    : FileSystemCallbacksBase(errorCallback)
283bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    , m_fileWriter(fileWriter)
284bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    , m_successCallback(successCallback)
285bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
286bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
287bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
2884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid FileWriterBaseCallbacks::didCreateFileWriter(PassOwnPtr<AsyncFileWriter> asyncFileWriter, long long length)
289bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
290bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_fileWriter->initialize(asyncFileWriter, length);
291bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (m_successCallback)
292bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_successCallback->handleEvent(m_fileWriter.release().get());
293bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_successCallback.clear();
294bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
295bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
296e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block// VoidCallbacks --------------------------------------------------------------
297e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
298bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenPassOwnPtr<VoidCallbacks> VoidCallbacks::create(PassRefPtr<VoidCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
299bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
300bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return adoptPtr(new VoidCallbacks(successCallback, errorCallback));
301bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
302bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
303e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockVoidCallbacks::VoidCallbacks(PassRefPtr<VoidCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
304e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    : FileSystemCallbacksBase(errorCallback)
305e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_successCallback(successCallback)
306e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
307e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
308e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
309e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockvoid VoidCallbacks::didSucceed()
310e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
311e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_successCallback)
312e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_successCallback->handleEvent();
313e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    m_successCallback.clear();
314e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
315e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
316e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block} // namespace
317e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
318e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // ENABLE(FILE_SYSTEM)
319