Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cpdf_seekablemultistream.cpp
Go to the documentation of this file.
1// Copyright 2017 The PDFium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#include "core/fpdfapi/parser/cpdf_seekablemultistream.h"
8
9#include <algorithm>
10#include <utility>
11
12#include "core/fpdfapi/parser/cpdf_stream.h"
13#include "core/fpdfapi/parser/cpdf_stream_acc.h"
14#include "core/fxcrt/fx_safe_types.h"
15#include "core/fxcrt/span_util.h"
16#include "core/fxcrt/stl_util.h"
17#include "third_party/base/notreached.h"
18
19CPDF_SeekableMultiStream::CPDF_SeekableMultiStream(
20 std::vector<RetainPtr<const CPDF_Stream>> streams) {
21 for (auto& pStream : streams) {
22 m_Data.push_back(pdfium::MakeRetain<CPDF_StreamAcc>(std::move(pStream)));
23 m_Data.back()->LoadAllDataFiltered();
24 }
25}
26
27CPDF_SeekableMultiStream::~CPDF_SeekableMultiStream() = default;
28
29FX_FILESIZE CPDF_SeekableMultiStream::GetSize() {
30 FX_SAFE_FILESIZE dwSize = 0;
31 for (const auto& acc : m_Data)
32 dwSize += acc->GetSize();
33 return dwSize.ValueOrDie();
34}
35
36bool CPDF_SeekableMultiStream::ReadBlockAtOffset(pdfium::span<uint8_t> buffer,
37 FX_FILESIZE offset) {
38 int32_t iCount = fxcrt::CollectionSize<int32_t>(m_Data);
39 int32_t index = 0;
40 while (index < iCount) {
41 const auto& acc = m_Data[index];
42 FX_FILESIZE dwSize = acc->GetSize();
43 if (offset < dwSize)
44 break;
45
46 offset -= dwSize;
47 index++;
48 }
49 while (index < iCount) {
50 auto acc_span = m_Data[index]->GetSpan();
51 size_t dwRead = std::min<size_t>(buffer.size(), acc_span.size() - offset);
52 fxcrt::spancpy(buffer, acc_span.subspan(offset, dwRead));
53 buffer = buffer.subspan(dwRead);
54 if (buffer.empty())
55 return true;
56
57 offset = 0;
58 index++;
59 }
60 return false;
61}
62
63size_t CPDF_SeekableMultiStream::ReadBlock(pdfium::span<uint8_t> buffer) {
64 NOTREACHED_NORETURN();
65}
66
67FX_FILESIZE CPDF_SeekableMultiStream::GetPosition() {
68 return 0;
69}
70
71bool CPDF_SeekableMultiStream::IsEOF() {
72 return false;
73}
74
75bool CPDF_SeekableMultiStream::Flush() {
76 NOTREACHED_NORETURN();
77}
78
79bool CPDF_SeekableMultiStream::WriteBlockAtOffset(
80 pdfium::span<const uint8_t> buffer,
81 FX_FILESIZE offset) {
82 NOTREACHED_NORETURN();
83}
bool ReadBlockAtOffset(pdfium::span< uint8_t > buffer, FX_FILESIZE offset) override
bool WriteBlockAtOffset(pdfium::span< const uint8_t > buffer, FX_FILESIZE offset) override
CPDF_SeekableMultiStream(std::vector< RetainPtr< const CPDF_Stream > > streams)
~CPDF_SeekableMultiStream() override
size_t ReadBlock(pdfium::span< uint8_t > buffer) override
#define FX_FILESIZE
Definition fx_types.h:19