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();