14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_localevalue.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_ext.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fgas/localization/fgas_localeimp.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_localemgr.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_object.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_utils.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic const FX_DOUBLE fraction_scales[] = {0.1,
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.01,
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.001,
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.0001,
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.00001,
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.000001,
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.0000001,
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.00000001,
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.000000001,
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.0000000001,
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.00000000001,
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.000000000001,
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.0000000000001,
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.00000000000001,
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.000000000000001,
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            0.0000000000000001};
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_LocaleValue::CXFA_LocaleValue() {
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_NULL;
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bValid = true;
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pLocaleMgr = nullptr;
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_LocaleValue::CXFA_LocaleValue(const CXFA_LocaleValue& value) {
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_NULL;
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bValid = true;
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pLocaleMgr = nullptr;
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  *this = value;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType,
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   CXFA_LocaleMgr* pLocaleMgr) {
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = dwType;
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bValid = (m_dwType != XFA_VT_NULL);
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pLocaleMgr = pLocaleMgr;
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType,
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   const CFX_WideString& wsValue,
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   CXFA_LocaleMgr* pLocaleMgr) {
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_wsValue = wsValue;
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = dwType;
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pLocaleMgr = pLocaleMgr;
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bValid = ValidateCanonicalValue(wsValue, dwType);
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType,
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   const CFX_WideString& wsValue,
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   const CFX_WideString& wsFormat,
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   IFX_Locale* pLocale,
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   CXFA_LocaleMgr* pLocaleMgr) {
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pLocaleMgr = pLocaleMgr;
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bValid = true;
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = dwType;
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bValid = ParsePatternValue(wsValue, wsFormat, pLocale);
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_LocaleValue& CXFA_LocaleValue::operator=(const CXFA_LocaleValue& value) {
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_wsValue = value.m_wsValue;
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = value.m_dwType;
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bValid = value.m_bValid;
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pLocaleMgr = value.m_pLocaleMgr;
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return *this;
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_LocaleValue::~CXFA_LocaleValue() {}
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic FX_LOCALECATEGORY XFA_ValugeCategory(FX_LOCALECATEGORY eCategory,
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                            uint32_t dwValueType) {
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (eCategory == FX_LOCALECATEGORY_Unknown) {
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    switch (dwValueType) {
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case XFA_VT_BOOLEAN:
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case XFA_VT_INTEGER:
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case XFA_VT_DECIMAL:
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case XFA_VT_FLOAT:
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return FX_LOCALECATEGORY_Num;
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case XFA_VT_TEXT:
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return FX_LOCALECATEGORY_Text;
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case XFA_VT_DATE:
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return FX_LOCALECATEGORY_Date;
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case XFA_VT_TIME:
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return FX_LOCALECATEGORY_Time;
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case XFA_VT_DATETIME:
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return FX_LOCALECATEGORY_DateTime;
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return eCategory;
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::ValidateValue(const CFX_WideString& wsValue,
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     const CFX_WideString& wsPattern,
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     IFX_Locale* pLocale,
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     CFX_WideString* pMatchFormat) {
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString wsOutput;
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFX_Locale* locale = m_pLocaleMgr->GetDefLocale();
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pLocale)
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pLocaleMgr->SetDefLocale(pLocale);
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pFormat = pdfium::MakeUnique<CFX_FormatString>(m_pLocaleMgr, false);
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CFX_WideString> wsPatterns;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFormat->SplitFormatString(wsPattern, wsPatterns);
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bRet = false;
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iCount = pdfium::CollectionSize<int32_t>(wsPatterns);
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t i = 0;
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (; i < iCount && !bRet; i++) {
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString wsFormat = wsPatterns[i];
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat);
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    eCategory = XFA_ValugeCategory(eCategory, m_dwType);
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    switch (eCategory) {
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Null:
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseNull(wsValue, wsFormat);
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!bRet) {
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bRet = wsValue.IsEmpty();
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Zero:
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseZero(wsValue, wsFormat);
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!bRet) {
13133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann          bRet = wsValue == L"0";
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Num: {
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_WideString fNum;
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseNum(wsValue, wsFormat, fNum);
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!bRet) {
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bRet = pFormat->FormatNum(wsValue, wsFormat, wsOutput);
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Text:
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseText(wsValue, wsFormat, wsOutput);
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        wsOutput.clear();
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!bRet) {
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bRet = pFormat->FormatText(wsValue, wsFormat, wsOutput);
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Date: {
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_Unitime dt;
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = ValidateCanonicalDate(wsValue, dt);
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!bRet) {
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Date,
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                        dt);
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (!bRet) {
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           FX_DATETIMETYPE_Date);
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Time: {
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_Unitime dt;
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet =
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Time, dt);
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!bRet) {
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         FX_DATETIMETYPE_Time);
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_DateTime: {
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_Unitime dt;
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseDateTime(wsValue, wsFormat,
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      FX_DATETIMETYPE_DateTime, dt);
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!bRet) {
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         FX_DATETIMETYPE_DateTime);
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      default:
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = false;
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bRet && pMatchFormat)
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    *pMatchFormat = wsPatterns[i - 1];
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pLocale)
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pLocaleMgr->SetDefLocale(locale);
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return bRet;
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString CXFA_LocaleValue::GetValue() const {
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_wsValue;
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CXFA_LocaleValue::GetType() const {
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_dwType;
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_LocaleValue::SetValue(const CFX_WideString& wsValue,
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                uint32_t dwType) {
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_wsValue = wsValue;
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = dwType;
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString CXFA_LocaleValue::GetText() const {
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_bValid && m_dwType == XFA_VT_TEXT) {
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_wsValue;
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CFX_WideString();
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_FLOAT CXFA_LocaleValue::GetNum() const {
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER ||
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) {
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int64_t nIntegral = 0;
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t dwFractional = 0;
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t nExponent = 0;
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int cc = 0;
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bNegative = false, bExpSign = false;
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const FX_WCHAR* str = m_wsValue.c_str();
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int len = m_wsValue.GetLength();
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (FXSYS_iswspace(str[cc]) && cc < len) {
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (cc >= len) {
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 0;
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (str[0] == '+') {
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (str[0] == '-') {
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bNegative = true;
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int nIntegralLen = 0;
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (cc < len) {
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc]) ||
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          nIntegralLen > 17) {
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nIntegral = nIntegral * 10 + str[cc] - '0';
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nIntegralLen++;
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIntegral = bNegative ? -nIntegral : nIntegral;
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int scale = 0;
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    double fraction = 0.0;
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (cc < len && str[cc] == '.') {
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      while (cc < len) {
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fraction += fraction_scales[scale] * (str[cc] - '0');
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        scale++;
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        cc++;
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (scale == sizeof fraction_scales / sizeof(double) ||
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            !FXSYS_isDecimalDigit(str[cc])) {
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwFractional = (uint32_t)(fraction * 4294967296.0);
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (cc < len) {
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (str[cc] == '+') {
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          cc++;
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else if (str[cc] == '-') {
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bExpSign = true;
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          cc++;
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      while (cc < len) {
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc])) {
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nExponent = nExponent * 10 + str[cc] - '0';
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        cc++;
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nExponent = bExpSign ? -nExponent : nExponent;
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_FLOAT fValue = (FX_FLOAT)(dwFractional / 4294967296.0);
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    fValue = nIntegral + (nIntegral >= 0 ? fValue : -fValue);
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (nExponent != 0) {
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fValue *= FXSYS_pow(10, (FX_FLOAT)nExponent);
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return fValue;
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_DOUBLE CXFA_LocaleValue::GetDoubleNum() const {
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER ||
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) {
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int64_t nIntegral = 0;
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t dwFractional = 0;
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t nExponent = 0;
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t cc = 0;
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bNegative = false, bExpSign = false;
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const FX_WCHAR* str = m_wsValue.c_str();
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int len = m_wsValue.GetLength();
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (FXSYS_iswspace(str[cc]) && cc < len) {
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (cc >= len) {
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 0;
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (str[0] == '+') {
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (str[0] == '-') {
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bNegative = true;
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t nIntegralLen = 0;
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (cc < len) {
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc]) ||
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          nIntegralLen > 17) {
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nIntegral = nIntegral * 10 + str[cc] - '0';
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nIntegralLen++;
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIntegral = bNegative ? -nIntegral : nIntegral;
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t scale = 0;
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_DOUBLE fraction = 0.0;
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (cc < len && str[cc] == '.') {
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      while (cc < len) {
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fraction += fraction_scales[scale] * (str[cc] - '0');
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        scale++;
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        cc++;
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (scale == sizeof fraction_scales / sizeof(FX_DOUBLE) ||
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            !FXSYS_isDecimalDigit(str[cc])) {
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwFractional = (uint32_t)(fraction * 4294967296.0);
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) {
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      cc++;
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (cc < len) {
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (str[cc] == '+') {
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          cc++;
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else if (str[cc] == '-') {
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bExpSign = true;
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          cc++;
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      while (cc < len) {
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc])) {
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nExponent = nExponent * 10 + str[cc] - '0';
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        cc++;
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nExponent = bExpSign ? -nExponent : nExponent;
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_DOUBLE dValue = (dwFractional / 4294967296.0);
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    dValue = nIntegral + (nIntegral >= 0 ? dValue : -dValue);
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (nExponent != 0) {
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dValue *= FXSYS_pow(10, (FX_FLOAT)nExponent);
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return dValue;
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_Unitime CXFA_LocaleValue::GetDate() const {
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_bValid && m_dwType == XFA_VT_DATE) {
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_Unitime dt;
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_DateFromCanonical(m_wsValue, dt);
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return dt;
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CFX_Unitime();
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_Unitime CXFA_LocaleValue::GetTime() const {
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_bValid && m_dwType == XFA_VT_TIME) {
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_Unitime dt(0);
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ASSERT(m_pLocaleMgr);
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_TimeFromCanonical(m_wsValue.AsStringC(), dt,
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         m_pLocaleMgr->GetDefLocale());
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return dt;
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CFX_Unitime();
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_Unitime CXFA_LocaleValue::GetDateTime() const {
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_bValid && m_dwType == XFA_VT_DATETIME) {
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t index = m_wsValue.Find('T');
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_Unitime dt;
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_DateFromCanonical(m_wsValue.Left(index), dt);
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ASSERT(m_pLocaleMgr);
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_TimeFromCanonical(
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_wsValue.Right(m_wsValue.GetLength() - index - 1).AsStringC(), dt,
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pLocaleMgr->GetDefLocale());
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return dt;
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CFX_Unitime();
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetText(const CFX_WideString& wsText) {
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_TEXT;
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_wsValue = wsText;
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetText(const CFX_WideString& wsText,
4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               const CFX_WideString& wsFormat,
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               IFX_Locale* pLocale) {
4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_TEXT;
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bValid = ParsePatternValue(wsText, wsFormat, pLocale);
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetNum(FX_FLOAT fNum) {
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_FLOAT;
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_wsValue.Format(L"%.8g", (FX_DOUBLE)fNum);
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetNum(const CFX_WideString& wsNum,
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                              const CFX_WideString& wsFormat,
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                              IFX_Locale* pLocale) {
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_FLOAT;
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bValid = ParsePatternValue(wsNum, wsFormat, pLocale);
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetDate(const CFX_Unitime& d) {
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_DATE;
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_wsValue.Format(L"%04d-%02d-%02d", d.GetYear(), d.GetMonth(), d.GetDay());
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetDate(const CFX_WideString& wsDate,
4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               const CFX_WideString& wsFormat,
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               IFX_Locale* pLocale) {
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_DATE;
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bValid = ParsePatternValue(wsDate, wsFormat, pLocale);
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetTime(const CFX_Unitime& t) {
4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_TIME;
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_wsValue.Format(L"%02d:%02d:%02d", t.GetHour(), t.GetMinute(),
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   t.GetSecond());
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (t.GetMillisecond() > 0) {
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString wsTemp;
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wsTemp.Format(L"%:03d", t.GetMillisecond());
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_wsValue += wsTemp;
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetTime(const CFX_WideString& wsTime,
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               const CFX_WideString& wsFormat,
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               IFX_Locale* pLocale) {
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_TIME;
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bValid = ParsePatternValue(wsTime, wsFormat, pLocale);
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetDateTime(const CFX_Unitime& dt) {
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_DATETIME;
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_wsValue.Format(L"%04d-%02d-%02dT%02d:%02d:%02d", dt.GetYear(),
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   dt.GetMonth(), dt.GetDay(), dt.GetHour(), dt.GetMinute(),
4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   dt.GetSecond());
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (dt.GetMillisecond() > 0) {
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString wsTemp;
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wsTemp.Format(L"%:03d", dt.GetMillisecond());
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_wsValue += wsTemp;
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::SetDateTime(const CFX_WideString& wsDateTime,
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   const CFX_WideString& wsFormat,
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   IFX_Locale* pLocale) {
4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_dwType = XFA_VT_DATETIME;
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bValid = ParsePatternValue(wsDateTime, wsFormat, pLocale);
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::FormatPatterns(CFX_WideString& wsResult,
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      const CFX_WideString& wsFormat,
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      IFX_Locale* pLocale,
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      XFA_VALUEPICTURE eValueType) const {
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pFormat = pdfium::MakeUnique<CFX_FormatString>(m_pLocaleMgr, false);
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CFX_WideString> wsPatterns;
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFormat->SplitFormatString(wsFormat, wsPatterns);
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  wsResult.clear();
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iCount = pdfium::CollectionSize<int32_t>(wsPatterns);
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int32_t i = 0; i < iCount; i++) {
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (FormatSinglePattern(wsResult, wsPatterns[i], pLocale, eValueType))
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return false;
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::FormatSinglePattern(CFX_WideString& wsResult,
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           const CFX_WideString& wsFormat,
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           IFX_Locale* pLocale,
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           XFA_VALUEPICTURE eValueType) const {
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFX_Locale* locale = m_pLocaleMgr->GetDefLocale();
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pLocale)
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pLocaleMgr->SetDefLocale(pLocale);
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  wsResult.clear();
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bRet = false;
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pFormat = pdfium::MakeUnique<CFX_FormatString>(m_pLocaleMgr, false);
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat);
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  eCategory = XFA_ValugeCategory(eCategory, m_dwType);
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (eCategory) {
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FX_LOCALECATEGORY_Null:
4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (m_wsValue.IsEmpty()) {
4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->FormatNull(wsFormat, wsResult);
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FX_LOCALECATEGORY_Zero:
50133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      if (m_wsValue == L"0") {
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->FormatZero(wsFormat, wsResult);
5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FX_LOCALECATEGORY_Num:
5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bRet = pFormat->FormatNum(m_wsValue, wsFormat, wsResult);
5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FX_LOCALECATEGORY_Text:
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bRet = pFormat->FormatText(m_wsValue, wsFormat, wsResult);
5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FX_LOCALECATEGORY_Date:
5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     FX_DATETIMETYPE_Date);
5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FX_LOCALECATEGORY_Time:
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     FX_DATETIMETYPE_Time);
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FX_LOCALECATEGORY_DateTime:
5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     FX_DATETIMETYPE_DateTime);
5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      wsResult = m_wsValue;
5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bRet = true;
5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!bRet && (eCategory != FX_LOCALECATEGORY_Num ||
5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                eValueType != XFA_VALUEPICTURE_Display)) {
5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wsResult = m_wsValue;
5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pLocale)
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pLocaleMgr->SetDefLocale(locale);
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return bRet;
5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic bool XFA_ValueSplitDateTime(const CFX_WideString& wsDateTime,
5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   CFX_WideString& wsDate,
5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   CFX_WideString& wsTime) {
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  wsDate = L"";
5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  wsTime = L"";
5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wsDateTime.IsEmpty()) {
5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nSplitIndex = -1;
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  nSplitIndex = wsDateTime.Find('T');
5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nSplitIndex < 0) {
5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nSplitIndex = wsDateTime.Find(' ');
5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nSplitIndex < 0) {
5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  wsDate = wsDateTime.Left(nSplitIndex);
5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::ValidateCanonicalValue(const CFX_WideString& wsValue,
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                              uint32_t dwVType) {
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wsValue.IsEmpty()) {
5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Unitime dt;
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (dwVType) {
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_VT_DATE: {
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (ValidateCanonicalDate(wsValue, dt)) {
5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_WideString wsDate, wsTime;
5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) &&
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          ValidateCanonicalDate(wsDate, dt)) {
5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_VT_TIME: {
5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (ValidateCanonicalTime(wsValue)) {
5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_WideString wsDate, wsTime;
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) &&
5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          ValidateCanonicalTime(wsTime)) {
5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_VT_DATETIME: {
5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_WideString wsDate, wsTime;
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) &&
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime)) {
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return true;
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } break;
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::ValidateCanonicalDate(const CFX_WideString& wsDate,
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             CFX_Unitime& unDate) {
5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const uint16_t LastDay[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const uint16_t wCountY = 4, wCountM = 2, wCountD = 2;
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nLen = wsDate.GetLength();
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nLen < wCountY || nLen > wCountY + wCountM + wCountD + 2) {
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const bool bSymbol = wsDate.Find(0x2D) != -1;
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t wYear = 0;
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t wMonth = 0;
6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t wDay = 0;
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_WCHAR* pDate = wsDate.c_str();
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nIndex = 0, nStart = 0;
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (pDate[nIndex] != '\0' && nIndex < wCountY) {
6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!FXSYS_isDecimalDigit(pDate[nIndex])) {
6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wYear = (pDate[nIndex] - '0') + wYear * 10;
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bSymbol) {
6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pDate[nIndex] != 0x2D) {
6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  nStart = nIndex;
6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (pDate[nIndex] != '\0' && nIndex - nStart < wCountM && nIndex < nLen) {
6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!FXSYS_isDecimalDigit(pDate[nIndex])) {
6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wMonth = (pDate[nIndex] - '0') + wMonth * 10;
6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bSymbol) {
6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pDate[nIndex] != 0x2D) {
6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  nStart = nIndex;
6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (pDate[nIndex] != '\0' && nIndex - nStart < wCountD && nIndex < nLen) {
6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!FXSYS_isDecimalDigit(pDate[nIndex])) {
6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wDay = (pDate[nIndex] - '0') + wDay * 10;
6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nIndex != nLen) {
6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wYear < 1900 || wYear > 2029) {
6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wMonth < 1 || wMonth > 12) {
6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (wMonth == 0 && nLen == wCountY) {
6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wDay < 1) {
6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (wDay == 0 && (nLen == wCountY + wCountM)) {
6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return true;
6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wMonth == 2) {
6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (wYear % 400 == 0 || (wYear % 100 != 0 && wYear % 4 == 0)) {
6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (wDay > 29) {
6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return false;
6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (wDay > 28) {
6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return false;
6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (wDay > LastDay[wMonth - 1]) {
6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Unitime ut;
6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ut.Set(wYear, static_cast<uint8_t>(wMonth), static_cast<uint8_t>(wDay));
6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  unDate = unDate + ut;
6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::ValidateCanonicalTime(const CFX_WideString& wsTime) {
6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nLen = wsTime.GetLength();
6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nLen < 2)
6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const uint16_t wCountH = 2;
6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const uint16_t wCountM = 2;
6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const uint16_t wCountS = 2;
6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const uint16_t wCountF = 3;
6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const bool bSymbol = wsTime.Find(':') != -1;
6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t wHour = 0;
6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t wMinute = 0;
6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t wSecond = 0;
6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint16_t wFraction = 0;
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_WCHAR* pTime = wsTime.c_str();
6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nIndex = 0;
6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nStart = 0;
6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (nIndex - nStart < wCountH && pTime[nIndex]) {
6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!FXSYS_isDecimalDigit(pTime[nIndex]))
6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wHour = pTime[nIndex] - '0' + wHour * 10;
7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bSymbol) {
7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (nIndex < nLen && pTime[nIndex] != ':')
7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  nStart = nIndex;
7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) {
7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!FXSYS_isDecimalDigit(pTime[nIndex]))
7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wMinute = pTime[nIndex] - '0' + wMinute * 10;
7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bSymbol) {
7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (nIndex < nLen && pTime[nIndex] != ':')
7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  nStart = nIndex;
7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (nIndex - nStart < wCountS && nIndex < nLen && pTime[nIndex]) {
7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!FXSYS_isDecimalDigit(pTime[nIndex]))
7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wSecond = pTime[nIndex] - '0' + wSecond * 10;
7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wsTime.Find('.') > 0) {
7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pTime[nIndex] != '.')
7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nIndex++;
7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nStart = nIndex;
7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (nIndex - nStart < wCountF && nIndex < nLen && pTime[nIndex]) {
7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!FXSYS_isDecimalDigit(pTime[nIndex]))
7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return false;
7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      wFraction = pTime[nIndex] - '0' + wFraction * 10;
7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nIndex++;
7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nIndex < nLen) {
7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pTime[nIndex] == 'Z') {
7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nIndex++;
7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (pTime[nIndex] == '-' || pTime[nIndex] == '+') {
7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int16_t nOffsetH = 0;
7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int16_t nOffsetM = 0;
7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nIndex++;
7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nStart = nIndex;
7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      while (nIndex - nStart < wCountH && nIndex < nLen && pTime[nIndex]) {
7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!FXSYS_isDecimalDigit(pTime[nIndex]))
7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          return false;
7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nOffsetH = pTime[nIndex] - '0' + nOffsetH * 10;
7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nIndex++;
7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bSymbol) {
7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (nIndex < nLen && pTime[nIndex] != ':')
7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          return false;
7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nIndex++;
7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nStart = nIndex;
7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) {
7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!FXSYS_isDecimalDigit(pTime[nIndex]))
7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          return false;
7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nOffsetM = pTime[nIndex] - '0' + nOffsetM * 10;
7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nIndex++;
7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (nOffsetH > 12 || nOffsetM >= 60)
7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return false;
7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nIndex == nLen && wHour < 24 && wMinute < 60 && wSecond < 60 &&
7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         wFraction <= 999;
7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::ValidateCanonicalDateTime(
7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_WideString& wsDateTime) {
7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString wsDate, wsTime;
7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wsDateTime.IsEmpty()) {
7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int nSplitIndex = -1;
7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  nSplitIndex = wsDateTime.Find('T');
7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nSplitIndex < 0) {
7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nSplitIndex = wsDateTime.Find(' ');
7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nSplitIndex < 0) {
7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  wsDate = wsDateTime.Left(nSplitIndex);
7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1);
7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Unitime dt;
7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime);
7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::ParsePatternValue(const CFX_WideString& wsValue,
7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         const CFX_WideString& wsPattern,
7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         IFX_Locale* pLocale) {
7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFX_Locale* locale = m_pLocaleMgr->GetDefLocale();
7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pLocale)
7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pLocaleMgr->SetDefLocale(pLocale);
7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pFormat = pdfium::MakeUnique<CFX_FormatString>(m_pLocaleMgr, false);
7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<CFX_WideString> wsPatterns;
8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFormat->SplitFormatString(wsPattern, wsPatterns);
8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bRet = false;
8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iCount = pdfium::CollectionSize<int32_t>(wsPatterns);
8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int32_t i = 0; i < iCount && !bRet; i++) {
8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_WideString wsFormat = wsPatterns[i];
8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat);
8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    eCategory = XFA_ValugeCategory(eCategory, m_dwType);
8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    switch (eCategory) {
8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Null:
8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseNull(wsValue, wsFormat);
8104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bRet) {
8114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_wsValue.clear();
8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
8144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Zero:
8154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseZero(wsValue, wsFormat);
81633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        if (bRet)
81733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann          m_wsValue = L"0";
8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Num: {
8204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_WideString fNum;
8214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseNum(wsValue, wsFormat, fNum);
8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bRet) {
8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_wsValue = fNum;
8244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
8264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Text:
8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseText(wsValue, wsFormat, m_wsValue);
8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
8304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Date: {
8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_Unitime dt;
8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = ValidateCanonicalDate(wsValue, dt);
8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!bRet) {
8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Date,
8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                        dt);
8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bRet) {
8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          SetDate(dt);
8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_Time: {
8434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_Unitime dt;
8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet =
8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Time, dt);
8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bRet) {
8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          SetTime(dt);
8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
8494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FX_LOCALECATEGORY_DateTime: {
8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFX_Unitime dt;
8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = pFormat->ParseDateTime(wsValue, wsFormat,
8544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      FX_DATETIMETYPE_DateTime, dt);
8554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bRet) {
8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          SetDateTime(dt);
8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
8584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      default:
8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_wsValue = wsValue;
8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bRet = true;
8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!bRet)
8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_wsValue = wsValue;
8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pLocale)
8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pLocaleMgr->SetDefLocale(locale);
8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return bRet;
8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_LocaleValue::GetNumbericFormat(CFX_WideString& wsFormat,
8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         int32_t nIntLen,
8774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         int32_t nDecLen,
8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         bool bSign) {
8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(wsFormat.IsEmpty());
8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(nIntLen >= -1 && nDecLen >= -1);
8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nTotalLen = (nIntLen >= 0 ? nIntLen : 2) + (bSign ? 1 : 0) +
8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      (nDecLen >= 0 ? nDecLen : 2) + (nDecLen == 0 ? 0 : 1);
8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_WCHAR* lpBuf = wsFormat.GetBuffer(nTotalLen);
8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nPos = 0;
8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bSign) {
8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    lpBuf[nPos++] = L's';
8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nIntLen == -1) {
8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    lpBuf[nPos++] = L'z';
8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    lpBuf[nPos++] = L'*';
8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (nIntLen) {
8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      lpBuf[nPos++] = L'z';
8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nIntLen--;
8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nDecLen != 0) {
8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    lpBuf[nPos++] = L'.';
8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nDecLen == -1) {
9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    lpBuf[nPos++] = L'z';
9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    lpBuf[nPos++] = L'*';
9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (nDecLen) {
9054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      lpBuf[nPos++] = L'z';
9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nDecLen--;
9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  wsFormat.ReleaseBuffer(nTotalLen);
9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_LocaleValue::ValidateNumericTemp(CFX_WideString& wsNumeric,
9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           CFX_WideString& wsFormat,
9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           IFX_Locale* pLocale,
9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           int32_t* pos) {
9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wsFormat.IsEmpty() || wsNumeric.IsEmpty()) {
9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_WCHAR* pNum = wsNumeric.c_str();
9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_WCHAR* pFmt = wsFormat.c_str();
9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t n = 0, nf = 0;
9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_WCHAR c = pNum[n];
9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_WCHAR cf = pFmt[nf];
9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (cf == L's') {
9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (c == L'-' || c == L'+') {
9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ++n;
9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ++nf;
9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bLimit = true;
9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nCount = wsNumeric.GetLength();
9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nCountFmt = wsFormat.GetLength();
9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (n < nCount && (bLimit ? nf < nCountFmt : true) &&
9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         FXSYS_isDecimalDigit(c = pNum[n])) {
9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bLimit == true) {
9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((cf = pFmt[nf]) == L'*') {
9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bLimit = false;
9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else if (cf == L'z') {
9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nf++;
9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return false;
9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
9424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    n++;
9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (n == nCount) {
9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nf == nCountFmt) {
9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (nf < nCountFmt && (cf = pFmt[nf]) != L'.') {
9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ASSERT(cf == L'z' || cf == L'*');
9534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ++nf;
9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString wsDecimalSymbol;
9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pLocale) {
9574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDecimalSymbol);
9584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wsDecimalSymbol = CFX_WideString(L'.');
9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pFmt[nf] != L'.') {
9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
9634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (wsDecimalSymbol != CFX_WideStringC(c) && c != L'.') {
9654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ++nf;
9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ++n;
9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bLimit = true;
9704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (n < nCount && (bLimit ? nf < nCountFmt : true) &&
9714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann         FXSYS_isDecimalDigit(c = pNum[n])) {
9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bLimit == true) {
9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((cf = pFmt[nf]) == L'*') {
9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bLimit = false;
9754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else if (cf == L'z') {
9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nf++;
9774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return false;
9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    n++;
9824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return n == nCount;
9844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
985