Move CFX_SeekableMultiStream to CPDF_SeekableMultiStream.

Although it implements a fxcrt interface, it does so via fpdfapi/parser
objects, so it must live above fxcrt, since fxcrt shouldn't be allowed
to include fpdfapi. Make it a part of fpdfapi/parser itself under XFA
builds. In turn, this gets rid of a small component
":seekablemultistream" in the middle of the module dependency chart.

Change-Id: Iff47c8329e142359ba921653056470244b911f32
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55610
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/BUILD.gn b/core/fpdfapi/parser/BUILD.gn
index 6bfac18..af141a8 100644
--- a/core/fpdfapi/parser/BUILD.gn
+++ b/core/fpdfapi/parser/BUILD.gn
@@ -86,6 +86,12 @@
   allow_circular_includes_from = []
   visibility = [ "../../../*" ]
 
+  if (pdf_enable_xfa) {
+    sources += [
+      "cpdf_seekablemultistream.cpp",
+      "cpdf_seekablemultistream.h",
+    ]
+  }
   if (pdf_use_skia || pdf_use_skia_paths) {
     allow_circular_includes_from += [ "../../fxge" ]
   }
@@ -117,6 +123,9 @@
   ]
   pdfium_root_dir = "../../../"
 
+  if (pdf_enable_xfa) {
+    sources += [ "cpdf_seekablemultistream_unittest.cpp" ]
+  }
   if (is_clang) {
     # Suppress no override warning for overridden functions.
     cflags = [ "-Wno-inconsistent-missing-override" ]
diff --git a/core/fxcrt/cfx_seekablemultistream.cpp b/core/fpdfapi/parser/cpdf_seekablemultistream.cpp
similarity index 70%
rename from core/fxcrt/cfx_seekablemultistream.cpp
rename to core/fpdfapi/parser/cpdf_seekablemultistream.cpp
index f600854..d2a0417 100644
--- a/core/fxcrt/cfx_seekablemultistream.cpp
+++ b/core/fpdfapi/parser/cpdf_seekablemultistream.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fxcrt/cfx_seekablemultistream.h"
+#include "core/fpdfapi/parser/cpdf_seekablemultistream.h"
 
 #include <algorithm>
 
@@ -12,7 +12,7 @@
 #include "third_party/base/logging.h"
 #include "third_party/base/stl_util.h"
 
-CFX_SeekableMultiStream::CFX_SeekableMultiStream(
+CPDF_SeekableMultiStream::CPDF_SeekableMultiStream(
     const std::vector<const CPDF_Stream*>& streams) {
   for (const CPDF_Stream* pStream : streams) {
     m_Data.push_back(pdfium::MakeRetain<CPDF_StreamAcc>(pStream));
@@ -20,18 +20,18 @@
   }
 }
 
-CFX_SeekableMultiStream::~CFX_SeekableMultiStream() {}
+CPDF_SeekableMultiStream::~CPDF_SeekableMultiStream() {}
 
-FX_FILESIZE CFX_SeekableMultiStream::GetSize() {
+FX_FILESIZE CPDF_SeekableMultiStream::GetSize() {
   uint32_t dwSize = 0;
   for (const auto& acc : m_Data)
     dwSize += acc->GetSize();
   return dwSize;
 }
 
-bool CFX_SeekableMultiStream::ReadBlockAtOffset(void* buffer,
-                                                FX_FILESIZE offset,
-                                                size_t size) {
+bool CPDF_SeekableMultiStream::ReadBlockAtOffset(void* buffer,
+                                                 FX_FILESIZE offset,
+                                                 size_t size) {
   int32_t iCount = pdfium::CollectionSize<int32_t>(m_Data);
   int32_t index = 0;
   while (index < iCount) {
@@ -59,27 +59,27 @@
   return false;
 }
 
-size_t CFX_SeekableMultiStream::ReadBlock(void* buffer, size_t size) {
+size_t CPDF_SeekableMultiStream::ReadBlock(void* buffer, size_t size) {
   NOTREACHED();
   return 0;
 }
 
-FX_FILESIZE CFX_SeekableMultiStream::GetPosition() {
+FX_FILESIZE CPDF_SeekableMultiStream::GetPosition() {
   return 0;
 }
 
-bool CFX_SeekableMultiStream::IsEOF() {
+bool CPDF_SeekableMultiStream::IsEOF() {
   return false;
 }
 
-bool CFX_SeekableMultiStream::Flush() {
+bool CPDF_SeekableMultiStream::Flush() {
   NOTREACHED();
   return false;
 }
 
-bool CFX_SeekableMultiStream::WriteBlockAtOffset(const void* pData,
-                                                 FX_FILESIZE offset,
-                                                 size_t size) {
+bool CPDF_SeekableMultiStream::WriteBlockAtOffset(const void* pData,
+                                                  FX_FILESIZE offset,
+                                                  size_t size) {
   NOTREACHED();
   return false;
 }
diff --git a/core/fxcrt/cfx_seekablemultistream.h b/core/fpdfapi/parser/cpdf_seekablemultistream.h
similarity index 75%
rename from core/fxcrt/cfx_seekablemultistream.h
rename to core/fpdfapi/parser/cpdf_seekablemultistream.h
index 2f8b874..30a8479 100644
--- a/core/fxcrt/cfx_seekablemultistream.h
+++ b/core/fpdfapi/parser/cpdf_seekablemultistream.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef CORE_FXCRT_CFX_SEEKABLEMULTISTREAM_H_
-#define CORE_FXCRT_CFX_SEEKABLEMULTISTREAM_H_
+#ifndef CORE_FPDFAPI_PARSER_CPDF_SEEKABLEMULTISTREAM_H_
+#define CORE_FPDFAPI_PARSER_CPDF_SEEKABLEMULTISTREAM_H_
 
 #include <vector>
 
@@ -15,11 +15,11 @@
 class CPDF_Stream;
 class CPDF_StreamAcc;
 
-class CFX_SeekableMultiStream final : public IFX_SeekableStream {
+class CPDF_SeekableMultiStream final : public IFX_SeekableStream {
  public:
-  explicit CFX_SeekableMultiStream(
+  explicit CPDF_SeekableMultiStream(
       const std::vector<const CPDF_Stream*>& streams);
-  ~CFX_SeekableMultiStream() override;
+  ~CPDF_SeekableMultiStream() override;
 
   // IFX_SeekableReadStream
   FX_FILESIZE GetPosition() override;
@@ -38,4 +38,4 @@
   std::vector<RetainPtr<CPDF_StreamAcc>> m_Data;
 };
 
-#endif  // CORE_FXCRT_CFX_SEEKABLEMULTISTREAM_H_
+#endif  // CORE_FPDFAPI_PARSER_CPDF_SEEKABLEMULTISTREAM_H_
diff --git a/core/fxcrt/cfx_seekablemultistream_unittest.cpp b/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp
similarity index 89%
rename from core/fxcrt/cfx_seekablemultistream_unittest.cpp
rename to core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp
index ad6fa2f..4f806fa 100644
--- a/core/fxcrt/cfx_seekablemultistream_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/fxcrt/cfx_seekablemultistream.h"
+#include "core/fpdfapi/parser/cpdf_seekablemultistream.h"
 
 #include <memory>
 #include <vector>
@@ -12,9 +12,9 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/base/ptr_util.h"
 
-TEST(CFX_SeekableMultiStreamTest, NoStreams) {
+TEST(CPDFSeekableMultiStreamTest, NoStreams) {
   std::vector<const CPDF_Stream*> streams;
-  auto fileread = pdfium::MakeRetain<CFX_SeekableMultiStream>(streams);
+  auto fileread = pdfium::MakeRetain<CPDF_SeekableMultiStream>(streams);
 
   uint8_t output_buffer[16];
   memset(output_buffer, 0xbd, sizeof(output_buffer));
@@ -26,7 +26,7 @@
   std::vector<const CPDF_Stream*> streams;
   auto stream1 = pdfium::MakeRetain<CPDF_Stream>();
   streams.push_back(stream1.Get());
-  auto fileread = pdfium::MakeRetain<CFX_SeekableMultiStream>(streams);
+  auto fileread = pdfium::MakeRetain<CPDF_SeekableMultiStream>(streams);
 
   uint8_t output_buffer[16];
   memset(output_buffer, 0xbd, sizeof(output_buffer));
@@ -51,7 +51,7 @@
   streams.push_back(stream1.Get());
   streams.push_back(stream2.Get());
   streams.push_back(stream3.Get());
-  auto fileread = pdfium::MakeRetain<CFX_SeekableMultiStream>(streams);
+  auto fileread = pdfium::MakeRetain<CPDF_SeekableMultiStream>(streams);
 
   uint8_t output_buffer[16];
   memset(output_buffer, 0xbd, sizeof(output_buffer));
diff --git a/core/fxcrt/BUILD.gn b/core/fxcrt/BUILD.gn
index e4b1154..0b31e16 100644
--- a/core/fxcrt/BUILD.gn
+++ b/core/fxcrt/BUILD.gn
@@ -126,21 +126,6 @@
   }
 }
 
-if (pdf_enable_xfa) {
-  jumbo_source_set("seekablemultistream") {
-    sources = [
-      "cfx_seekablemultistream.cpp",
-      "cfx_seekablemultistream.h",
-    ]
-    deps = [
-      ":fxcrt",
-      "../fpdfapi/parser",
-    ]
-    configs += [ "../../:pdfium_core_config" ]
-    visibility = [ "../../*" ]
-  }
-}
-
 pdfium_unittest_source_set("unittests") {
   sources = [
     "autorestorer_unittest.cpp",
@@ -181,13 +166,11 @@
   if (pdf_enable_xfa) {
     sources += [
       "cfx_memorystream_unittest.cpp",
-      "cfx_seekablemultistream_unittest.cpp",
       "css/cfx_cssdeclaration_unittest.cpp",
       "css/cfx_cssstylesheet_unittest.cpp",
       "css/cfx_cssvaluelistparser_unittest.cpp",
     ]
     deps += [
-      ":seekablemultistream",
       "../fpdfapi/parser",
       "css",
     ]
diff --git a/xfa/fxfa/BUILD.gn b/xfa/fxfa/BUILD.gn
index 24aa711..f3c132d 100644
--- a/xfa/fxfa/BUILD.gn
+++ b/xfa/fxfa/BUILD.gn
@@ -101,7 +101,6 @@
     "../../core/fpdfdoc",
     "../../core/fxcodec",
     "../../core/fxcrt",
-    "../../core/fxcrt:seekablemultistream",
     "../../core/fxcrt/css",
     "../../core/fxge",
     "../../fxbarcode",
diff --git a/xfa/fxfa/cxfa_ffdoc.cpp b/xfa/fxfa/cxfa_ffdoc.cpp
index ebc3356..a71d7ec 100644
--- a/xfa/fxfa/cxfa_ffdoc.cpp
+++ b/xfa/fxfa/cxfa_ffdoc.cpp
@@ -13,11 +13,11 @@
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_document.h"
+#include "core/fpdfapi/parser/cpdf_seekablemultistream.h"
 #include "core/fpdfapi/parser/cpdf_stream.h"
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 #include "core/fpdfdoc/cpdf_nametree.h"
 #include "core/fxcrt/cfx_readonlymemorystream.h"
-#include "core/fxcrt/cfx_seekablemultistream.h"
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/xml/cfx_xmldocument.h"
 #include "core/fxcrt/xml/cfx_xmlelement.h"
@@ -120,7 +120,7 @@
   if (xfaStreams.empty())
     return false;
 
-  auto stream = pdfium::MakeRetain<CFX_SeekableMultiStream>(xfaStreams);
+  auto stream = pdfium::MakeRetain<CPDF_SeekableMultiStream>(xfaStreams);
 
   CXFA_DocumentParser parser(m_pDocument.get());
   bool parsed = parser.Parse(stream, XFA_PacketType::Xdp);