1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Google Inc. All rights reserved. 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met: 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions of source code must retain the above copyright 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions in binary form must reproduce the above 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution. 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Neither the name of Google Inc. nor the names of its 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission. 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h" 32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3368513a70bcd92384395513322f1b801e7bf9c729Steve Block#if ENABLE(BLOB) || ENABLE(FILE_SYSTEM) 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FileStream.h" 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PlatformString.h" 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore { 40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 41f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickFileStream::FileStream() 42f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick : m_handle(invalidPlatformFileHandle) 4321939df44de1705786c545cd1bf519d47250322dBen Murdoch , m_bytesProcessed(0) 4421939df44de1705786c545cd1bf519d47250322dBen Murdoch , m_totalBytesToRead(0) 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockFileStream::~FileStream() 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(!isHandleValid(m_handle)); 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 53f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick// FIXME: To be removed when we switch to using BlobData. 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FileStream::start() 55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FileStream::stop() 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block close(); 61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 63f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricklong long FileStream::getSize(const String& path, double expectedModificationTime) 64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 65f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Check the modification time for the possible file change. 66f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick time_t modificationTime; 67f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!getFileModificationTime(path, modificationTime)) 68f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return -1; 69f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (expectedModificationTime) { 70f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (static_cast<time_t>(expectedModificationTime) != modificationTime) 71f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return -1; 72f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 73f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 74f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Now get the file size. 75f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick long long length; 76f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!getFileSize(path, length)) 77f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return -1; 78f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 79f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return length; 80f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 8121939df44de1705786c545cd1bf519d47250322dBen Murdoch 82e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockbool FileStream::openForRead(const String& path, long long offset, long long length) 83f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 8421939df44de1705786c545cd1bf519d47250322dBen Murdoch if (isHandleValid(m_handle)) 85e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return true; 86545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 87f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Open the file. 88f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick m_handle = openFile(path, OpenForRead); 89f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!isHandleValid(m_handle)) 90e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return false; 9121939df44de1705786c545cd1bf519d47250322dBen Murdoch 92f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Jump to the beginning position if the file has been sliced. 93f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (offset > 0) { 94f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (seekFile(m_handle, offset, SeekFromBeginning) < 0) 95e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return false; 9621939df44de1705786c545cd1bf519d47250322dBen Murdoch } 9721939df44de1705786c545cd1bf519d47250322dBen Murdoch 98f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick m_totalBytesToRead = length; 99f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick m_bytesProcessed = 0; 10021939df44de1705786c545cd1bf519d47250322dBen Murdoch 101e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return true; 102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 104e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockbool FileStream::openForWrite(const String&) 105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // FIXME: to be implemented. 107e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return false; 108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FileStream::close() 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 11221939df44de1705786c545cd1bf519d47250322dBen Murdoch if (isHandleValid(m_handle)) { 113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block closeFile(m_handle); 11421939df44de1705786c545cd1bf519d47250322dBen Murdoch m_handle = invalidPlatformFileHandle; 11521939df44de1705786c545cd1bf519d47250322dBen Murdoch } 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 118f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickint FileStream::read(char* buffer, int bufferSize) 119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 120f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!isHandleValid(m_handle)) 121f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return -1; 12221939df44de1705786c545cd1bf519d47250322dBen Murdoch 12321939df44de1705786c545cd1bf519d47250322dBen Murdoch long long remaining = m_totalBytesToRead - m_bytesProcessed; 124f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick int bytesToRead = (remaining < bufferSize) ? static_cast<int>(remaining) : bufferSize; 125f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick int bytesRead = 0; 126f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (bytesToRead > 0) 127f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick bytesRead = readFromFile(m_handle, buffer, bytesToRead); 128f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (bytesRead < 0) 129f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return -1; 130f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (bytesRead > 0) 131f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick m_bytesProcessed += bytesRead; 132f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 133f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return bytesRead; 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 136e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockint FileStream::write(const KURL&, long long, int) 137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // FIXME: to be implemented. 139f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return -1; 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 142e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockbool FileStream::truncate(long long) 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // FIXME: to be implemented. 145e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return false; 146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WebCore 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 15068513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif // ENABLE(BLOB) || ENABLE(FILE_SYSTEM) 151