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