Clean up construction of CFX_Barcode

Because certain enum values can cause the initialization of the class
to fail there is a seperate init method from the constructor. This CL
is converting the code to use a standard factory pattern for this,
instead of the existing implementation.

Change-Id: Ia2293ce94ad0db5862db9796aeb8a224fd2b45f9
Reviewed-on: https://pdfium-review.googlesource.com/24230
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
diff --git a/testing/libfuzzer/pdf_cfx_barcode_fuzzer.cc b/testing/libfuzzer/pdf_cfx_barcode_fuzzer.cc
index 3334e86..aaeebf3 100644
--- a/testing/libfuzzer/pdf_cfx_barcode_fuzzer.cc
+++ b/testing/libfuzzer/pdf_cfx_barcode_fuzzer.cc
@@ -17,20 +17,20 @@
   data += sizeof(wchar_t);
   size -= sizeof(wchar_t);
 
-  CFX_Barcode barcode;
-  if (!barcode.Create(type))
+  auto barcode = CFX_Barcode::Create(type);
+  if (!barcode)
     return 0;
 
   // TODO(tsepez): Setup more options from |data|.
-  barcode.SetModuleHeight(300);
-  barcode.SetModuleWidth(420);
-  barcode.SetHeight(298);
-  barcode.SetWidth(418);
+  barcode->SetModuleHeight(300);
+  barcode->SetModuleWidth(420);
+  barcode->SetHeight(298);
+  barcode->SetWidth(418);
 
   WideStringView content(reinterpret_cast<const wchar_t*>(data),
                          size / sizeof(wchar_t));
 
-  if (!barcode.Encode(content))
+  if (!barcode->Encode(content))
     return 0;
 
   // TODO(tsepez): Output to device.
diff --git a/xfa/fwl/cfwl_barcode.cpp b/xfa/fwl/cfwl_barcode.cpp
index f5d6ea9..74ac7dd 100644
--- a/xfa/fwl/cfwl_barcode.cpp
+++ b/xfa/fwl/cfwl_barcode.cpp
@@ -213,7 +213,5 @@
   if (m_pBarcodeEngine || m_type == BC_UNKNOWN)
     return;
 
-  auto pBarcode = pdfium::MakeUnique<CFX_Barcode>();
-  if (pBarcode->Create(m_type))
-    m_pBarcodeEngine = std::move(pBarcode);
+  m_pBarcodeEngine = CFX_Barcode::Create(m_type);
 }
diff --git a/xfa/fwl/cfx_barcode.cpp b/xfa/fwl/cfx_barcode.cpp
index 9d667c6..2d12536 100644
--- a/xfa/fwl/cfx_barcode.cpp
+++ b/xfa/fwl/cfx_barcode.cpp
@@ -59,9 +59,11 @@
 
 CFX_Barcode::~CFX_Barcode() {}
 
-bool CFX_Barcode::Create(BC_TYPE type) {
-  m_pBCEngine = CreateBarCodeEngineObject(type);
-  return !!m_pBCEngine;
+std::unique_ptr<CFX_Barcode> CFX_Barcode::Create(BC_TYPE type) {
+  auto barcodeEngine = CreateBarCodeEngineObject(type);
+  std::unique_ptr<CFX_Barcode> barcode(new CFX_Barcode());
+  barcode->m_pBCEngine.swap(barcodeEngine);
+  return barcode;
 }
 
 BC_TYPE CFX_Barcode::GetType() {
diff --git a/xfa/fwl/cfx_barcode.h b/xfa/fwl/cfx_barcode.h
index eec4648..a5f0513 100644
--- a/xfa/fwl/cfx_barcode.h
+++ b/xfa/fwl/cfx_barcode.h
@@ -22,10 +22,9 @@
 
 class CFX_Barcode {
  public:
-  CFX_Barcode();
   ~CFX_Barcode();
 
-  bool Create(BC_TYPE type);
+  static std::unique_ptr<CFX_Barcode> Create(BC_TYPE type);
   BC_TYPE GetType();
   bool Encode(const WideStringView& contents);
 
@@ -56,6 +55,8 @@
   bool SetTruncated(bool truncated);
 
  private:
+  CFX_Barcode();
+
   std::unique_ptr<CBC_CodeBase> m_pBCEngine;
 };
 
diff --git a/xfa/fwl/cfx_barcode_unittest.cpp b/xfa/fwl/cfx_barcode_unittest.cpp
index fe8aee4..585d92f 100644
--- a/xfa/fwl/cfx_barcode_unittest.cpp
+++ b/xfa/fwl/cfx_barcode_unittest.cpp
@@ -20,7 +20,6 @@
  public:
   void SetUp() override {
     BC_Library_Init();
-    barcode_ = pdfium::MakeUnique<CFX_Barcode>();
 
     auto device = pdfium::MakeUnique<CFX_DefaultRenderDevice>();
     auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
@@ -41,7 +40,8 @@
   CFX_Barcode* barcode() const { return barcode_.get(); }
 
   bool Create(BC_TYPE type) {
-    if (!barcode_->Create(type))
+    barcode_ = CFX_Barcode::Create(type);
+    if (!barcode_)
       return false;
 
     barcode_->SetModuleHeight(300);