Add IFX_WriteStream::WriteSpan(). Make it easier to call IFX_WriteStream::WriteBlock() when the data to write out is already in a span. Convert a few WriteBlock() calls to use WriteSpan() instead. Change-Id: I9b9dd0a48b24e2d695595d4f7d756fbe932acc3d Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98050 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp index 674f0ba..1329d28 100644 --- a/core/fpdfapi/parser/cpdf_stream.cpp +++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -199,7 +199,7 @@ data = encrypted_data; } - size_t size = data.size(); + const size_t size = data.size(); if (static_cast<size_t>(encoder.GetDict()->GetIntegerFor("Length")) != size) { encoder.CloneDict(); encoder.GetClonedDict()->SetNewFor<CPDF_Number>("Length", @@ -212,13 +212,10 @@ if (!archive->WriteString("stream\r\n")) return false; - if (!archive->WriteBlock(data.data(), size)) + if (!archive->WriteSpan(data)) return false; - if (!archive->WriteString("\r\nendstream")) - return false; - - return true; + return archive->WriteString("\r\nendstream"); } const uint8_t* CPDF_Stream::GetInMemoryRawData() const {
diff --git a/core/fxcrt/fx_stream.cpp b/core/fxcrt/fx_stream.cpp index e7c42ce..7a3e876 100644 --- a/core/fxcrt/fx_stream.cpp +++ b/core/fxcrt/fx_stream.cpp
@@ -46,6 +46,10 @@ } // namespace +bool IFX_WriteStream::WriteSpan(pdfium::span<const uint8_t> data) { + return WriteBlock(data.data(), data.size()); +} + bool IFX_WriteStream::WriteString(ByteStringView str) { return WriteBlock(str.unterminated_c_str(), str.GetLength()); }
diff --git a/core/fxcrt/fx_stream.h b/core/fxcrt/fx_stream.h index 0154b978..24dc597 100644 --- a/core/fxcrt/fx_stream.h +++ b/core/fxcrt/fx_stream.h
@@ -13,6 +13,7 @@ #include "core/fxcrt/bytestring.h" #include "core/fxcrt/fx_types.h" #include "core/fxcrt/retain_ptr.h" +#include "third_party/base/span.h" class IFX_WriteStream { public: @@ -20,6 +21,7 @@ // only time when `pData` can be null. virtual bool WriteBlock(const void* pData, size_t size) = 0; + bool WriteSpan(pdfium::span<const uint8_t> data); bool WriteString(ByteStringView str); bool WriteByte(uint8_t byte); bool WriteDWord(uint32_t i);
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp index 0143f6c..0d048d3 100644 --- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp +++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -505,8 +505,7 @@ } auto pAcc = pdfium::MakeRetain<CPDF_StreamAcc>(std::move(pStream)); pAcc->LoadAllDataFiltered(); - pdfium::span<const uint8_t> span = pAcc->GetSpan(); - fileWrite->WriteBlock(span.data(), span.size()); + fileWrite->WriteSpan(pAcc->GetSpan()); } } fileWrite->Flush();