Convert CPDF_PageLabel::GetLabel to return Optional<WideString>

Change-Id: I53b91aa89c0fd1e7ab766f6d3c27a0fc7573c360
Reviewed-on: https://pdfium-review.googlesource.com/22290
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/core/fpdfdoc/cpdf_pagelabel.cpp b/core/fpdfdoc/cpdf_pagelabel.cpp
index d069308..f06e401 100644
--- a/core/fpdfdoc/cpdf_pagelabel.cpp
+++ b/core/fpdfdoc/cpdf_pagelabel.cpp
@@ -78,20 +78,20 @@
 
 CPDF_PageLabel::~CPDF_PageLabel() {}
 
-bool CPDF_PageLabel::GetLabel(int nPage, WideString* wsLabel) const {
+Optional<WideString> CPDF_PageLabel::GetLabel(int nPage) const {
   if (!m_pDocument)
-    return false;
+    return {};
 
   if (nPage < 0 || nPage >= m_pDocument->GetPageCount())
-    return false;
+    return {};
 
   const CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();
   if (!pPDFRoot)
-    return false;
+    return {};
 
   CPDF_Dictionary* pLabels = pPDFRoot->GetDictFor("PageLabels");
   if (!pLabels)
-    return false;
+    return {};
 
   CPDF_NumberTree numberTree(pLabels);
   CPDF_Object* pValue = nullptr;
@@ -103,21 +103,22 @@
     n--;
   }
 
+  WideString label;
   if (pValue) {
     pValue = pValue->GetDirect();
     if (CPDF_Dictionary* pLabel = pValue->AsDictionary()) {
       if (pLabel->KeyExist("P"))
-        *wsLabel += pLabel->GetUnicodeTextFor("P");
+        label += pLabel->GetUnicodeTextFor("P");
 
       ByteString bsNumberingStyle = pLabel->GetStringFor("S", "");
       int nLabelNum = nPage - n + pLabel->GetIntegerFor("St", 1);
       WideString wsNumPortion = GetLabelNumPortion(nLabelNum, bsNumberingStyle);
-      *wsLabel += wsNumPortion;
-      return true;
+      label += wsNumPortion;
+      return {label};
     }
   }
-  *wsLabel = WideString::Format(L"%d", nPage + 1);
-  return true;
+  label = WideString::Format(L"%d", nPage + 1);
+  return {label};
 }
 
 int32_t CPDF_PageLabel::GetPageByLabel(const ByteStringView& bsLabel) const {
@@ -130,10 +131,10 @@
 
   int nPages = m_pDocument->GetPageCount();
   for (int i = 0; i < nPages; i++) {
-    WideString str;
-    if (!GetLabel(i, &str))
+    Optional<WideString> str = GetLabel(i);
+    if (!str.has_value())
       continue;
-    if (PDF_EncodeText(str).Compare(bsLabel))
+    if (PDF_EncodeText(str.value()).Compare(bsLabel))
       return i;
   }
 
diff --git a/core/fpdfdoc/cpdf_pagelabel.h b/core/fpdfdoc/cpdf_pagelabel.h
index 8a7a33d..4570e97 100644
--- a/core/fpdfdoc/cpdf_pagelabel.h
+++ b/core/fpdfdoc/cpdf_pagelabel.h
@@ -8,6 +8,7 @@
 #define CORE_FPDFDOC_CPDF_PAGELABEL_H_
 
 #include "core/fxcrt/fx_string.h"
+#include "third_party/base/optional.h"
 
 class CPDF_Document;
 
@@ -16,7 +17,7 @@
   explicit CPDF_PageLabel(CPDF_Document* pDocument);
   ~CPDF_PageLabel();
 
-  bool GetLabel(int nPage, WideString* wsLabel) const;
+  Optional<WideString> GetLabel(int nPage) const;
   int32_t GetPageByLabel(const ByteStringView& bsLabel) const;
   int32_t GetPageByLabel(const WideStringView& wsLabel) const;
 
diff --git a/fpdfsdk/fpdfdoc.cpp b/fpdfsdk/fpdfdoc.cpp
index 51a1c61..14e4361 100644
--- a/fpdfsdk/fpdfdoc.cpp
+++ b/fpdfsdk/fpdfdoc.cpp
@@ -424,8 +424,8 @@
 
   // CPDF_PageLabel can deal with NULL |document|.
   CPDF_PageLabel label(CPDFDocumentFromFPDFDocument(document));
-  WideString str;
-  if (!label.GetLabel(page_index, &str))
-    return 0;
-  return Utf16EncodeMaybeCopyAndReturnLength(str, buffer, buflen);
+  Optional<WideString> str = label.GetLabel(page_index);
+  return str.has_value()
+             ? Utf16EncodeMaybeCopyAndReturnLength(str.value(), buffer, buflen)
+             : 0;
 }