15ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen/*
25ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Copyright (C) 2010 Google Inc. All rights reserved.
35ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *
45ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * Redistribution and use in source and binary forms, with or without
55ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * modification, are permitted provided that the following conditions are
65ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * met:
75ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *
85ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *     * Redistributions of source code must retain the above copyright
95ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * notice, this list of conditions and the following disclaimer.
105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *     * Redistributions in binary form must reproduce the above
115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * copyright notice, this list of conditions and the following disclaimer
125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * in the documentation and/or other materials provided with the
135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * distribution.
145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *     * Neither the name of Google Inc. nor the names of its
155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * contributors may be used to endorse or promote products derived from
165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * this software without specific prior written permission.
175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen *
185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen */
305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "config.h"
315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "AsyncFileSystemChromium.h"
325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FILE_SYSTEM)
345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "AsyncFileSystemCallbacks.h"
36bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "AsyncFileWriterChromium.h"
37bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WebFileInfo.h"
385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "WebFileSystem.h"
395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "WebFileSystemCallbacksImpl.h"
40bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WebFileWriter.h"
415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "WebKit.h"
425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "WebKitClient.h"
435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include <wtf/text/CString.h>
455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsennamespace WebCore {
475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
48bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool AsyncFileSystem::isAvailable()
49bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
50bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return true;
51bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
52bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
532fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockAsyncFileSystemChromium::AsyncFileSystemChromium(AsyncFileSystem::Type type, const String& rootPath)
542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : AsyncFileSystem(type, rootPath)
555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_webFileSystem(WebKit::webKitClient()->fileSystem())
565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT(m_webFileSystem);
585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenAsyncFileSystemChromium::~AsyncFileSystemChromium()
615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
64a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid AsyncFileSystemChromium::move(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
66a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_webFileSystem->move(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks));
675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
69a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid AsyncFileSystemChromium::copy(const String& sourcePath, const String& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
71a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_webFileSystem->copy(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks));
725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid AsyncFileSystemChromium::remove(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_webFileSystem->remove(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid AsyncFileSystemChromium::removeRecursively(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
81a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_webFileSystem->removeRecursively(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
82a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
83a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid AsyncFileSystemChromium::readMetadata(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_webFileSystem->readMetadata(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid AsyncFileSystemChromium::createFile(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_webFileSystem->createFile(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks));
925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid AsyncFileSystemChromium::createDirectory(const String& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_webFileSystem->createDirectory(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks));
975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid AsyncFileSystemChromium::fileExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
1005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
1015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_webFileSystem->fileExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
1025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
1035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid AsyncFileSystemChromium::directoryExists(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
1055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
1065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_webFileSystem->directoryExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
1075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
1085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid AsyncFileSystemChromium::readDirectory(const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
1105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
1115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_webFileSystem->readDirectory(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
1125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
1135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
114bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenclass FileWriterHelperCallbacks : public WebKit::WebFileSystemCallbacks {
115bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenpublic:
116bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    FileWriterHelperCallbacks(AsyncFileWriterClient* client, const String& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks)
117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        : m_client(client)
118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        , m_path(path)
119bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        , m_webFileSystem(webFileSystem)
120bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        , m_callbacks(callbacks)
121bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
122bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
123bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
124bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didSucceed()
125bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
126bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        ASSERT_NOT_REACHED();
127bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this;
128bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
129bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didReadMetadata(const WebKit::WebFileInfo& info)
130bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
131bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        ASSERT(m_callbacks);
132bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (info.type != WebKit::WebFileInfo::TypeFile || info.length < 0)
133bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_callbacks->didFail(WebKit::WebFileErrorInvalidState);
134bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        else {
135bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            OwnPtr<AsyncFileWriterChromium> asyncFileWriterChromium = adoptPtr(new AsyncFileWriterChromium(m_client));
136bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            OwnPtr<WebKit::WebFileWriter> webFileWriter = adoptPtr(m_webFileSystem->createFileWriter(m_path, asyncFileWriterChromium.get()));
137bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            asyncFileWriterChromium->setWebFileWriter(webFileWriter.release());
138bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_callbacks->didCreateFileWriter(asyncFileWriterChromium.release(), info.length);
139bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
140bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this;
141bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
142bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
143bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didReadDirectory(const WebKit::WebVector<WebKit::WebFileSystemEntry>& entries, bool hasMore)
144bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
145bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        ASSERT_NOT_REACHED();
146bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this;
147bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
148bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didOpenFileSystem(const WebKit::WebString& name, const WebKit::WebString& rootPath)
149bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
150bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        ASSERT_NOT_REACHED();
151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this;
152bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
154bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    virtual void didFail(WebKit::WebFileError error)
155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    {
156bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        ASSERT(m_callbacks);
157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_callbacks->didFail(error);
158bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        delete this;
159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenprivate:
162bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    AsyncFileWriterClient* m_client;
163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    String m_path;
164bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    WebKit::WebFileSystem* m_webFileSystem;
165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks;
166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen};
167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
168bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid AsyncFileSystemChromium::createWriter(AsyncFileWriterClient* client, const String& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
169bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
170bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webFileSystem->readMetadata(path, new FileWriterHelperCallbacks(client, path, m_webFileSystem, callbacks));
171bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} // namespace WebCore
1745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
176