summaryrefslogtreecommitdiffstats
path: root/WebCore/html/Blob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/html/Blob.cpp')
-rw-r--r--WebCore/html/Blob.cpp91
1 files changed, 34 insertions, 57 deletions
diff --git a/WebCore/html/Blob.cpp b/WebCore/html/Blob.cpp
index 83bbdc0..0546f1c 100644
--- a/WebCore/html/Blob.cpp
+++ b/WebCore/html/Blob.cpp
@@ -31,88 +31,65 @@
#include "config.h"
#include "Blob.h"
+#include "BlobItem.h"
#include "FileSystem.h"
namespace WebCore {
-#if ENABLE(BLOB_SLICE)
-const int Blob::toEndOfFile = -1;
-const double Blob::doNotCheckFileChange = 0;
-#endif
-
Blob::Blob(const String& path)
- : m_path(path)
-#if ENABLE(BLOB_SLICE)
- , m_start(0)
- , m_length(toEndOfFile)
- , m_snapshotCaptured(false)
- , m_snapshotSize(0)
- , m_snapshotModificationTime(doNotCheckFileChange)
-#endif
-{
-}
-
-#if ENABLE(BLOB_SLICE)
-Blob::Blob(const String& path, long long start, long long length, long long snapshotSize, double snapshotModificationTime)
- : m_path(path)
- , m_start(start)
- , m_length(length)
- , m_snapshotCaptured(true)
- , m_snapshotSize(snapshotSize)
- , m_snapshotModificationTime(snapshotModificationTime)
{
- ASSERT(start >= 0 && length >= 0 && start + length <= snapshotSize && snapshotModificationTime);
+ // Note: this doesn't initialize the type unlike File(path).
+ append(FileBlobItem::create(path));
}
-#endif
unsigned long long Blob::size() const
{
// FIXME: JavaScript cannot represent sizes as large as unsigned long long, we need to
// come up with an exception to throw if file size is not represetable.
-#if ENABLE(BLOB_SLICE)
- if (m_snapshotCaptured)
- return m_length;
-#endif
- long long size;
- if (!getFileSize(m_path, size))
- return 0;
- return static_cast<unsigned long long>(size);
+ unsigned long long size = 0;
+ for (size_t i = 0; i < m_items.size(); ++i)
+ size += m_items[i]->size();
+ return size;
+}
+
+const String& Blob::path() const
+{
+ ASSERT(m_items.size() == 1 && m_items[0]->toFileBlobItem());
+ return m_items[0]->toFileBlobItem()->path();
+}
+
+void Blob::append(PassRefPtr<BlobItem> item)
+{
+ m_items.append(item);
}
#if ENABLE(BLOB_SLICE)
PassRefPtr<Blob> Blob::slice(long long start, long long length) const
{
- // When we slice a file for the first time, we obtain a snapshot of the file by capturing its current size and modification time.
- // The modification time will be used to verify if the file has been changed or not, when the underlying data are accessed.
- long long snapshotSize;
- double snapshotModificationTime;
- if (m_snapshotCaptured) {
- snapshotSize = m_snapshotSize;
- snapshotModificationTime = m_snapshotModificationTime;
- } else {
- // If we fail to retrieve the size or modification time, probably due to that the file has been deleted, an empty blob will be returned.
- time_t modificationTime;
- if (!getFileSize(m_path, snapshotSize) || !getFileModificationTime(m_path, modificationTime)) {
- snapshotSize = 0;
- snapshotModificationTime = 0;
- } else
- snapshotModificationTime = modificationTime;
- }
-
- // Clamp the range if it exceeds the size limit.
if (start < 0)
start = 0;
if (length < 0)
length = 0;
- if (start > snapshotSize) {
+ // Clamp the range if it exceeds the size limit.
+ unsigned long long totalSize = size();
+ if (static_cast<unsigned long long>(start) > totalSize) {
start = 0;
length = 0;
- } else if (start + length > snapshotSize)
- length = snapshotSize - start;
+ } else if (static_cast<unsigned long long>(start + length) > totalSize)
+ length = totalSize - start;
- return adoptRef(new Blob(m_path, m_start + start, length, snapshotSize, snapshotModificationTime));
+ size_t i = 0;
+ RefPtr<Blob> blob = Blob::create();
+ for (; i < m_items.size() && static_cast<unsigned long long>(start) >= m_items[i]->size(); ++i)
+ start -= m_items[i]->size();
+ for (; length > 0 && i < m_items.size(); ++i) {
+ blob->m_items.append(m_items[i]->slice(start, length));
+ length -= blob->m_items.last()->size();
+ start = 0;
+ }
+ return blob.release();
}
-#endif
+#endif // ENABLE(BLOB_SLICE)
} // namespace WebCore