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