1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2010 Google Inc. All rights reserved. 38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 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: 78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 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. 17d0825bca7fe65beaee391d30da42e937db621564Steve 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" 32d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "Blob.h" 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 34f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "BlobURL.h" 355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "File.h" 36f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "ThreadableBlobRegistry.h" 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore { 39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 4068513a70bcd92384395513322f1b801e7bf9c729Steve BlockBlob::Blob(PassOwnPtr<BlobData> blobData, long long size) 4168513a70bcd92384395513322f1b801e7bf9c729Steve Block : m_type(blobData->contentType()) 42f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick , m_size(size) 43f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ASSERT(blobData); 45f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 46f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Create a new internal URL and register it with the provided blob data. 4768513a70bcd92384395513322f1b801e7bf9c729Steve Block m_internalURL = BlobURL::createInternalURL(); 4868513a70bcd92384395513322f1b801e7bf9c729Steve Block ThreadableBlobRegistry::registerBlobURL(m_internalURL, blobData); 49f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 50f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 5168513a70bcd92384395513322f1b801e7bf9c729Steve BlockBlob::Blob(const KURL& srcURL, const String& type, long long size) 5268513a70bcd92384395513322f1b801e7bf9c729Steve Block : m_type(type) 53f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick , m_size(size) 54f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 55f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Create a new internal URL and register it with the same blob data as the source URL. 5668513a70bcd92384395513322f1b801e7bf9c729Steve Block m_internalURL = BlobURL::createInternalURL(); 5768513a70bcd92384395513322f1b801e7bf9c729Steve Block ThreadableBlobRegistry::registerBlobURL(m_internalURL, srcURL); 58f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 59f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 60f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickBlob::~Blob() 61f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 6268513a70bcd92384395513322f1b801e7bf9c729Steve Block ThreadableBlobRegistry::unregisterBlobURL(m_internalURL); 63f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 64f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 65dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(BLOB) 662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPassRefPtr<Blob> Blob::webkitSlice(long long start, long long end, const String& contentType) const 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // When we slice a file for the first time, we obtain a snapshot of the file by capturing its current size and modification time. 695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // The modification time will be used to verify if the file has been changed or not, when the underlying data are accessed. 705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen long long size; 715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen double modificationTime; 725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (isFile()) 735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // FIXME: This involves synchronous file operation. We need to figure out how to make it asynchronous. 745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen static_cast<const File*>(this)->captureSnapshot(size, modificationTime); 755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else { 765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen ASSERT(m_size != -1); 775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen size = m_size; 785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Convert the negative value that is used to select from the end. 812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (start < 0) 822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch start = start + size; 832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (end < 0) 842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch end = end + size; 852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Clamp the range if it exceeds the size limit. 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (start < 0) 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block start = 0; 892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (end < 0) 902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch end = 0; 915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (start >= size) { 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block start = 0; 932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch end = 0; 942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else if (end < start) 952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch end = start; 962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else if (end > size) 972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch end = size; 985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch long long length = end - start; 1005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen OwnPtr<BlobData> blobData = BlobData::create(); 1015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen blobData->setContentType(contentType); 1025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (isFile()) 1035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen blobData->appendFile(static_cast<const File*>(this)->path(), start, length, modificationTime); 1045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else 10568513a70bcd92384395513322f1b801e7bf9c729Steve Block blobData->appendBlob(m_internalURL, start, length); 1065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 10768513a70bcd92384395513322f1b801e7bf9c729Steve Block return Blob::create(blobData.release(), length); 108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 1095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WebCore 112