1/* 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#include "config.h" 32#include "DOMFileSystem.h" 33 34#if ENABLE(FILE_SYSTEM) 35 36#include "AsyncFileSystem.h" 37#include "DOMFilePath.h" 38#include "DirectoryEntry.h" 39#include "ErrorCallback.h" 40#include "File.h" 41#include "FileEntry.h" 42#include "FileMetadata.h" 43#include "FileSystemCallbacks.h" 44#include "FileWriter.h" 45#include "FileWriterBaseCallback.h" 46#include "FileWriterCallback.h" 47#include "MetadataCallback.h" 48#include "ScriptExecutionContext.h" 49#include <wtf/OwnPtr.h> 50 51namespace WebCore { 52 53DOMFileSystem::DOMFileSystem(ScriptExecutionContext* context, const String& name, PassOwnPtr<AsyncFileSystem> asyncFileSystem) 54 : DOMFileSystemBase(context, name, asyncFileSystem) 55 , ActiveDOMObject(context, this) 56{ 57} 58 59PassRefPtr<DirectoryEntry> DOMFileSystem::root() 60{ 61 return DirectoryEntry::create(this, DOMFilePath::root); 62} 63 64void DOMFileSystem::stop() 65{ 66 m_asyncFileSystem->stop(); 67} 68 69bool DOMFileSystem::hasPendingActivity() const 70{ 71 return m_asyncFileSystem->hasPendingActivity(); 72} 73 74void DOMFileSystem::contextDestroyed() 75{ 76 m_asyncFileSystem->stop(); 77 ActiveDOMObject::contextDestroyed(); 78} 79 80namespace { 81 82class ConvertToFileWriterCallback : public FileWriterBaseCallback { 83public: 84 static PassRefPtr<ConvertToFileWriterCallback> create(PassRefPtr<FileWriterCallback> callback) 85 { 86 return adoptRef(new ConvertToFileWriterCallback(callback)); 87 } 88 89 bool handleEvent(FileWriterBase* fileWriterBase) 90 { 91 return m_callback->handleEvent(static_cast<FileWriter*>(fileWriterBase)); 92 } 93private: 94 ConvertToFileWriterCallback(PassRefPtr<FileWriterCallback> callback) 95 : m_callback(callback) 96 { 97 } 98 RefPtr<FileWriterCallback> m_callback; 99}; 100 101} 102 103void DOMFileSystem::createWriter(const FileEntry* fileEntry, PassRefPtr<FileWriterCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 104{ 105 ASSERT(fileEntry); 106 107 String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath()); 108 109 RefPtr<FileWriter> fileWriter = FileWriter::create(scriptExecutionContext()); 110 RefPtr<FileWriterBaseCallback> conversionCallback = ConvertToFileWriterCallback::create(successCallback); 111 OwnPtr<FileWriterBaseCallbacks> callbacks = FileWriterBaseCallbacks::create(fileWriter, conversionCallback, errorCallback); 112 m_asyncFileSystem->createWriter(fileWriter.get(), platformPath, callbacks.release()); 113} 114 115namespace { 116 117class GetPathCallback : public FileSystemCallbacksBase { 118public: 119 static PassOwnPtr<GetPathCallback> create(PassRefPtr<DOMFileSystem> filesystem, const String& path, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 120 { 121 return adoptPtr(new GetPathCallback(filesystem, path, successCallback, errorCallback)); 122 } 123 124 virtual void didReadMetadata(const FileMetadata& metadata) 125 { 126 if (!metadata.platformPath.isEmpty()) 127 m_path = metadata.platformPath; 128 129 m_filesystem->scheduleCallback(m_successCallback.release(), File::create(m_path)); 130 } 131 132private: 133 GetPathCallback(PassRefPtr<DOMFileSystem> filesystem, const String& path, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 134 : FileSystemCallbacksBase(errorCallback) 135 , m_filesystem(filesystem) 136 , m_path(path) 137 , m_successCallback(successCallback) 138 { 139 } 140 141 RefPtr<DOMFileSystem> m_filesystem; 142 String m_path; 143 RefPtr<FileCallback> m_successCallback; 144}; 145 146} // namespace 147 148void DOMFileSystem::createFile(const FileEntry* fileEntry, PassRefPtr<FileCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 149{ 150 String platformPath = m_asyncFileSystem->virtualToPlatformPath(fileEntry->fullPath()); 151 152 m_asyncFileSystem->readMetadata(platformPath, GetPathCallback::create(this, platformPath, successCallback, errorCallback)); 153} 154 155} // namespace WebCore 156 157#endif // ENABLE(FILE_SYSTEM) 158