// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "xfa/fgas/localization/fgas_localemgr.h" #include "core/include/fxcrt/fx_xml.h" IFX_LocaleMgr* FX_LocaleMgr_Create(const FX_WCHAR* pszLocalPath, FX_WORD wDefaultLCID) { void* pPathHandle = FX_OpenFolder(pszLocalPath); if (!pPathHandle) { return NULL; } CFX_LocaleMgr* pLocaleMgr = new CFX_LocaleMgr(wDefaultLCID); CFX_WideString wsFileName; FX_BOOL bFolder = FALSE; while (FX_GetNextFile(pPathHandle, wsFileName, bFolder)) { if (!bFolder) { if (wsFileName.GetLength() < 4) { continue; } CFX_WideString wsExt = wsFileName.Right(4); wsExt.MakeLower(); if (wsExt != L".xml") { continue; } CFX_WideString wsFullPath(pszLocalPath); wsFullPath += L"\\" + wsFileName; IFX_FileRead* pRead = FX_CreateFileRead(wsFullPath); if (!pRead) { continue; } CXML_Element* pXmlLocale = CXML_Element::Parse(pRead); pRead->Release(); CFX_ByteString bssp = pXmlLocale->GetNamespace(); if (bssp == "http://www.foxitsoftware.com/localization") { CFX_WideString wsLCID = pXmlLocale->GetAttrValue("", "lcid"); wchar_t* pEnd = NULL; FX_DWORD dwLCID = wcstol(wsLCID, &pEnd, 16); if (pLocaleMgr->m_lcid2xml.GetValueAt((void*)(uintptr_t)dwLCID)) { delete pXmlLocale; } else { pLocaleMgr->m_lcid2xml.SetAt((void*)(uintptr_t)dwLCID, pXmlLocale); } } else { delete pXmlLocale; } } } FX_CloseFolder(pPathHandle); return pLocaleMgr; } CFX_LocaleMgr::CFX_LocaleMgr(FX_WORD wDefLCID) : m_wDefLCID(wDefLCID) {} CFX_LocaleMgr::~CFX_LocaleMgr() { FX_POSITION ps = m_lcid2locale.GetStartPosition(); while (ps) { void* plcid; IFX_Locale* pLocale = NULL; m_lcid2locale.GetNextAssoc(ps, plcid, (void*&)pLocale); pLocale->Release(); } m_lcid2locale.RemoveAll(); ps = m_lcid2xml.GetStartPosition(); while (ps) { void* plcid; CXML_Element* pxml = NULL; m_lcid2xml.GetNextAssoc(ps, plcid, (void*&)pxml); delete pxml; } m_lcid2xml.RemoveAll(); } FX_WORD CFX_LocaleMgr::GetDefLocaleID() { return m_wDefLCID; } IFX_Locale* CFX_LocaleMgr::GetDefLocale() { return GetLocale(m_wDefLCID); } IFX_Locale* CFX_LocaleMgr::GetLocale(FX_WORD lcid) { IFX_Locale* pLocale = (IFX_Locale*)m_lcid2locale.GetValueAt((void*)(uintptr_t)lcid); if (!pLocale) { CXML_Element* pxml = (CXML_Element*)m_lcid2xml.GetValueAt((void*)(uintptr_t)lcid); if (pxml) { pLocale = IFX_Locale::Create(pxml); m_lcid2locale.SetAt((void*)(uintptr_t)lcid, pLocale); } } return pLocale; } IFX_Locale* CFX_LocaleMgr::GetLocaleByName( const CFX_WideStringC& wsLocaleName) { return NULL; }