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
315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "config.h"
325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "DOMFileSystem.h"
335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FILE_SYSTEM)
355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "AsyncFileSystem.h"
375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "DOMFilePath.h"
385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "DirectoryEntry.h"
395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "ErrorCallback.h"
40a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "File.h"
41bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "FileEntry.h"
422bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "FileMetadata.h"
435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "FileSystemCallbacks.h"
44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "FileWriter.h"
454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "FileWriterBaseCallback.h"
46bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "FileWriterCallback.h"
475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "MetadataCallback.h"
485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "ScriptExecutionContext.h"
495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include <wtf/OwnPtr.h>
505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsennamespace WebCore {
525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenDOMFileSystem::DOMFileSystem(ScriptExecutionContext* context, const String& name, PassOwnPtr<AsyncFileSystem> asyncFileSystem)
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : DOMFileSystemBase(context, name, asyncFileSystem)
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , ActiveDOMObject(context, this)
565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<DirectoryEntry> DOMFileSystem::root()
605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return DirectoryEntry::create(this, DOMFilePath::root);
625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid DOMFileSystem::stop()
655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_asyncFileSystem->stop();
675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenbool DOMFileSystem::hasPendingActivity() const
705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return m_asyncFileSystem->hasPendingActivity();
725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid DOMFileSystem::contextDestroyed()
755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_asyncFileSystem->stop();
775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ActiveDOMObject::contextDestroyed();
785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangnamespace {
814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangclass ConvertToFileWriterCallback : public FileWriterBaseCallback {
834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangpublic:
844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    static PassRefPtr<ConvertToFileWriterCallback> create(PassRefPtr<FileWriterCallback> callback)
854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    {
864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return adoptRef(new ConvertToFileWriterCallback(callback));
874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bool handleEvent(FileWriterBase* fileWriterBase)
904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    {
914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return m_callback->handleEvent(static_cast<FileWriter*>(fileWriterBase));
924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangprivate:
944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ConvertToFileWriterCallback(PassRefPtr<FileWriterCallback> callback)
954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        : m_callback(callback)
964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    {
974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    RefPtr<FileWriterCallback> m_callback;
994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang};
1004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
1024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
103a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid DOMFileSystem::createWriter(const FileEntry* fileEntry, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
105a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(fileEntry);
106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
107a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath());
108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    RefPtr<FileWriter> fileWriter = FileWriter::create(scriptExecutionContext());
1104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    RefPtr<FileWriterBaseCallback> conversionCallback = ConvertToFileWriterCallback::create(successCallback);
1114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    OwnPtr<FileWriterBaseCallbacks> callbacks = FileWriterBaseCallbacks::create(fileWriter, conversionCallback, errorCallback);
112bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_asyncFileSystem->createWriter(fileWriter.get(), platformPath, callbacks.release());
113bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
114bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1152bde8e466a4451c7319e3a072d118917957d6554Steve Blocknamespace {
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block
1172bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass GetPathCallback : public FileSystemCallbacksBase {
1182bde8e466a4451c7319e3a072d118917957d6554Steve Blockpublic:
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block    static PassOwnPtr<GetPathCallback> create(PassRefPtr<DOMFileSystem> filesystem, const String& path, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
1202bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
1212bde8e466a4451c7319e3a072d118917957d6554Steve Block        return adoptPtr(new GetPathCallback(filesystem, path, successCallback, errorCallback));
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1232bde8e466a4451c7319e3a072d118917957d6554Steve Block
1242bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual void didReadMetadata(const FileMetadata& metadata)
1252bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
1262bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!metadata.platformPath.isEmpty())
1272bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_path = metadata.platformPath;
1282bde8e466a4451c7319e3a072d118917957d6554Steve Block
1292bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_filesystem->scheduleCallback(m_successCallback.release(), File::create(m_path));
1302bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1312bde8e466a4451c7319e3a072d118917957d6554Steve Block
1322bde8e466a4451c7319e3a072d118917957d6554Steve Blockprivate:
1332bde8e466a4451c7319e3a072d118917957d6554Steve Block    GetPathCallback(PassRefPtr<DOMFileSystem> filesystem, const String& path, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
1342bde8e466a4451c7319e3a072d118917957d6554Steve Block        : FileSystemCallbacksBase(errorCallback)
1352bde8e466a4451c7319e3a072d118917957d6554Steve Block        , m_filesystem(filesystem)
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block        , m_path(path)
1372bde8e466a4451c7319e3a072d118917957d6554Steve Block        , m_successCallback(successCallback)
1382bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
1392bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1402bde8e466a4451c7319e3a072d118917957d6554Steve Block
1412bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<DOMFileSystem> m_filesystem;
1422bde8e466a4451c7319e3a072d118917957d6554Steve Block    String m_path;
1432bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<FileCallback> m_successCallback;
1442bde8e466a4451c7319e3a072d118917957d6554Steve Block};
1452bde8e466a4451c7319e3a072d118917957d6554Steve Block
1462bde8e466a4451c7319e3a072d118917957d6554Steve Block} // namespace
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block
1482bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid DOMFileSystem::createFile(const FileEntry* fileEntry, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
1495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath());
1512bde8e466a4451c7319e3a072d118917957d6554Steve Block
1522bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_asyncFileSystem->readMetadata(platformPath, GetPathCallback::create(this, platformPath, successCallback, errorCallback));
1535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
1545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1552bde8e466a4451c7319e3a072d118917957d6554Steve Block} // namespace WebCore
1565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif // ENABLE(FILE_SYSTEM)
158