/* * 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 "BlobItem.h" #include "FileSystem.h" #include "UUID.h" #include namespace WebCore { #if ENABLE(BLOB) static const double invalidModificationTime = 0; static double getFileSnapshotModificationTime(const String& path) { // FIXME: synchronized file call time_t modificationTime; if (getFileModificationTime(path, modificationTime)) return static_cast(modificationTime); return invalidModificationTime; } #endif // ENABLE(BLOB) // DataBlobItem ---------------------------------------------------------------- #if ENABLE(BLOB) PassRefPtr DataBlobItem::slice(long long start, long long length) { ASSERT(start >= 0 && length >= 0); ASSERT(static_cast(start) < size()); if (!start && size() <= static_cast(length)) return this; if (static_cast(start + length) > size()) length = size() - start; return DataRangeBlobItem::create(this, start, length); } #endif // FileBlobItem ---------------------------------------------------------------- PassRefPtr FileBlobItem::create(const String& path) { return adoptRef(static_cast(new FileBlobItem(path))); } FileBlobItem::FileBlobItem(const String& path) : m_path(path) , m_fileName(pathGetFileName(m_path)) { } #if ENABLE(DIRECTORY_UPLOAD) PassRefPtr FileBlobItem::create(const String& path, const String& relativePath) { return adoptRef(static_cast(new FileBlobItem(path, relativePath))); } FileBlobItem::FileBlobItem(const String& path, const String& relativePath) : m_path(path) , m_fileName(pathGetFileName(m_path)) , m_relativePath(relativePath) { } #endif unsigned long long FileBlobItem::size() const { // FIXME: synchronized file call long long size; if (!getFileSize(m_path, size)) return 0; return static_cast(size); } #if ENABLE(BLOB) PassRefPtr FileBlobItem::slice(long long start, long long length) { ASSERT(start >= 0 && length >= 0); long long fileSize = size(); ASSERT(start < fileSize); if (!start && fileSize <= length) return this; if (start + length > fileSize) length = fileSize - start; const FileRangeBlobItem* fileRangeItem = toFileRangeBlobItem(); double modificationTime = fileRangeItem ? fileRangeItem->snapshotModificationTime() : getFileSnapshotModificationTime(path()); return FileRangeBlobItem::create(path(), start, length, modificationTime); } #endif // ENABLE(BLOB) // StringBlobItem -------------------------------------------------------------- PassRefPtr StringBlobItem::create(const CString& text) { return adoptRef(static_cast(new StringBlobItem(text))); } StringBlobItem::StringBlobItem(const CString& text) : m_data(text) { } // ByteArrayBlobItem ---------------------------------------------------------- PassRefPtr ByteArrayBlobItem::create(const char* data, size_t size) { return adoptRef(static_cast(new ByteArrayBlobItem(data, size))); } ByteArrayBlobItem::ByteArrayBlobItem(const char* data, size_t size) { m_bytesArray.append(data, size); } #if ENABLE(BLOB) // DataRangeBlobItem ----------------------------------------------------------- PassRefPtr DataRangeBlobItem::create(PassRefPtr item, long long start, long long length) { return adoptRef(static_cast(new DataRangeBlobItem(item, start, length))); } DataRangeBlobItem::DataRangeBlobItem(PassRefPtr item, long long start, long long length) : m_length(length) { const DataRangeBlobItem* rangeItem = item->toDataRangeBlobItem(); if (rangeItem) { m_item = rangeItem->m_item; m_start = start + rangeItem->m_start; ASSERT(!m_item->toDataRangeBlobItem()); ASSERT(static_cast(m_start + m_length) <= m_item->size()); } else { m_item = item; m_start = start; } } const char* DataRangeBlobItem::data() const { return m_item->data() + m_start; } // FileRangeBlobItem ----------------------------------------------------------- PassRefPtr FileRangeBlobItem::create(const String& path, long long start, long long length, double snapshotModificationTime) { return adoptRef(static_cast(new FileRangeBlobItem(path, start, length, snapshotModificationTime))); } FileRangeBlobItem::FileRangeBlobItem(const String& path, long long start, long long length, double modificationTime) : FileBlobItem(path) , m_start(start) , m_length(length) , m_snapshotModificationTime(modificationTime) { m_uniqueName = "Blob" + createCanonicalUUIDString(); m_uniqueName.replace("-", ""); // For safty, remove '-' from the filename snce some servers may not like it. } #endif // ENABLE(BLOB) } // namespace WebCore