| Index: xfa/fxfa/parser/cxfa_simple_parser.cpp
|
| diff --git a/xfa/fxfa/parser/cxfa_simple_parser.cpp b/xfa/fxfa/parser/cxfa_simple_parser.cpp
|
| index 7f70c81d386dd1db9bf9a18795b522550720cefd..043c56a27043b3e808ebbf602d5b9c99e591f6a3 100644
|
| --- a/xfa/fxfa/parser/cxfa_simple_parser.cpp
|
| +++ b/xfa/fxfa/parser/cxfa_simple_parser.cpp
|
| @@ -6,11 +6,15 @@
|
|
|
| #include "xfa/fxfa/parser/cxfa_simple_parser.h"
|
|
|
| +#include "core/fxcrt/include/fx_ext.h"
|
| #include "xfa/fgas/crt/fgas_codepage.h"
|
| #include "xfa/fxfa/include/fxfa.h"
|
| #include "xfa/fxfa/include/xfa_checksum.h"
|
| +#include "xfa/fxfa/parser/cxfa_widetextread.h"
|
| #include "xfa/fxfa/parser/cxfa_xml_parser.h"
|
| +#include "xfa/fxfa/parser/xfa_basic_data.h"
|
| #include "xfa/fxfa/parser/xfa_document.h"
|
| +#include "xfa/fxfa/parser/xfa_utils.h"
|
|
|
| namespace {
|
|
|
| @@ -224,6 +228,26 @@ void ConvertXMLToPlainText(CFDE_XMLElement* pRootXMLNode,
|
| }
|
| }
|
|
|
| +const XFA_PACKETINFO* GetPacketByName(const CFX_WideStringC& wsName) {
|
| + if (wsName.IsEmpty())
|
| + return nullptr;
|
| +
|
| + uint32_t uHash = FX_HashCode_GetW(wsName, false);
|
| + int32_t iStart = 0;
|
| + int32_t iEnd = g_iXFAPacketCount - 1;
|
| + do {
|
| + int32_t iMid = (iStart + iEnd) / 2;
|
| + const XFA_PACKETINFO* pInfo = g_XFAPacketData + iMid;
|
| + if (uHash == pInfo->uHash)
|
| + return pInfo;
|
| + if (uHash < pInfo->uHash)
|
| + iEnd = iMid - 1;
|
| + else
|
| + iStart = iMid + 1;
|
| + } while (iStart <= iEnd);
|
| + return nullptr;
|
| +}
|
| +
|
| } // namespace
|
|
|
| FX_BOOL XFA_RecognizeRichText(CFDE_XMLElement* pRichTextXMLNode) {
|
| @@ -301,10 +325,7 @@ int32_t CXFA_SimpleParser::ParseXMLData(const CFX_WideString& wsXML,
|
| CloseParser();
|
| pXMLNode = nullptr;
|
|
|
| - std::unique_ptr<IFX_Stream> pStream(XFA_CreateWideTextRead(wsXML));
|
| - if (!pStream)
|
| - return XFA_PARSESTATUS_StreamErr;
|
| -
|
| + std::unique_ptr<IFX_Stream> pStream(new CXFA_WideTextRead(wsXML));
|
| m_pXMLDoc.reset(new CFDE_XMLDoc);
|
| CXFA_XMLParser* pParser =
|
| new CXFA_XMLParser(m_pXMLDoc->GetRoot(), pStream.get());
|
| @@ -504,7 +525,7 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(
|
| CFX_WideString wsPacketName;
|
| pElement->GetLocalTagName(wsPacketName);
|
| const XFA_PACKETINFO* pPacketInfo =
|
| - XFA_GetPacketByName(wsPacketName.AsStringC());
|
| + GetPacketByName(wsPacketName.AsStringC());
|
| if (pPacketInfo && pPacketInfo->pURI) {
|
| if (!MatchNodeName(pElement, pPacketInfo->pName, pPacketInfo->pURI,
|
| pPacketInfo->eFlags)) {
|
|
|