| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fde/xml/fde_xml_imp.h" | 7 #include "xfa/fde/xml/fde_xml_imp.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 863 void CFDE_XMLDoc::ReleaseParser() { | 863 void CFDE_XMLDoc::ReleaseParser() { |
| 864 if (m_pXMLParser) { | 864 if (m_pXMLParser) { |
| 865 m_pXMLParser->Release(); | 865 m_pXMLParser->Release(); |
| 866 m_pXMLParser = nullptr; | 866 m_pXMLParser = nullptr; |
| 867 } | 867 } |
| 868 if (m_pSyntaxParser) { | 868 if (m_pSyntaxParser) { |
| 869 m_pSyntaxParser->Release(); | 869 m_pSyntaxParser->Release(); |
| 870 m_pSyntaxParser = nullptr; | 870 m_pSyntaxParser = nullptr; |
| 871 } | 871 } |
| 872 } | 872 } |
| 873 FX_BOOL CFDE_XMLDoc::LoadXML(IFX_Stream* pXMLStream, | |
| 874 int32_t iXMLPlaneSize, | |
| 875 int32_t iTextDataSize, | |
| 876 FDE_XMLREADERHANDLER* pHandler) { | |
| 877 if (!pXMLStream) | |
| 878 return FALSE; | |
| 879 | 873 |
| 880 Reset(TRUE); | |
| 881 iXMLPlaneSize = iXMLPlaneSize / 1024; | |
| 882 if (iXMLPlaneSize < 1) { | |
| 883 iXMLPlaneSize = 1; | |
| 884 } | |
| 885 iXMLPlaneSize *= 1024; | |
| 886 if (iXMLPlaneSize < 4096) { | |
| 887 iXMLPlaneSize = 4096; | |
| 888 } | |
| 889 iTextDataSize = iTextDataSize / 128; | |
| 890 if (iTextDataSize < 1) { | |
| 891 iTextDataSize = 1; | |
| 892 } | |
| 893 iTextDataSize *= 128; | |
| 894 if (iTextDataSize < 128) { | |
| 895 iTextDataSize = 128; | |
| 896 } | |
| 897 m_pStream = pXMLStream; | |
| 898 uint16_t wCodePage = m_pStream->GetCodePage(); | |
| 899 if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE && | |
| 900 wCodePage != FX_CODEPAGE_UTF8) { | |
| 901 m_pStream->SetCodePage(FX_CODEPAGE_UTF8); | |
| 902 } | |
| 903 m_pSyntaxParser = new CFDE_XMLSyntaxParser; | |
| 904 | |
| 905 m_pSyntaxParser->Init(m_pStream, iXMLPlaneSize, iTextDataSize); | |
| 906 if (pHandler) | |
| 907 m_pXMLParser = new CFDE_XMLSAXParser(pHandler, m_pSyntaxParser); | |
| 908 else | |
| 909 m_pXMLParser = new CFDE_XMLDOMParser(m_pRoot, m_pSyntaxParser); | |
| 910 return TRUE; | |
| 911 } | |
| 912 FX_BOOL CFDE_XMLDoc::LoadXML(CFDE_XMLParser* pXMLParser) { | 874 FX_BOOL CFDE_XMLDoc::LoadXML(CFDE_XMLParser* pXMLParser) { |
| 913 if (!pXMLParser) | 875 if (!pXMLParser) |
| 914 return FALSE; | 876 return FALSE; |
| 915 | 877 |
| 916 Reset(TRUE); | 878 Reset(TRUE); |
| 917 m_pXMLParser = pXMLParser; | 879 m_pXMLParser = pXMLParser; |
| 918 return !!m_pXMLParser; | 880 return !!m_pXMLParser; |
| 919 } | 881 } |
| 920 int32_t CFDE_XMLDoc::DoLoad(IFX_Pause* pPause) { | 882 int32_t CFDE_XMLDoc::DoLoad(IFX_Pause* pPause) { |
| 921 if (m_iStatus >= 100) | 883 if (m_iStatus >= 100) |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1053 CFDE_XMLNode* pNode = m_pRoot->m_pChild; | 1015 CFDE_XMLNode* pNode = m_pRoot->m_pChild; |
| 1054 while (pNode) { | 1016 while (pNode) { |
| 1055 SaveXMLNode(pXMLStream, static_cast<CFDE_XMLNode*>(pNode)); | 1017 SaveXMLNode(pXMLStream, static_cast<CFDE_XMLNode*>(pNode)); |
| 1056 pNode = pNode->m_pNext; | 1018 pNode = pNode->m_pNext; |
| 1057 } | 1019 } |
| 1058 if (pXMLStream == m_pStream) { | 1020 if (pXMLStream == m_pStream) { |
| 1059 int32_t iPos = pXMLStream->GetPosition(); | 1021 int32_t iPos = pXMLStream->GetPosition(); |
| 1060 pXMLStream->SetLength(iPos); | 1022 pXMLStream->SetLength(iPos); |
| 1061 } | 1023 } |
| 1062 } | 1024 } |
| 1063 CFDE_XMLDOMParser::CFDE_XMLDOMParser(CFDE_XMLNode* pRoot, | |
| 1064 CFDE_XMLSyntaxParser* pParser) | |
| 1065 : m_pParser(pParser), | |
| 1066 m_pParent(pRoot), | |
| 1067 m_pChild(nullptr), | |
| 1068 m_NodeStack(16), | |
| 1069 m_ws1(), | |
| 1070 m_ws2() { | |
| 1071 m_NodeStack.Push(m_pParent); | |
| 1072 } | |
| 1073 CFDE_XMLDOMParser::~CFDE_XMLDOMParser() { | |
| 1074 m_NodeStack.RemoveAll(); | |
| 1075 m_ws1.clear(); | |
| 1076 m_ws2.clear(); | |
| 1077 } | |
| 1078 | |
| 1079 int32_t CFDE_XMLDOMParser::DoParser(IFX_Pause* pPause) { | |
| 1080 FDE_XmlSyntaxResult syntaxParserResult; | |
| 1081 int32_t iCount = 0; | |
| 1082 while (TRUE) { | |
| 1083 syntaxParserResult = m_pParser->DoSyntaxParse(); | |
| 1084 switch (syntaxParserResult) { | |
| 1085 case FDE_XmlSyntaxResult::InstructionOpen: | |
| 1086 break; | |
| 1087 case FDE_XmlSyntaxResult::InstructionClose: | |
| 1088 if (m_pChild->GetType() != FDE_XMLNODE_Instruction) { | |
| 1089 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1090 break; | |
| 1091 } | |
| 1092 m_pChild = m_pParent; | |
| 1093 break; | |
| 1094 case FDE_XmlSyntaxResult::ElementOpen: | |
| 1095 case FDE_XmlSyntaxResult::ElementBreak: | |
| 1096 break; | |
| 1097 case FDE_XmlSyntaxResult::ElementClose: | |
| 1098 if (m_pChild->GetType() != FDE_XMLNODE_Element) { | |
| 1099 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1100 break; | |
| 1101 } | |
| 1102 m_pParser->GetTagName(m_ws1); | |
| 1103 ((CFDE_XMLElement*)m_pChild)->GetTagName(m_ws2); | |
| 1104 if (m_ws1.GetLength() > 0 && m_ws1.Compare(m_ws2) != 0) { | |
| 1105 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1106 break; | |
| 1107 } | |
| 1108 m_NodeStack.Pop(); | |
| 1109 if (m_NodeStack.GetSize() < 1) { | |
| 1110 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1111 break; | |
| 1112 } | |
| 1113 m_pParent = (CFDE_XMLNode*)*m_NodeStack.GetTopElement(); | |
| 1114 m_pChild = m_pParent; | |
| 1115 iCount++; | |
| 1116 break; | |
| 1117 case FDE_XmlSyntaxResult::TargetName: | |
| 1118 m_pParser->GetTargetName(m_ws1); | |
| 1119 m_pChild = new CFDE_XMLInstruction(m_ws1); | |
| 1120 m_pParent->InsertChildNode(m_pChild); | |
| 1121 m_ws1.clear(); | |
| 1122 break; | |
| 1123 case FDE_XmlSyntaxResult::TagName: | |
| 1124 m_pParser->GetTagName(m_ws1); | |
| 1125 m_pChild = new CFDE_XMLElement(m_ws1); | |
| 1126 m_pParent->InsertChildNode(m_pChild); | |
| 1127 m_NodeStack.Push(m_pChild); | |
| 1128 m_pParent = m_pChild; | |
| 1129 break; | |
| 1130 case FDE_XmlSyntaxResult::AttriName: | |
| 1131 m_pParser->GetAttributeName(m_ws1); | |
| 1132 break; | |
| 1133 case FDE_XmlSyntaxResult::AttriValue: | |
| 1134 if (!m_pChild) { | |
| 1135 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1136 break; | |
| 1137 } | |
| 1138 m_pParser->GetAttributeName(m_ws2); | |
| 1139 if (m_pChild->GetType() == FDE_XMLNODE_Element) { | |
| 1140 ((CFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2); | |
| 1141 } else if (m_pChild->GetType() == FDE_XMLNODE_Instruction) { | |
| 1142 ((CFDE_XMLInstruction*)m_pChild)->SetString(m_ws1, m_ws2); | |
| 1143 } | |
| 1144 m_ws1.clear(); | |
| 1145 break; | |
| 1146 case FDE_XmlSyntaxResult::Text: | |
| 1147 m_pParser->GetTextData(m_ws1); | |
| 1148 m_pChild = new CFDE_XMLText(m_ws1); | |
| 1149 m_pParent->InsertChildNode(m_pChild); | |
| 1150 m_pChild = m_pParent; | |
| 1151 break; | |
| 1152 case FDE_XmlSyntaxResult::CData: | |
| 1153 m_pParser->GetTextData(m_ws1); | |
| 1154 m_pChild = new CFDE_XMLCharData(m_ws1); | |
| 1155 m_pParent->InsertChildNode(m_pChild); | |
| 1156 m_pChild = m_pParent; | |
| 1157 break; | |
| 1158 case FDE_XmlSyntaxResult::TargetData: | |
| 1159 if (!m_pChild || m_pChild->GetType() != FDE_XMLNODE_Instruction) { | |
| 1160 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1161 break; | |
| 1162 } | |
| 1163 if (!m_ws1.IsEmpty()) { | |
| 1164 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); | |
| 1165 } | |
| 1166 m_pParser->GetTargetData(m_ws1); | |
| 1167 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); | |
| 1168 m_ws1.clear(); | |
| 1169 break; | |
| 1170 default: | |
| 1171 break; | |
| 1172 } | |
| 1173 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || | |
| 1174 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { | |
| 1175 break; | |
| 1176 } | |
| 1177 if (iCount > 500 && pPause && pPause->NeedToPauseNow()) | |
| 1178 break; | |
| 1179 } | |
| 1180 return m_pParser->GetStatus(); | |
| 1181 } | |
| 1182 | |
| 1183 CFDE_XMLSAXParser::CFDE_XMLSAXParser(FDE_XMLREADERHANDLER* pHandler, | |
| 1184 CFDE_XMLSyntaxParser* pParser) | |
| 1185 : m_pHandler(pHandler), | |
| 1186 m_pParser(pParser), | |
| 1187 m_TagStack(16), | |
| 1188 m_pTagTop(nullptr), | |
| 1189 m_ws1(), | |
| 1190 m_ws2() {} | |
| 1191 CFDE_XMLSAXParser::~CFDE_XMLSAXParser() { | |
| 1192 m_TagStack.RemoveAll(); | |
| 1193 m_ws1.clear(); | |
| 1194 m_ws2.clear(); | |
| 1195 } | |
| 1196 int32_t CFDE_XMLSAXParser::DoParser(IFX_Pause* pPause) { | |
| 1197 FDE_XmlSyntaxResult syntaxParserResult; | |
| 1198 int32_t iCount = 0; | |
| 1199 while (TRUE) { | |
| 1200 syntaxParserResult = m_pParser->DoSyntaxParse(); | |
| 1201 switch (syntaxParserResult) { | |
| 1202 case FDE_XmlSyntaxResult::ElementBreak: | |
| 1203 if (!m_pTagTop) { | |
| 1204 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1205 break; | |
| 1206 } | |
| 1207 if (m_pTagTop->eType == FDE_XMLNODE_Element) { | |
| 1208 m_pHandler->OnTagBreak(m_pHandler, m_pTagTop->wsTagName); | |
| 1209 } | |
| 1210 break; | |
| 1211 case FDE_XmlSyntaxResult::ElementClose: | |
| 1212 if (!m_pTagTop || m_pTagTop->eType != FDE_XMLNODE_Element) { | |
| 1213 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1214 break; | |
| 1215 } | |
| 1216 m_pParser->GetTagName(m_ws1); | |
| 1217 if (m_ws1.GetLength() > 0 && m_ws1.Compare(m_pTagTop->wsTagName) != 0) { | |
| 1218 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1219 break; | |
| 1220 } else if (m_ws1.GetLength() == 0) { | |
| 1221 m_pHandler->OnTagBreak(m_pHandler, m_pTagTop->wsTagName); | |
| 1222 } | |
| 1223 m_pHandler->OnTagClose(m_pHandler, m_pTagTop->wsTagName); | |
| 1224 Pop(); | |
| 1225 iCount++; | |
| 1226 break; | |
| 1227 case FDE_XmlSyntaxResult::TargetName: { | |
| 1228 m_pParser->GetTargetName(m_ws1); | |
| 1229 CFDE_XMLTAG xmlTag; | |
| 1230 xmlTag.wsTagName = m_ws1; | |
| 1231 xmlTag.eType = FDE_XMLNODE_Instruction; | |
| 1232 Push(xmlTag); | |
| 1233 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Instruction, | |
| 1234 m_pTagTop->wsTagName); | |
| 1235 m_ws1.clear(); | |
| 1236 } break; | |
| 1237 case FDE_XmlSyntaxResult::TagName: { | |
| 1238 m_pParser->GetTargetName(m_ws1); | |
| 1239 CFDE_XMLTAG xmlTag; | |
| 1240 xmlTag.wsTagName = m_ws1; | |
| 1241 xmlTag.eType = FDE_XMLNODE_Element; | |
| 1242 Push(xmlTag); | |
| 1243 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Element, | |
| 1244 m_pTagTop->wsTagName); | |
| 1245 } break; | |
| 1246 case FDE_XmlSyntaxResult::AttriName: | |
| 1247 m_pParser->GetTargetName(m_ws1); | |
| 1248 break; | |
| 1249 case FDE_XmlSyntaxResult::AttriValue: | |
| 1250 m_pParser->GetAttributeName(m_ws2); | |
| 1251 if (!m_pTagTop) { | |
| 1252 syntaxParserResult = FDE_XmlSyntaxResult::Error; | |
| 1253 break; | |
| 1254 } | |
| 1255 if (m_pTagTop->eType == FDE_XMLNODE_Element) { | |
| 1256 m_pHandler->OnAttribute(m_pHandler, m_ws1, m_ws2); | |
| 1257 } | |
| 1258 m_ws1.clear(); | |
| 1259 break; | |
| 1260 case FDE_XmlSyntaxResult::CData: | |
| 1261 m_pParser->GetTextData(m_ws1); | |
| 1262 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_CharData, m_ws1); | |
| 1263 break; | |
| 1264 case FDE_XmlSyntaxResult::Text: | |
| 1265 m_pParser->GetTextData(m_ws1); | |
| 1266 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Text, m_ws1); | |
| 1267 break; | |
| 1268 case FDE_XmlSyntaxResult::TargetData: | |
| 1269 m_pParser->GetTargetData(m_ws1); | |
| 1270 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Instruction, m_ws1); | |
| 1271 m_ws1.clear(); | |
| 1272 break; | |
| 1273 default: | |
| 1274 break; | |
| 1275 } | |
| 1276 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || | |
| 1277 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { | |
| 1278 break; | |
| 1279 } | |
| 1280 if (iCount > 500 && pPause && pPause->NeedToPauseNow()) | |
| 1281 break; | |
| 1282 } | |
| 1283 return m_pParser->GetStatus(); | |
| 1284 } | |
| 1285 | |
| 1286 inline void CFDE_XMLSAXParser::Push(const CFDE_XMLTAG& xmlTag) { | |
| 1287 m_TagStack.Push(xmlTag); | |
| 1288 m_pTagTop = m_TagStack.GetTopElement(); | |
| 1289 } | |
| 1290 inline void CFDE_XMLSAXParser::Pop() { | |
| 1291 m_TagStack.Pop(); | |
| 1292 m_pTagTop = m_TagStack.GetTopElement(); | |
| 1293 } | |
| 1294 | 1025 |
| 1295 CFDE_BlockBuffer::CFDE_BlockBuffer(int32_t iAllocStep) | 1026 CFDE_BlockBuffer::CFDE_BlockBuffer(int32_t iAllocStep) |
| 1296 : m_iDataLength(0), | 1027 : m_iDataLength(0), |
| 1297 m_iBufferSize(0), | 1028 m_iBufferSize(0), |
| 1298 m_iAllocStep(iAllocStep), | 1029 m_iAllocStep(iAllocStep), |
| 1299 m_iStartPosition(0) {} | 1030 m_iStartPosition(0) {} |
| 1300 CFDE_BlockBuffer::~CFDE_BlockBuffer() { | 1031 CFDE_BlockBuffer::~CFDE_BlockBuffer() { |
| 1301 ClearBuffer(); | 1032 ClearBuffer(); |
| 1302 } | 1033 } |
| 1303 FX_WCHAR* CFDE_BlockBuffer::GetAvailableBlock(int32_t& iIndexInBlock) { | 1034 FX_WCHAR* CFDE_BlockBuffer::GetAvailableBlock(int32_t& iIndexInBlock) { |
| (...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2064 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); | 1795 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); |
| 2065 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | 1796 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
| 2066 m_iEntityStart = -1; | 1797 m_iEntityStart = -1; |
| 2067 } else { | 1798 } else { |
| 2068 if (m_iEntityStart < 0 && ch == L'&') { | 1799 if (m_iEntityStart < 0 && ch == L'&') { |
| 2069 m_iEntityStart = m_iDataLength - 1; | 1800 m_iEntityStart = m_iDataLength - 1; |
| 2070 } | 1801 } |
| 2071 } | 1802 } |
| 2072 m_pStart++; | 1803 m_pStart++; |
| 2073 } | 1804 } |
| OLD | NEW |