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 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); | 674 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); |
675 if (iFind < 0) { | 675 if (iFind < 0) { |
676 wsTag = m_wsTag; | 676 wsTag = m_wsTag; |
677 } else { | 677 } else { |
678 wsTag = m_wsTag.Right(m_wsTag.GetLength() - iFind - 1); | 678 wsTag = m_wsTag.Right(m_wsTag.GetLength() - iFind - 1); |
679 } | 679 } |
680 } | 680 } |
681 void CFDE_XMLElement::GetNamespacePrefix(CFX_WideString& wsPrefix) const { | 681 void CFDE_XMLElement::GetNamespacePrefix(CFX_WideString& wsPrefix) const { |
682 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); | 682 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); |
683 if (iFind < 0) { | 683 if (iFind < 0) { |
684 wsPrefix.Empty(); | 684 wsPrefix.clear(); |
685 } else { | 685 } else { |
686 wsPrefix = m_wsTag.Left(iFind); | 686 wsPrefix = m_wsTag.Left(iFind); |
687 } | 687 } |
688 } | 688 } |
689 void CFDE_XMLElement::GetNamespaceURI(CFX_WideString& wsNamespace) const { | 689 void CFDE_XMLElement::GetNamespaceURI(CFX_WideString& wsNamespace) const { |
690 CFX_WideString wsAttri(L"xmlns"), wsPrefix; | 690 CFX_WideString wsAttri(L"xmlns"), wsPrefix; |
691 GetNamespacePrefix(wsPrefix); | 691 GetNamespacePrefix(wsPrefix); |
692 if (wsPrefix.GetLength() > 0) { | 692 if (wsPrefix.GetLength() > 0) { |
693 wsAttri += L":"; | 693 wsAttri += L":"; |
694 wsAttri += wsPrefix; | 694 wsAttri += wsPrefix; |
695 } | 695 } |
696 wsNamespace.Empty(); | 696 wsNamespace.clear(); |
697 CFDE_XMLNode* pNode = (CFDE_XMLNode*)this; | 697 CFDE_XMLNode* pNode = (CFDE_XMLNode*)this; |
698 while (pNode != NULL) { | 698 while (pNode != NULL) { |
699 if (pNode->GetType() != FDE_XMLNODE_Element) { | 699 if (pNode->GetType() != FDE_XMLNODE_Element) { |
700 break; | 700 break; |
701 } | 701 } |
702 CFDE_XMLElement* pElement = (CFDE_XMLElement*)pNode; | 702 CFDE_XMLElement* pElement = (CFDE_XMLElement*)pNode; |
703 if (!pElement->HasAttribute(wsAttri.c_str())) { | 703 if (!pElement->HasAttribute(wsAttri.c_str())) { |
704 pNode = pNode->GetNodeItem(CFDE_XMLNode::Parent); | 704 pNode = pNode->GetNodeItem(CFDE_XMLNode::Parent); |
705 continue; | 705 continue; |
706 } | 706 } |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1079 : m_pParser(pParser), | 1079 : m_pParser(pParser), |
1080 m_pParent(pRoot), | 1080 m_pParent(pRoot), |
1081 m_pChild(NULL), | 1081 m_pChild(NULL), |
1082 m_NodeStack(16), | 1082 m_NodeStack(16), |
1083 m_ws1(), | 1083 m_ws1(), |
1084 m_ws2() { | 1084 m_ws2() { |
1085 m_NodeStack.Push(m_pParent); | 1085 m_NodeStack.Push(m_pParent); |
1086 } | 1086 } |
1087 CFDE_XMLDOMParser::~CFDE_XMLDOMParser() { | 1087 CFDE_XMLDOMParser::~CFDE_XMLDOMParser() { |
1088 m_NodeStack.RemoveAll(); | 1088 m_NodeStack.RemoveAll(); |
1089 m_ws1.Empty(); | 1089 m_ws1.clear(); |
1090 m_ws2.Empty(); | 1090 m_ws2.clear(); |
1091 } | 1091 } |
1092 | 1092 |
1093 int32_t CFDE_XMLDOMParser::DoParser(IFX_Pause* pPause) { | 1093 int32_t CFDE_XMLDOMParser::DoParser(IFX_Pause* pPause) { |
1094 FDE_XmlSyntaxResult syntaxParserResult; | 1094 FDE_XmlSyntaxResult syntaxParserResult; |
1095 int32_t iCount = 0; | 1095 int32_t iCount = 0; |
1096 while (TRUE) { | 1096 while (TRUE) { |
1097 syntaxParserResult = m_pParser->DoSyntaxParse(); | 1097 syntaxParserResult = m_pParser->DoSyntaxParse(); |
1098 switch (syntaxParserResult) { | 1098 switch (syntaxParserResult) { |
1099 case FDE_XmlSyntaxResult::InstructionOpen: | 1099 case FDE_XmlSyntaxResult::InstructionOpen: |
1100 break; | 1100 break; |
(...skipping 24 matching lines...) Expand all Loading... |
1125 break; | 1125 break; |
1126 } | 1126 } |
1127 m_pParent = (CFDE_XMLNode*)*m_NodeStack.GetTopElement(); | 1127 m_pParent = (CFDE_XMLNode*)*m_NodeStack.GetTopElement(); |
1128 m_pChild = m_pParent; | 1128 m_pChild = m_pParent; |
1129 iCount++; | 1129 iCount++; |
1130 break; | 1130 break; |
1131 case FDE_XmlSyntaxResult::TargetName: | 1131 case FDE_XmlSyntaxResult::TargetName: |
1132 m_pParser->GetTargetName(m_ws1); | 1132 m_pParser->GetTargetName(m_ws1); |
1133 m_pChild = new CFDE_XMLInstruction(m_ws1); | 1133 m_pChild = new CFDE_XMLInstruction(m_ws1); |
1134 m_pParent->InsertChildNode(m_pChild); | 1134 m_pParent->InsertChildNode(m_pChild); |
1135 m_ws1.Empty(); | 1135 m_ws1.clear(); |
1136 break; | 1136 break; |
1137 case FDE_XmlSyntaxResult::TagName: | 1137 case FDE_XmlSyntaxResult::TagName: |
1138 m_pParser->GetTagName(m_ws1); | 1138 m_pParser->GetTagName(m_ws1); |
1139 m_pChild = new CFDE_XMLElement(m_ws1); | 1139 m_pChild = new CFDE_XMLElement(m_ws1); |
1140 m_pParent->InsertChildNode(m_pChild); | 1140 m_pParent->InsertChildNode(m_pChild); |
1141 m_NodeStack.Push(m_pChild); | 1141 m_NodeStack.Push(m_pChild); |
1142 m_pParent = m_pChild; | 1142 m_pParent = m_pChild; |
1143 break; | 1143 break; |
1144 case FDE_XmlSyntaxResult::AttriName: | 1144 case FDE_XmlSyntaxResult::AttriName: |
1145 m_pParser->GetAttributeName(m_ws1); | 1145 m_pParser->GetAttributeName(m_ws1); |
1146 break; | 1146 break; |
1147 case FDE_XmlSyntaxResult::AttriValue: | 1147 case FDE_XmlSyntaxResult::AttriValue: |
1148 if (m_pChild == NULL) { | 1148 if (m_pChild == NULL) { |
1149 syntaxParserResult = FDE_XmlSyntaxResult::Error; | 1149 syntaxParserResult = FDE_XmlSyntaxResult::Error; |
1150 break; | 1150 break; |
1151 } | 1151 } |
1152 m_pParser->GetAttributeName(m_ws2); | 1152 m_pParser->GetAttributeName(m_ws2); |
1153 if (m_pChild->GetType() == FDE_XMLNODE_Element) { | 1153 if (m_pChild->GetType() == FDE_XMLNODE_Element) { |
1154 ((CFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2); | 1154 ((CFDE_XMLElement*)m_pChild)->SetString(m_ws1, m_ws2); |
1155 } else if (m_pChild->GetType() == FDE_XMLNODE_Instruction) { | 1155 } else if (m_pChild->GetType() == FDE_XMLNODE_Instruction) { |
1156 ((CFDE_XMLInstruction*)m_pChild)->SetString(m_ws1, m_ws2); | 1156 ((CFDE_XMLInstruction*)m_pChild)->SetString(m_ws1, m_ws2); |
1157 } | 1157 } |
1158 m_ws1.Empty(); | 1158 m_ws1.clear(); |
1159 break; | 1159 break; |
1160 case FDE_XmlSyntaxResult::Text: | 1160 case FDE_XmlSyntaxResult::Text: |
1161 m_pParser->GetTextData(m_ws1); | 1161 m_pParser->GetTextData(m_ws1); |
1162 m_pChild = new CFDE_XMLText(m_ws1); | 1162 m_pChild = new CFDE_XMLText(m_ws1); |
1163 m_pParent->InsertChildNode(m_pChild); | 1163 m_pParent->InsertChildNode(m_pChild); |
1164 m_pChild = m_pParent; | 1164 m_pChild = m_pParent; |
1165 break; | 1165 break; |
1166 case FDE_XmlSyntaxResult::CData: | 1166 case FDE_XmlSyntaxResult::CData: |
1167 m_pParser->GetTextData(m_ws1); | 1167 m_pParser->GetTextData(m_ws1); |
1168 m_pChild = new CFDE_XMLCharData(m_ws1); | 1168 m_pChild = new CFDE_XMLCharData(m_ws1); |
1169 m_pParent->InsertChildNode(m_pChild); | 1169 m_pParent->InsertChildNode(m_pChild); |
1170 m_pChild = m_pParent; | 1170 m_pChild = m_pParent; |
1171 break; | 1171 break; |
1172 case FDE_XmlSyntaxResult::TargetData: | 1172 case FDE_XmlSyntaxResult::TargetData: |
1173 if (m_pChild == NULL || | 1173 if (m_pChild == NULL || |
1174 m_pChild->GetType() != FDE_XMLNODE_Instruction) { | 1174 m_pChild->GetType() != FDE_XMLNODE_Instruction) { |
1175 syntaxParserResult = FDE_XmlSyntaxResult::Error; | 1175 syntaxParserResult = FDE_XmlSyntaxResult::Error; |
1176 break; | 1176 break; |
1177 } | 1177 } |
1178 if (!m_ws1.IsEmpty()) { | 1178 if (!m_ws1.IsEmpty()) { |
1179 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); | 1179 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); |
1180 } | 1180 } |
1181 m_pParser->GetTargetData(m_ws1); | 1181 m_pParser->GetTargetData(m_ws1); |
1182 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); | 1182 ((CFDE_XMLInstruction*)m_pChild)->AppendData(m_ws1); |
1183 m_ws1.Empty(); | 1183 m_ws1.clear(); |
1184 break; | 1184 break; |
1185 default: | 1185 default: |
1186 break; | 1186 break; |
1187 } | 1187 } |
1188 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || | 1188 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || |
1189 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { | 1189 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { |
1190 break; | 1190 break; |
1191 } | 1191 } |
1192 if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { | 1192 if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { |
1193 break; | 1193 break; |
1194 } | 1194 } |
1195 } | 1195 } |
1196 return m_pParser->GetStatus(); | 1196 return m_pParser->GetStatus(); |
1197 } | 1197 } |
1198 CFDE_XMLSAXParser::CFDE_XMLSAXParser(FDE_XMLREADERHANDLER* pHandler, | 1198 CFDE_XMLSAXParser::CFDE_XMLSAXParser(FDE_XMLREADERHANDLER* pHandler, |
1199 CFDE_XMLSyntaxParser* pParser) | 1199 CFDE_XMLSyntaxParser* pParser) |
1200 : m_pHandler(pHandler), | 1200 : m_pHandler(pHandler), |
1201 m_pParser(pParser), | 1201 m_pParser(pParser), |
1202 m_TagStack(16), | 1202 m_TagStack(16), |
1203 m_pTagTop(NULL), | 1203 m_pTagTop(NULL), |
1204 m_ws1(), | 1204 m_ws1(), |
1205 m_ws2() {} | 1205 m_ws2() {} |
1206 CFDE_XMLSAXParser::~CFDE_XMLSAXParser() { | 1206 CFDE_XMLSAXParser::~CFDE_XMLSAXParser() { |
1207 m_TagStack.RemoveAll(); | 1207 m_TagStack.RemoveAll(); |
1208 m_ws1.Empty(); | 1208 m_ws1.clear(); |
1209 m_ws2.Empty(); | 1209 m_ws2.clear(); |
1210 } | 1210 } |
1211 int32_t CFDE_XMLSAXParser::DoParser(IFX_Pause* pPause) { | 1211 int32_t CFDE_XMLSAXParser::DoParser(IFX_Pause* pPause) { |
1212 FDE_XmlSyntaxResult syntaxParserResult; | 1212 FDE_XmlSyntaxResult syntaxParserResult; |
1213 int32_t iCount = 0; | 1213 int32_t iCount = 0; |
1214 while (TRUE) { | 1214 while (TRUE) { |
1215 syntaxParserResult = m_pParser->DoSyntaxParse(); | 1215 syntaxParserResult = m_pParser->DoSyntaxParse(); |
1216 switch (syntaxParserResult) { | 1216 switch (syntaxParserResult) { |
1217 case FDE_XmlSyntaxResult::ElementBreak: | 1217 case FDE_XmlSyntaxResult::ElementBreak: |
1218 if (m_pTagTop == NULL) { | 1218 if (m_pTagTop == NULL) { |
1219 syntaxParserResult = FDE_XmlSyntaxResult::Error; | 1219 syntaxParserResult = FDE_XmlSyntaxResult::Error; |
(...skipping 20 matching lines...) Expand all Loading... |
1240 iCount++; | 1240 iCount++; |
1241 break; | 1241 break; |
1242 case FDE_XmlSyntaxResult::TargetName: { | 1242 case FDE_XmlSyntaxResult::TargetName: { |
1243 m_pParser->GetTargetName(m_ws1); | 1243 m_pParser->GetTargetName(m_ws1); |
1244 CFDE_XMLTAG xmlTag; | 1244 CFDE_XMLTAG xmlTag; |
1245 xmlTag.wsTagName = m_ws1; | 1245 xmlTag.wsTagName = m_ws1; |
1246 xmlTag.eType = FDE_XMLNODE_Instruction; | 1246 xmlTag.eType = FDE_XMLNODE_Instruction; |
1247 Push(xmlTag); | 1247 Push(xmlTag); |
1248 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Instruction, | 1248 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Instruction, |
1249 m_pTagTop->wsTagName); | 1249 m_pTagTop->wsTagName); |
1250 m_ws1.Empty(); | 1250 m_ws1.clear(); |
1251 } break; | 1251 } break; |
1252 case FDE_XmlSyntaxResult::TagName: { | 1252 case FDE_XmlSyntaxResult::TagName: { |
1253 m_pParser->GetTargetName(m_ws1); | 1253 m_pParser->GetTargetName(m_ws1); |
1254 CFDE_XMLTAG xmlTag; | 1254 CFDE_XMLTAG xmlTag; |
1255 xmlTag.wsTagName = m_ws1; | 1255 xmlTag.wsTagName = m_ws1; |
1256 xmlTag.eType = FDE_XMLNODE_Element; | 1256 xmlTag.eType = FDE_XMLNODE_Element; |
1257 Push(xmlTag); | 1257 Push(xmlTag); |
1258 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Element, | 1258 m_pHandler->OnTagEnter(m_pHandler, FDE_XMLNODE_Element, |
1259 m_pTagTop->wsTagName); | 1259 m_pTagTop->wsTagName); |
1260 } break; | 1260 } break; |
1261 case FDE_XmlSyntaxResult::AttriName: | 1261 case FDE_XmlSyntaxResult::AttriName: |
1262 m_pParser->GetTargetName(m_ws1); | 1262 m_pParser->GetTargetName(m_ws1); |
1263 break; | 1263 break; |
1264 case FDE_XmlSyntaxResult::AttriValue: | 1264 case FDE_XmlSyntaxResult::AttriValue: |
1265 m_pParser->GetAttributeName(m_ws2); | 1265 m_pParser->GetAttributeName(m_ws2); |
1266 if (m_pTagTop == NULL) { | 1266 if (m_pTagTop == NULL) { |
1267 syntaxParserResult = FDE_XmlSyntaxResult::Error; | 1267 syntaxParserResult = FDE_XmlSyntaxResult::Error; |
1268 break; | 1268 break; |
1269 } | 1269 } |
1270 if (m_pTagTop->eType == FDE_XMLNODE_Element) { | 1270 if (m_pTagTop->eType == FDE_XMLNODE_Element) { |
1271 m_pHandler->OnAttribute(m_pHandler, m_ws1, m_ws2); | 1271 m_pHandler->OnAttribute(m_pHandler, m_ws1, m_ws2); |
1272 } | 1272 } |
1273 m_ws1.Empty(); | 1273 m_ws1.clear(); |
1274 break; | 1274 break; |
1275 case FDE_XmlSyntaxResult::CData: | 1275 case FDE_XmlSyntaxResult::CData: |
1276 m_pParser->GetTextData(m_ws1); | 1276 m_pParser->GetTextData(m_ws1); |
1277 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_CharData, m_ws1); | 1277 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_CharData, m_ws1); |
1278 break; | 1278 break; |
1279 case FDE_XmlSyntaxResult::Text: | 1279 case FDE_XmlSyntaxResult::Text: |
1280 m_pParser->GetTextData(m_ws1); | 1280 m_pParser->GetTextData(m_ws1); |
1281 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Text, m_ws1); | 1281 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Text, m_ws1); |
1282 break; | 1282 break; |
1283 case FDE_XmlSyntaxResult::TargetData: | 1283 case FDE_XmlSyntaxResult::TargetData: |
1284 m_pParser->GetTargetData(m_ws1); | 1284 m_pParser->GetTargetData(m_ws1); |
1285 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Instruction, m_ws1); | 1285 m_pHandler->OnData(m_pHandler, FDE_XMLNODE_Instruction, m_ws1); |
1286 m_ws1.Empty(); | 1286 m_ws1.clear(); |
1287 break; | 1287 break; |
1288 default: | 1288 default: |
1289 break; | 1289 break; |
1290 } | 1290 } |
1291 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || | 1291 if (syntaxParserResult == FDE_XmlSyntaxResult::Error || |
1292 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { | 1292 syntaxParserResult == FDE_XmlSyntaxResult::EndOfString) { |
1293 break; | 1293 break; |
1294 } | 1294 } |
1295 if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { | 1295 if (pPause != NULL && iCount > 500 && pPause->NeedToPauseNow()) { |
1296 break; | 1296 break; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1373 m_iStartPosition += iCount; | 1373 m_iStartPosition += iCount; |
1374 m_iDataLength -= iCount; | 1374 m_iDataLength -= iCount; |
1375 } else { | 1375 } else { |
1376 m_iDataLength -= iCount; | 1376 m_iDataLength -= iCount; |
1377 } | 1377 } |
1378 return m_iDataLength; | 1378 return m_iDataLength; |
1379 } | 1379 } |
1380 void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData, | 1380 void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData, |
1381 int32_t iStart, | 1381 int32_t iStart, |
1382 int32_t iLength) const { | 1382 int32_t iLength) const { |
1383 wsTextData.Empty(); | 1383 wsTextData.clear(); |
1384 int32_t iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition; | 1384 int32_t iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition; |
1385 if (iStart < 0 || iStart > iMaybeDataLength) { | 1385 if (iStart < 0 || iStart > iMaybeDataLength) { |
1386 return; | 1386 return; |
1387 } | 1387 } |
1388 if (iLength == -1 || iLength > iMaybeDataLength) { | 1388 if (iLength == -1 || iLength > iMaybeDataLength) { |
1389 iLength = iMaybeDataLength; | 1389 iLength = iMaybeDataLength; |
1390 } | 1390 } |
1391 if (iLength <= 0) { | 1391 if (iLength <= 0) { |
1392 return; | 1392 return; |
1393 } | 1393 } |
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2074 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); | 2074 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); |
2075 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | 2075 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
2076 m_iEntityStart = -1; | 2076 m_iEntityStart = -1; |
2077 } else { | 2077 } else { |
2078 if (m_iEntityStart < 0 && ch == L'&') { | 2078 if (m_iEntityStart < 0 && ch == L'&') { |
2079 m_iEntityStart = m_iDataLength - 1; | 2079 m_iEntityStart = m_iDataLength - 1; |
2080 } | 2080 } |
2081 } | 2081 } |
2082 m_pStart++; | 2082 m_pStart++; |
2083 } | 2083 } |
OLD | NEW |