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