/* * Copyright (C) 2010 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "FileSystemCallbacks.h" #if ENABLE(FILE_SYSTEM) #include "AsyncFileSystem.h" #include "DOMFilePath.h" #include "DOMFileSystem.h" #include "DirectoryEntry.h" #include "EntriesCallback.h" #include "EntryArray.h" #include "EntryCallback.h" #include "ErrorCallback.h" #include "ExceptionCode.h" #include "FileEntry.h" #include "FileError.h" #include "FileSystemCallback.h" #include "Metadata.h" #include "MetadataCallback.h" #include "ScriptExecutionContext.h" #include "VoidCallback.h" namespace WebCore { FileSystemCallbacksBase::FileSystemCallbacksBase(PassRefPtr errorCallback) : m_errorCallback(errorCallback) { } FileSystemCallbacksBase::~FileSystemCallbacksBase() { } void FileSystemCallbacksBase::didSucceed() { // Each subclass must implement an appropriate one. ASSERT_NOT_REACHED(); } void FileSystemCallbacksBase::didOpenFileSystem(const String&, PassOwnPtr) { // Each subclass must implement an appropriate one. ASSERT_NOT_REACHED(); } void FileSystemCallbacksBase::didReadMetadata(double) { // Each subclass must implement an appropriate one. ASSERT_NOT_REACHED(); } void FileSystemCallbacksBase::didReadDirectoryEntries(bool) { // Each subclass must implement an appropriate one. ASSERT_NOT_REACHED(); } void FileSystemCallbacksBase::didReadDirectoryEntry(const String&, bool) { // Each subclass must implement an appropriate one. ASSERT_NOT_REACHED(); } void FileSystemCallbacksBase::didFail(int code) { if (m_errorCallback) { m_errorCallback->handleEvent(FileError::create(code).get()); m_errorCallback.clear(); } } // EntryCallbacks ------------------------------------------------------------- EntryCallbacks::EntryCallbacks(PassRefPtr successCallback, PassRefPtr errorCallback, DOMFileSystem* fileSystem, const String& expectedPath, bool isDirectory) : FileSystemCallbacksBase(errorCallback) , m_successCallback(successCallback) , m_fileSystem(fileSystem) , m_expectedPath(expectedPath) , m_isDirectory(isDirectory) { } void EntryCallbacks::didSucceed() { if (m_successCallback) { if (m_isDirectory) m_successCallback->handleEvent(DirectoryEntry::create(m_fileSystem, m_expectedPath).get()); else m_successCallback->handleEvent(FileEntry::create(m_fileSystem, m_expectedPath).get()); } m_successCallback.clear(); } // EntriesCallbacks ----------------------------------------------------------- EntriesCallbacks::EntriesCallbacks(PassRefPtr successCallback, PassRefPtr errorCallback, DOMFileSystem* fileSystem, const String& basePath) : FileSystemCallbacksBase(errorCallback) , m_successCallback(successCallback) , m_fileSystem(fileSystem) , m_basePath(basePath) { } void EntriesCallbacks::didReadDirectoryEntry(const String& name, bool isDirectory) { if (!m_entries) m_entries = EntryArray::create(); if (isDirectory) m_entries->append(DirectoryEntry::create(m_fileSystem, DOMFilePath::append(m_basePath, name))); else m_entries->append(FileEntry::create(m_fileSystem, DOMFilePath::append(m_basePath, name))); } void EntriesCallbacks::didReadDirectoryEntries(bool hasMore) { ASSERT(m_entries); if (m_successCallback) { m_successCallback->handleEvent(m_entries.get()); m_entries->clear(); if (!hasMore) { // If there're no more entries, call back once more with an empty array. m_successCallback->handleEvent(m_entries.get()); m_successCallback.clear(); } } } // FileSystemCallbacks -------------------------------------------------------- FileSystemCallbacks::FileSystemCallbacks(PassRefPtr successCallback, PassRefPtr errorCallback, ScriptExecutionContext* context) : FileSystemCallbacksBase(errorCallback) , m_successCallback(successCallback) , m_scriptExecutionContext(context) { } void FileSystemCallbacks::didOpenFileSystem(const String& name, PassOwnPtr asyncFileSystem) { if (m_successCallback) { ASSERT(asyncFileSystem); m_successCallback->handleEvent(DOMFileSystem::create(m_scriptExecutionContext.get(), name, asyncFileSystem.leakPtr()).get()); m_scriptExecutionContext.clear(); } m_successCallback.clear(); } // MetadataCallbacks ---------------------------------------------------------- MetadataCallbacks::MetadataCallbacks(PassRefPtr successCallback, PassRefPtr errorCallback) : FileSystemCallbacksBase(errorCallback) , m_successCallback(successCallback) { } void MetadataCallbacks::didReadMetadata(double modificationTime) { if (m_successCallback) m_successCallback->handleEvent(Metadata::create(modificationTime).get()); m_successCallback.clear(); } // VoidCallbacks -------------------------------------------------------------- VoidCallbacks::VoidCallbacks(PassRefPtr successCallback, PassRefPtr errorCallback) : FileSystemCallbacksBase(errorCallback) , m_successCallback(successCallback) { } void VoidCallbacks::didSucceed() { if (m_successCallback) m_successCallback->handleEvent(); m_successCallback.clear(); } } // namespace #endif // ENABLE(FILE_SYSTEM)