summaryrefslogtreecommitdiff
path: root/chromium/pdf/chunk_stream.h
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-11-20 15:06:40 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-11-22 11:48:58 +0000
commitdaa093eea7c773db06799a13bd7e4e2e2a9f8f14 (patch)
tree96cc5e7b9194c1b29eab927730bfa419e7111c25 /chromium/pdf/chunk_stream.h
parentbe59a35641616a4cf23c4a13fa0632624b021c1b (diff)
downloadqtwebengine-chromium-daa093eea7c773db06799a13bd7e4e2e2a9f8f14.tar.gz
BASELINE: Update Chromium to 63.0.3239.58
Change-Id: Ia93b322a00ba4dd4004f3bcf1254063ba90e1605 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/pdf/chunk_stream.h')
-rw-r--r--chromium/pdf/chunk_stream.h119
1 files changed, 86 insertions, 33 deletions
diff --git a/chromium/pdf/chunk_stream.h b/chromium/pdf/chunk_stream.h
index 762bc3925dd..b8b3c831e90 100644
--- a/chromium/pdf/chunk_stream.h
+++ b/chromium/pdf/chunk_stream.h
@@ -6,50 +6,103 @@
#define PDF_CHUNK_STREAM_H_
#include <stddef.h>
+#include <string.h>
-#include <map>
-#include <utility>
+#include <algorithm>
+#include <array>
+#include <memory>
#include <vector>
+#include "pdf/range_set.h"
+
namespace chrome_pdf {
// This class collects a chunks of data into one data stream. Client can check
// if data in certain range is available, and get missing chunks of data.
+template <uint32_t N>
class ChunkStream {
public:
- ChunkStream();
- ~ChunkStream();
-
- void Clear();
-
- void Preallocate(size_t stream_size);
- size_t GetSize() const;
-
- bool WriteData(size_t offset, void* buffer, size_t size);
- bool ReadData(size_t offset, size_t size, void* buffer) const;
-
- // Returns vector of pairs where first is an offset, second is a size.
- bool GetMissedRanges(size_t offset,
- size_t size,
- std::vector<std::pair<size_t, size_t>>* ranges) const;
- bool IsRangeAvailable(size_t offset, size_t size) const;
- size_t GetFirstMissingByte() const;
-
- // Finds the first byte of the missing byte interval that offset belongs to.
- size_t GetFirstMissingByteInInterval(size_t offset) const;
- // Returns the last byte of the missing byte interval that offset belongs to.
- size_t GetLastMissingByteInInterval(size_t offset) const;
+ static constexpr uint32_t kChunkSize = N;
+ using ChunkData = typename std::array<unsigned char, N>;
+
+ ChunkStream() {}
+ ~ChunkStream() {}
+
+ void SetChunkData(uint32_t chunk_index, std::unique_ptr<ChunkData> data) {
+ if (!data)
+ return;
+ if (chunk_index >= data_.size()) {
+ data_.resize(chunk_index + 1);
+ }
+ if (!data_[chunk_index]) {
+ ++filled_chunks_count_;
+ }
+ data_[chunk_index] = std::move(data);
+ filled_chunks_.Union(gfx::Range(chunk_index, chunk_index + 1));
+ }
+
+ bool ReadData(const gfx::Range& range, void* buffer) const {
+ if (!IsRangeAvailable(range)) {
+ return false;
+ }
+ unsigned char* data_buffer = static_cast<unsigned char*>(buffer);
+ uint32_t start = range.start();
+ while (start != range.end()) {
+ const uint32_t chunk_index = GetChunkIndex(start);
+ const uint32_t chunk_start = start % kChunkSize;
+ const uint32_t len =
+ std::min(kChunkSize - chunk_start, range.end() - start);
+ memcpy(data_buffer, data_[chunk_index]->data() + chunk_start, len);
+ data_buffer += len;
+ start += len;
+ }
+ return true;
+ }
+
+ uint32_t GetChunkIndex(uint32_t offset) const { return offset / kChunkSize; }
+
+ gfx::Range GetChunksRange(uint32_t offset, uint32_t size) const {
+ return gfx::Range(GetChunkIndex(offset),
+ GetChunkIndex(offset + size + kChunkSize - 1));
+ }
+
+ bool IsRangeAvailable(const gfx::Range& range) const {
+ if (!range.IsValid() || range.is_reversed() ||
+ (eof_pos_ > 0 && eof_pos_ < range.end()))
+ return false;
+ if (range.is_empty())
+ return true;
+ const gfx::Range chunks_range(GetChunkIndex(range.start()),
+ GetChunkIndex(range.end() + kChunkSize - 1));
+ return filled_chunks_.Contains(chunks_range);
+ }
+
+ void set_eof_pos(uint32_t eof_pos) { eof_pos_ = eof_pos; }
+ uint32_t eof_pos() const { return eof_pos_; }
+
+ const RangeSet& filled_chunks() const { return filled_chunks_; }
+
+ bool IsComplete() const {
+ return eof_pos_ > 0 && IsRangeAvailable(gfx::Range(0, eof_pos_));
+ }
+
+ void Clear() {
+ data_.clear();
+ eof_pos_ = 0;
+ filled_chunks_.Clear();
+ filled_chunks_count_ = 0;
+ }
+
+ uint32_t filled_chunks_count() const { return filled_chunks_count_; }
+ uint32_t total_chunks_count() const {
+ return GetChunkIndex(eof_pos_ + kChunkSize - 1);
+ }
private:
- std::map<size_t, size_t>::const_iterator GetStartChunk(size_t offset) const;
-
- std::vector<unsigned char> data_;
-
- // Key: offset of the chunk.
- // Value: size of the chunk.
- std::map<size_t, size_t> chunks_;
-
- size_t stream_size_;
+ std::vector<std::unique_ptr<ChunkData>> data_;
+ uint32_t eof_pos_ = 0;
+ RangeSet filled_chunks_;
+ uint32_t filled_chunks_count_ = 0;
};
}; // namespace chrome_pdf