Chromium Code Reviews| 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/fgas/xml/fgas_sax.h" | 7 #include "xfa/fde/xml/cfx_saxreader.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "xfa/fxfa/include/xfa_checksum.h" | 11 #include "xfa/fxfa/include/xfa_checksum.h" |
| 12 | 12 |
| 13 enum class CFX_SaxMode { | |
| 14 Text = 0, | |
| 15 NodeStart, | |
| 16 DeclOrComment, | |
| 17 DeclNode, | |
| 18 Comment, | |
| 19 CommentContent, | |
| 20 TagName, | |
| 21 TagAttributeName, | |
| 22 TagAttributeEqual, | |
| 23 TagAttributeValue, | |
| 24 TagMaybeClose, | |
| 25 TagClose, | |
| 26 TagEnd, | |
| 27 TargetData, | |
| 28 MAX | |
| 29 }; | |
| 30 | |
| 31 class CFX_SAXItem { | |
| 32 public: | |
| 33 CFX_SAXItem() | |
| 34 : m_pNode(NULL), | |
|
Tom Sepez
2016/05/18 20:14:12
nit: nullptrs
dsinclair
2016/05/18 20:24:52
Done.
| |
| 35 m_eNode(CFX_SaxNode::Unknown), | |
| 36 m_dwID(0), | |
| 37 m_bSkip(FALSE), | |
| 38 m_pPrev(NULL), | |
| 39 m_pNext(NULL) {} | |
| 40 void* m_pNode; | |
|
Tom Sepez
2016/05/18 20:14:12
nit: blank line before
dsinclair
2016/05/18 20:24:52
Done.
| |
| 41 CFX_SaxNode m_eNode; | |
| 42 uint32_t m_dwID; | |
| 43 FX_BOOL m_bSkip; | |
| 44 CFX_SAXItem* m_pPrev; | |
| 45 CFX_SAXItem* m_pNext; | |
| 46 }; | |
| 47 | |
| 48 class CFX_SAXCommentContext { | |
| 49 public: | |
| 50 CFX_SAXCommentContext() : m_iHeaderCount(0), m_iTailCount(0) {} | |
| 51 int32_t m_iHeaderCount; | |
| 52 int32_t m_iTailCount; | |
| 53 }; | |
| 54 | |
| 13 namespace { | 55 namespace { |
| 14 | 56 |
| 15 const uint32_t kSaxFileBufSize = 32768; | 57 const uint32_t kSaxFileBufSize = 32768; |
| 16 | 58 |
| 59 typedef void (CFX_SAXReader::*FX_SAXReader_LPFParse)(); | |
| 60 static const FX_SAXReader_LPFParse | |
| 61 g_FX_SAXReader_LPFParse[static_cast<int>(CFX_SaxMode::MAX)] = { | |
| 62 &CFX_SAXReader::ParseText, | |
| 63 &CFX_SAXReader::ParseNodeStart, | |
| 64 &CFX_SAXReader::ParseDeclOrComment, | |
| 65 &CFX_SAXReader::ParseDeclNode, | |
| 66 &CFX_SAXReader::ParseComment, | |
| 67 &CFX_SAXReader::ParseCommentContent, | |
| 68 &CFX_SAXReader::ParseTagName, | |
| 69 &CFX_SAXReader::ParseTagAttributeName, | |
| 70 &CFX_SAXReader::ParseTagAttributeEqual, | |
| 71 &CFX_SAXReader::ParseTagAttributeValue, | |
| 72 &CFX_SAXReader::ParseMaybeClose, | |
| 73 &CFX_SAXReader::ParseTagClose, | |
| 74 &CFX_SAXReader::ParseTagEnd, | |
| 75 &CFX_SAXReader::ParseTargetData, | |
| 76 }; | |
| 77 | |
| 17 } // namespace | 78 } // namespace |
| 18 | 79 |
| 19 CFX_SAXFile::CFX_SAXFile() | 80 CFX_SAXFile::CFX_SAXFile() |
| 20 : m_pFile(NULL), | 81 : m_pFile(NULL), |
| 21 m_dwStart(0), | 82 m_dwStart(0), |
| 22 m_dwEnd(0), | 83 m_dwEnd(0), |
| 23 m_dwCur(0), | 84 m_dwCur(0), |
| 24 m_pBuf(NULL), | 85 m_pBuf(NULL), |
| 25 m_dwBufSize(0), | 86 m_dwBufSize(0), |
| 26 m_dwBufIndex(0) {} | 87 m_dwBufIndex(0) {} |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 158 return; | 219 return; |
| 159 } | 220 } |
| 160 if (m_iNameSize <= 1024 * 1024) { | 221 if (m_iNameSize <= 1024 * 1024) { |
| 161 m_iNameSize *= 2; | 222 m_iNameSize *= 2; |
| 162 } else { | 223 } else { |
| 163 m_iNameSize += 1024 * 1024; | 224 m_iNameSize += 1024 * 1024; |
| 164 } | 225 } |
| 165 m_pszName = (uint8_t*)FX_Realloc(uint8_t, m_pszName, m_iNameSize); | 226 m_pszName = (uint8_t*)FX_Realloc(uint8_t, m_pszName, m_iNameSize); |
| 166 } | 227 } |
| 167 inline FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) { | 228 inline FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) { |
| 168 return (m_dwParseMode & FX_SAXPARSEMODE_NotSkipSpace) == 0 && ch < 0x21; | 229 return (m_dwParseMode & CFX_SaxParseMode_NotSkipSpace) == 0 && ch < 0x21; |
| 169 } | 230 } |
| 170 int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, | 231 int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, |
| 171 uint32_t dwStart, | 232 uint32_t dwStart, |
| 172 uint32_t dwLen, | 233 uint32_t dwLen, |
| 173 uint32_t dwParseMode) { | 234 uint32_t dwParseMode) { |
| 174 m_iState = -1; | 235 m_iState = -1; |
| 175 Reset(); | 236 Reset(); |
| 176 if (!m_File.StartFile(pFile, dwStart, dwLen)) { | 237 if (!m_File.StartFile(pFile, dwStart, dwLen)) { |
| 177 return -1; | 238 return -1; |
| 178 } | 239 } |
| 179 m_iState = 0; | 240 m_iState = 0; |
| 180 m_eMode = FX_SAXMODE_Text; | 241 m_eMode = CFX_SaxMode::Text; |
| 181 m_ePrevMode = FX_SAXMODE_Text; | 242 m_ePrevMode = CFX_SaxMode::Text; |
| 182 m_bCharData = FALSE; | 243 m_bCharData = FALSE; |
| 183 m_dwDataOffset = 0; | 244 m_dwDataOffset = 0; |
| 184 m_pRoot = m_pCurItem = new CFX_SAXItem; | 245 m_pRoot = m_pCurItem = new CFX_SAXItem; |
| 185 m_pCurItem->m_dwID = ++m_dwItemID; | 246 m_pCurItem->m_dwID = ++m_dwItemID; |
| 186 m_dwParseMode = dwParseMode; | 247 m_dwParseMode = dwParseMode; |
| 187 return 0; | 248 return 0; |
| 188 } | 249 } |
| 189 typedef void (CFX_SAXReader::*FX_SAXReader_LPFParse)(); | 250 |
| 190 static const FX_SAXReader_LPFParse g_FX_SAXReader_LPFParse[FX_SAXMODE_MAX] = { | |
| 191 &CFX_SAXReader::ParseText, | |
| 192 &CFX_SAXReader::ParseNodeStart, | |
| 193 &CFX_SAXReader::ParseDeclOrComment, | |
| 194 &CFX_SAXReader::ParseDeclNode, | |
| 195 &CFX_SAXReader::ParseComment, | |
| 196 &CFX_SAXReader::ParseCommentContent, | |
| 197 &CFX_SAXReader::ParseTagName, | |
| 198 &CFX_SAXReader::ParseTagAttributeName, | |
| 199 &CFX_SAXReader::ParseTagAttributeEqual, | |
| 200 &CFX_SAXReader::ParseTagAttributeValue, | |
| 201 &CFX_SAXReader::ParseMaybeClose, | |
| 202 &CFX_SAXReader::ParseTagClose, | |
| 203 &CFX_SAXReader::ParseTagEnd, | |
| 204 &CFX_SAXReader::ParseTargetData, | |
| 205 }; | |
| 206 int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) { | 251 int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) { |
| 207 if (m_iState < 0 || m_iState > 99) { | 252 if (m_iState < 0 || m_iState > 99) { |
| 208 return m_iState; | 253 return m_iState; |
| 209 } | 254 } |
| 210 while (m_File.m_dwCur < m_File.m_dwEnd) { | 255 while (m_File.m_dwCur < m_File.m_dwEnd) { |
| 211 uint32_t& index = m_File.m_dwBufIndex; | 256 uint32_t& index = m_File.m_dwBufIndex; |
| 212 uint32_t size = m_File.m_dwBufSize; | 257 uint32_t size = m_File.m_dwBufSize; |
| 213 const uint8_t* pBuf = m_File.m_pBuf; | 258 const uint8_t* pBuf = m_File.m_pBuf; |
| 214 while (index < size) { | 259 while (index < size) { |
| 215 m_CurByte = pBuf[index]; | 260 m_CurByte = pBuf[index]; |
| 216 (this->*g_FX_SAXReader_LPFParse[m_eMode])(); | 261 (this->*g_FX_SAXReader_LPFParse[static_cast<int>(m_eMode)])(); |
| 217 index++; | 262 index++; |
| 218 } | 263 } |
| 219 m_File.m_dwCur += index; | 264 m_File.m_dwCur += index; |
| 220 m_iState = (m_File.m_dwCur - m_File.m_dwStart) * 100 / | 265 m_iState = (m_File.m_dwCur - m_File.m_dwStart) * 100 / |
| 221 (m_File.m_dwEnd - m_File.m_dwStart); | 266 (m_File.m_dwEnd - m_File.m_dwStart); |
| 222 if (m_File.m_dwCur >= m_File.m_dwEnd) { | 267 if (m_File.m_dwCur >= m_File.m_dwEnd) { |
| 223 break; | 268 break; |
| 224 } | 269 } |
| 225 if (!m_File.ReadNextBlock()) { | 270 if (!m_File.ReadNextBlock()) { |
| 226 m_iState = -2; | 271 m_iState = -2; |
| 227 break; | 272 break; |
| 228 } | 273 } |
| 229 m_dwDataOffset = 0; | 274 m_dwDataOffset = 0; |
| 230 if (pPause && pPause->NeedToPauseNow()) { | 275 if (pPause && pPause->NeedToPauseNow()) { |
| 231 break; | 276 break; |
| 232 } | 277 } |
| 233 } | 278 } |
| 234 return m_iState; | 279 return m_iState; |
| 235 } | 280 } |
| 236 void CFX_SAXReader::ParseChar(uint8_t ch) { | 281 void CFX_SAXReader::ParseChar(uint8_t ch) { |
| 237 ReallocDataBuffer(); | 282 ReallocDataBuffer(); |
| 238 m_pszData[m_iDataPos] = ch; | 283 m_pszData[m_iDataPos] = ch; |
| 239 if (m_iEntityStart > -1 && ch == ';') { | 284 if (m_iEntityStart > -1 && ch == ';') { |
| 240 int32_t iSaveEntityStart = m_iEntityStart; | 285 int32_t iSaveEntityStart = m_iEntityStart; |
| 241 CFX_ByteString csEntity(m_pszData + m_iEntityStart + 1, | 286 CFX_ByteString csEntity(m_pszData + m_iEntityStart + 1, |
| 242 m_iDataPos - m_iEntityStart - 1); | 287 m_iDataPos - m_iEntityStart - 1); |
| 243 int32_t iLen = csEntity.GetLength(); | 288 int32_t iLen = csEntity.GetLength(); |
| 244 if (iLen > 0) { | 289 if (iLen > 0) { |
| 245 if (csEntity[0] == '#') { | 290 if (csEntity[0] == '#') { |
| 246 if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_sharp) == 0) { | 291 if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_sharp) == 0) { |
| 247 ch = 0; | 292 ch = 0; |
| 248 uint8_t w; | 293 uint8_t w; |
| 249 if (iLen > 1 && csEntity[1] == 'x') { | 294 if (iLen > 1 && csEntity[1] == 'x') { |
| 250 for (int32_t i = 2; i < iLen; i++) { | 295 for (int32_t i = 2; i < iLen; i++) { |
| 251 w = csEntity[i]; | 296 w = csEntity[i]; |
| 252 if (w >= '0' && w <= '9') { | 297 if (w >= '0' && w <= '9') { |
| 253 ch = (ch << 4) + w - '0'; | 298 ch = (ch << 4) + w - '0'; |
| 254 } else if (w >= 'A' && w <= 'F') { | 299 } else if (w >= 'A' && w <= 'F') { |
| 255 ch = (ch << 4) + w - 55; | 300 ch = (ch << 4) + w - 55; |
| 256 } else if (w >= 'a' && w <= 'f') { | 301 } else if (w >= 'a' && w <= 'f') { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 267 } | 312 } |
| 268 ch = ch * 10 + w - '0'; | 313 ch = ch * 10 + w - '0'; |
| 269 } | 314 } |
| 270 } | 315 } |
| 271 if (ch != 0) { | 316 if (ch != 0) { |
| 272 m_pszData[m_iEntityStart++] = ch; | 317 m_pszData[m_iEntityStart++] = ch; |
| 273 } | 318 } |
| 274 } | 319 } |
| 275 } else { | 320 } else { |
| 276 if (csEntity.Compare("amp") == 0) { | 321 if (csEntity.Compare("amp") == 0) { |
| 277 if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_amp) == 0) { | 322 if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_amp) == 0) { |
| 278 m_pszData[m_iEntityStart++] = '&'; | 323 m_pszData[m_iEntityStart++] = '&'; |
| 279 } | 324 } |
| 280 } else if (csEntity.Compare("lt") == 0) { | 325 } else if (csEntity.Compare("lt") == 0) { |
| 281 if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_lt) == 0) { | 326 if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_lt) == 0) { |
| 282 m_pszData[m_iEntityStart++] = '<'; | 327 m_pszData[m_iEntityStart++] = '<'; |
| 283 } | 328 } |
| 284 } else if (csEntity.Compare("gt") == 0) { | 329 } else if (csEntity.Compare("gt") == 0) { |
| 285 if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_gt) == 0) { | 330 if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_gt) == 0) { |
| 286 m_pszData[m_iEntityStart++] = '>'; | 331 m_pszData[m_iEntityStart++] = '>'; |
| 287 } | 332 } |
| 288 } else if (csEntity.Compare("apos") == 0) { | 333 } else if (csEntity.Compare("apos") == 0) { |
| 289 if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_apos) == 0) { | 334 if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_apos) == 0) { |
| 290 m_pszData[m_iEntityStart++] = '\''; | 335 m_pszData[m_iEntityStart++] = '\''; |
| 291 } | 336 } |
| 292 } else if (csEntity.Compare("quot") == 0) { | 337 } else if (csEntity.Compare("quot") == 0) { |
| 293 if ((m_dwParseMode & FX_SAXPARSEMODE_NotConvert_quot) == 0) { | 338 if ((m_dwParseMode & CFX_SaxParseMode_NotConvert_quot) == 0) { |
| 294 m_pszData[m_iEntityStart++] = '\"'; | 339 m_pszData[m_iEntityStart++] = '\"'; |
| 295 } | 340 } |
| 296 } | 341 } |
| 297 } | 342 } |
| 298 } | 343 } |
| 299 if (iSaveEntityStart != m_iEntityStart) { | 344 if (iSaveEntityStart != m_iEntityStart) { |
| 300 m_iDataPos = m_iEntityStart; | 345 m_iDataPos = m_iEntityStart; |
| 301 m_iEntityStart = -1; | 346 m_iEntityStart = -1; |
| 302 } else { | 347 } else { |
| 303 m_iDataPos++; | 348 m_iDataPos++; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 314 if (m_CurByte == '<') { | 359 if (m_CurByte == '<') { |
| 315 if (m_iDataPos > 0) { | 360 if (m_iDataPos > 0) { |
| 316 m_iDataLength = m_iDataPos; | 361 m_iDataLength = m_iDataPos; |
| 317 m_iDataPos = 0; | 362 m_iDataPos = 0; |
| 318 if (m_pHandler) { | 363 if (m_pHandler) { |
| 319 NotifyData(); | 364 NotifyData(); |
| 320 } | 365 } |
| 321 } | 366 } |
| 322 Push(); | 367 Push(); |
| 323 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; | 368 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; |
| 324 m_eMode = FX_SAXMODE_NodeStart; | 369 m_eMode = CFX_SaxMode::NodeStart; |
| 325 return; | 370 return; |
| 326 } | 371 } |
| 327 if (m_iDataPos < 1 && SkipSpace(m_CurByte)) { | 372 if (m_iDataPos < 1 && SkipSpace(m_CurByte)) { |
| 328 return; | 373 return; |
| 329 } | 374 } |
| 330 ParseChar(m_CurByte); | 375 ParseChar(m_CurByte); |
| 331 } | 376 } |
| 332 void CFX_SAXReader::ParseNodeStart() { | 377 void CFX_SAXReader::ParseNodeStart() { |
| 333 if (m_CurByte == '?') { | 378 if (m_CurByte == '?') { |
| 334 m_pCurItem->m_eNode = FX_SAXNODE_Instruction; | 379 m_pCurItem->m_eNode = CFX_SaxNode::Instruction; |
| 335 m_eMode = FX_SAXMODE_TagName; | 380 m_eMode = CFX_SaxMode::TagName; |
| 336 return; | 381 return; |
| 337 } | 382 } |
| 338 if (m_CurByte == '!') { | 383 if (m_CurByte == '!') { |
| 339 m_eMode = FX_SAXMODE_DeclOrComment; | 384 m_eMode = CFX_SaxMode::DeclOrComment; |
| 340 return; | 385 return; |
| 341 } | 386 } |
| 342 if (m_CurByte == '/') { | 387 if (m_CurByte == '/') { |
| 343 m_eMode = FX_SAXMODE_TagEnd; | 388 m_eMode = CFX_SaxMode::TagEnd; |
| 344 return; | 389 return; |
| 345 } | 390 } |
| 346 if (m_CurByte == '>') { | 391 if (m_CurByte == '>') { |
| 347 Pop(); | 392 Pop(); |
| 348 m_eMode = FX_SAXMODE_Text; | 393 m_eMode = CFX_SaxMode::Text; |
| 349 return; | 394 return; |
| 350 } | 395 } |
| 351 if (m_CurByte > 0x20) { | 396 if (m_CurByte > 0x20) { |
| 352 m_dwDataOffset = m_File.m_dwBufIndex; | 397 m_dwDataOffset = m_File.m_dwBufIndex; |
| 353 m_pCurItem->m_eNode = FX_SAXNODE_Tag; | 398 m_pCurItem->m_eNode = CFX_SaxNode::Tag; |
| 354 m_eMode = FX_SAXMODE_TagName; | 399 m_eMode = CFX_SaxMode::TagName; |
| 355 AppendData(m_CurByte); | 400 AppendData(m_CurByte); |
| 356 } | 401 } |
| 357 } | 402 } |
| 358 void CFX_SAXReader::ParseDeclOrComment() { | 403 void CFX_SAXReader::ParseDeclOrComment() { |
| 359 if (m_CurByte == '-') { | 404 if (m_CurByte == '-') { |
| 360 m_eMode = FX_SAXMODE_Comment; | 405 m_eMode = CFX_SaxMode::Comment; |
| 361 m_pCurItem->m_eNode = FX_SAXNODE_Comment; | 406 m_pCurItem->m_eNode = CFX_SaxNode::Comment; |
| 362 if (m_pCommentContext == NULL) { | 407 if (m_pCommentContext == NULL) { |
| 363 m_pCommentContext = new CFX_SAXCommentContext; | 408 m_pCommentContext = new CFX_SAXCommentContext; |
| 364 } | 409 } |
| 365 m_pCommentContext->m_iHeaderCount = 1; | 410 m_pCommentContext->m_iHeaderCount = 1; |
| 366 m_pCommentContext->m_iTailCount = 0; | 411 m_pCommentContext->m_iTailCount = 0; |
| 367 } else { | 412 } else { |
| 368 m_eMode = FX_SAXMODE_DeclNode; | 413 m_eMode = CFX_SaxMode::DeclNode; |
| 369 m_dwDataOffset = m_File.m_dwBufIndex; | 414 m_dwDataOffset = m_File.m_dwBufIndex; |
| 370 m_SkipChar = '>'; | 415 m_SkipChar = '>'; |
| 371 m_SkipStack.Add('>'); | 416 m_SkipStack.Add('>'); |
| 372 SkipNode(); | 417 SkipNode(); |
| 373 } | 418 } |
| 374 } | 419 } |
| 375 void CFX_SAXReader::ParseComment() { | 420 void CFX_SAXReader::ParseComment() { |
| 376 m_pCommentContext->m_iHeaderCount = 2; | 421 m_pCommentContext->m_iHeaderCount = 2; |
| 377 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; | 422 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; |
| 378 m_eMode = FX_SAXMODE_CommentContent; | 423 m_eMode = CFX_SaxMode::CommentContent; |
| 379 } | 424 } |
| 380 void CFX_SAXReader::ParseCommentContent() { | 425 void CFX_SAXReader::ParseCommentContent() { |
| 381 if (m_CurByte == '-') { | 426 if (m_CurByte == '-') { |
| 382 m_pCommentContext->m_iTailCount++; | 427 m_pCommentContext->m_iTailCount++; |
| 383 } else if (m_CurByte == '>' && m_pCommentContext->m_iTailCount == 2) { | 428 } else if (m_CurByte == '>' && m_pCommentContext->m_iTailCount == 2) { |
| 384 m_iDataLength = m_iDataPos; | 429 m_iDataLength = m_iDataPos; |
| 385 m_iDataPos = 0; | 430 m_iDataPos = 0; |
| 386 if (m_pHandler) { | 431 if (m_pHandler) { |
| 387 NotifyTargetData(); | 432 NotifyTargetData(); |
| 388 } | 433 } |
| 389 Pop(); | 434 Pop(); |
| 390 m_eMode = FX_SAXMODE_Text; | 435 m_eMode = CFX_SaxMode::Text; |
| 391 } else { | 436 } else { |
| 392 while (m_pCommentContext->m_iTailCount > 0) { | 437 while (m_pCommentContext->m_iTailCount > 0) { |
| 393 AppendData('-'); | 438 AppendData('-'); |
| 394 m_pCommentContext->m_iTailCount--; | 439 m_pCommentContext->m_iTailCount--; |
| 395 } | 440 } |
| 396 AppendData(m_CurByte); | 441 AppendData(m_CurByte); |
| 397 } | 442 } |
| 398 } | 443 } |
| 399 void CFX_SAXReader::ParseDeclNode() { | 444 void CFX_SAXReader::ParseDeclNode() { |
| 400 SkipNode(); | 445 SkipNode(); |
| 401 } | 446 } |
| 402 void CFX_SAXReader::ParseTagName() { | 447 void CFX_SAXReader::ParseTagName() { |
| 403 if (m_CurByte < 0x21 || m_CurByte == '/' || m_CurByte == '>' || | 448 if (m_CurByte < 0x21 || m_CurByte == '/' || m_CurByte == '>' || |
| 404 m_CurByte == '?') { | 449 m_CurByte == '?') { |
| 405 m_iDataLength = m_iDataPos; | 450 m_iDataLength = m_iDataPos; |
| 406 m_iDataPos = 0; | 451 m_iDataPos = 0; |
| 407 if (m_pHandler) { | 452 if (m_pHandler) { |
| 408 NotifyEnter(); | 453 NotifyEnter(); |
| 409 } | 454 } |
| 410 if (m_CurByte < 0x21) { | 455 if (m_CurByte < 0x21) { |
| 411 m_eMode = FX_SAXMODE_TagAttributeName; | 456 m_eMode = CFX_SaxMode::TagAttributeName; |
| 412 } else if (m_CurByte == '/' || m_CurByte == '?') { | 457 } else if (m_CurByte == '/' || m_CurByte == '?') { |
| 413 m_ePrevMode = m_eMode; | 458 m_ePrevMode = m_eMode; |
| 414 m_eMode = FX_SAXMODE_TagMaybeClose; | 459 m_eMode = CFX_SaxMode::TagMaybeClose; |
| 415 } else { | 460 } else { |
| 416 if (m_pHandler) { | 461 if (m_pHandler) { |
| 417 NotifyBreak(); | 462 NotifyBreak(); |
| 418 } | 463 } |
| 419 m_eMode = FX_SAXMODE_Text; | 464 m_eMode = CFX_SaxMode::Text; |
| 420 } | 465 } |
| 421 } else { | 466 } else { |
| 422 AppendData(m_CurByte); | 467 AppendData(m_CurByte); |
| 423 } | 468 } |
| 424 } | 469 } |
| 425 void CFX_SAXReader::ParseTagAttributeName() { | 470 void CFX_SAXReader::ParseTagAttributeName() { |
| 426 if (m_CurByte < 0x21 || m_CurByte == '=') { | 471 if (m_CurByte < 0x21 || m_CurByte == '=') { |
| 427 if (m_iDataPos < 1 && m_CurByte < 0x21) { | 472 if (m_iDataPos < 1 && m_CurByte < 0x21) { |
| 428 return; | 473 return; |
| 429 } | 474 } |
| 430 m_iNameLength = m_iDataPos; | 475 m_iNameLength = m_iDataPos; |
| 431 m_iDataPos = 0; | 476 m_iDataPos = 0; |
| 432 m_SkipChar = 0; | 477 m_SkipChar = 0; |
| 433 m_eMode = m_CurByte == '=' ? FX_SAXMODE_TagAttributeValue | 478 m_eMode = m_CurByte == '=' ? CFX_SaxMode::TagAttributeValue |
| 434 : FX_SAXMODE_TagAttributeEqual; | 479 : CFX_SaxMode::TagAttributeEqual; |
| 435 return; | 480 return; |
| 436 } | 481 } |
| 437 if (m_CurByte == '/' || m_CurByte == '>' || m_CurByte == '?') { | 482 if (m_CurByte == '/' || m_CurByte == '>' || m_CurByte == '?') { |
| 438 if (m_CurByte == '/' || m_CurByte == '?') { | 483 if (m_CurByte == '/' || m_CurByte == '?') { |
| 439 m_ePrevMode = m_eMode; | 484 m_ePrevMode = m_eMode; |
| 440 m_eMode = FX_SAXMODE_TagMaybeClose; | 485 m_eMode = CFX_SaxMode::TagMaybeClose; |
| 441 } else { | 486 } else { |
| 442 if (m_pHandler) { | 487 if (m_pHandler) { |
| 443 NotifyBreak(); | 488 NotifyBreak(); |
| 444 } | 489 } |
| 445 m_eMode = FX_SAXMODE_Text; | 490 m_eMode = CFX_SaxMode::Text; |
| 446 } | 491 } |
| 447 return; | 492 return; |
| 448 } | 493 } |
| 449 if (m_iDataPos < 1) { | 494 if (m_iDataPos < 1) { |
| 450 m_dwDataOffset = m_File.m_dwBufIndex; | 495 m_dwDataOffset = m_File.m_dwBufIndex; |
| 451 } | 496 } |
| 452 AppendName(m_CurByte); | 497 AppendName(m_CurByte); |
| 453 } | 498 } |
| 454 void CFX_SAXReader::ParseTagAttributeEqual() { | 499 void CFX_SAXReader::ParseTagAttributeEqual() { |
| 455 if (m_CurByte == '=') { | 500 if (m_CurByte == '=') { |
| 456 m_SkipChar = 0; | 501 m_SkipChar = 0; |
| 457 m_eMode = FX_SAXMODE_TagAttributeValue; | 502 m_eMode = CFX_SaxMode::TagAttributeValue; |
| 458 return; | 503 return; |
| 459 } else if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { | 504 } else if (m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
| 460 m_iDataPos = m_iNameLength; | 505 m_iDataPos = m_iNameLength; |
| 461 AppendName(0x20); | 506 AppendName(0x20); |
| 462 m_eMode = FX_SAXMODE_TargetData; | 507 m_eMode = CFX_SaxMode::TargetData; |
| 463 ParseTargetData(); | 508 ParseTargetData(); |
| 464 } | 509 } |
| 465 } | 510 } |
| 466 void CFX_SAXReader::ParseTagAttributeValue() { | 511 void CFX_SAXReader::ParseTagAttributeValue() { |
| 467 if (m_SkipChar) { | 512 if (m_SkipChar) { |
| 468 if (m_SkipChar == m_CurByte) { | 513 if (m_SkipChar == m_CurByte) { |
| 469 { | 514 { |
| 470 m_iDataLength = m_iDataPos; | 515 m_iDataLength = m_iDataPos; |
| 471 m_iDataPos = 0; | 516 m_iDataPos = 0; |
| 472 if (m_pHandler) { | 517 if (m_pHandler) { |
| 473 NotifyAttribute(); | 518 NotifyAttribute(); |
| 474 } | 519 } |
| 475 } | 520 } |
| 476 m_SkipChar = 0; | 521 m_SkipChar = 0; |
| 477 m_eMode = FX_SAXMODE_TagAttributeName; | 522 m_eMode = CFX_SaxMode::TagAttributeName; |
| 478 return; | 523 return; |
| 479 } | 524 } |
| 480 ParseChar(m_CurByte); | 525 ParseChar(m_CurByte); |
| 481 return; | 526 return; |
| 482 } | 527 } |
| 483 if (m_CurByte < 0x21) { | 528 if (m_CurByte < 0x21) { |
| 484 return; | 529 return; |
| 485 } | 530 } |
| 486 if (m_iDataPos < 1) { | 531 if (m_iDataPos < 1) { |
| 487 if (m_CurByte == '\'' || m_CurByte == '\"') { | 532 if (m_CurByte == '\'' || m_CurByte == '\"') { |
| 488 m_SkipChar = m_CurByte; | 533 m_SkipChar = m_CurByte; |
| 489 } | 534 } |
| 490 } | 535 } |
| 491 } | 536 } |
| 492 void CFX_SAXReader::ParseMaybeClose() { | 537 void CFX_SAXReader::ParseMaybeClose() { |
| 493 if (m_CurByte == '>') { | 538 if (m_CurByte == '>') { |
| 494 if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { | 539 if (m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
| 495 m_iNameLength = m_iDataPos; | 540 m_iNameLength = m_iDataPos; |
| 496 m_iDataPos = 0; | 541 m_iDataPos = 0; |
| 497 if (m_pHandler) { | 542 if (m_pHandler) { |
| 498 NotifyTargetData(); | 543 NotifyTargetData(); |
| 499 } | 544 } |
| 500 } | 545 } |
| 501 ParseTagClose(); | 546 ParseTagClose(); |
| 502 m_eMode = FX_SAXMODE_Text; | 547 m_eMode = CFX_SaxMode::Text; |
| 503 } else if (m_ePrevMode == FX_SAXMODE_TagName) { | 548 } else if (m_ePrevMode == CFX_SaxMode::TagName) { |
| 504 AppendData('/'); | 549 AppendData('/'); |
| 505 m_eMode = FX_SAXMODE_TagName; | 550 m_eMode = CFX_SaxMode::TagName; |
| 506 m_ePrevMode = FX_SAXMODE_Text; | 551 m_ePrevMode = CFX_SaxMode::Text; |
| 507 ParseTagName(); | 552 ParseTagName(); |
| 508 } else if (m_ePrevMode == FX_SAXMODE_TagAttributeName) { | 553 } else if (m_ePrevMode == CFX_SaxMode::TagAttributeName) { |
| 509 AppendName('/'); | 554 AppendName('/'); |
| 510 m_eMode = FX_SAXMODE_TagAttributeName; | 555 m_eMode = CFX_SaxMode::TagAttributeName; |
| 511 m_ePrevMode = FX_SAXMODE_Text; | 556 m_ePrevMode = CFX_SaxMode::Text; |
| 512 ParseTagAttributeName(); | 557 ParseTagAttributeName(); |
| 513 } else if (m_ePrevMode == FX_SAXMODE_TargetData) { | 558 } else if (m_ePrevMode == CFX_SaxMode::TargetData) { |
| 514 AppendName('?'); | 559 AppendName('?'); |
| 515 m_eMode = FX_SAXMODE_TargetData; | 560 m_eMode = CFX_SaxMode::TargetData; |
| 516 m_ePrevMode = FX_SAXMODE_Text; | 561 m_ePrevMode = CFX_SaxMode::Text; |
| 517 ParseTargetData(); | 562 ParseTargetData(); |
| 518 } | 563 } |
| 519 } | 564 } |
| 520 void CFX_SAXReader::ParseTagClose() { | 565 void CFX_SAXReader::ParseTagClose() { |
| 521 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; | 566 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; |
| 522 if (m_pHandler) { | 567 if (m_pHandler) { |
| 523 NotifyClose(); | 568 NotifyClose(); |
| 524 } | 569 } |
| 525 Pop(); | 570 Pop(); |
| 526 } | 571 } |
| 527 void CFX_SAXReader::ParseTagEnd() { | 572 void CFX_SAXReader::ParseTagEnd() { |
| 528 if (m_CurByte < 0x21) { | 573 if (m_CurByte < 0x21) { |
| 529 return; | 574 return; |
| 530 } | 575 } |
| 531 if (m_CurByte == '>') { | 576 if (m_CurByte == '>') { |
| 532 Pop(); | 577 Pop(); |
| 533 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; | 578 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; |
| 534 m_iDataLength = m_iDataPos; | 579 m_iDataLength = m_iDataPos; |
| 535 m_iDataPos = 0; | 580 m_iDataPos = 0; |
| 536 if (m_pHandler) { | 581 if (m_pHandler) { |
| 537 NotifyEnd(); | 582 NotifyEnd(); |
| 538 } | 583 } |
| 539 Pop(); | 584 Pop(); |
| 540 m_eMode = FX_SAXMODE_Text; | 585 m_eMode = CFX_SaxMode::Text; |
| 541 } else { | 586 } else { |
| 542 ParseChar(m_CurByte); | 587 ParseChar(m_CurByte); |
| 543 } | 588 } |
| 544 } | 589 } |
| 545 void CFX_SAXReader::ParseTargetData() { | 590 void CFX_SAXReader::ParseTargetData() { |
| 546 if (m_CurByte == '?') { | 591 if (m_CurByte == '?') { |
| 547 m_ePrevMode = m_eMode; | 592 m_ePrevMode = m_eMode; |
| 548 m_eMode = FX_SAXMODE_TagMaybeClose; | 593 m_eMode = CFX_SaxMode::TagMaybeClose; |
| 549 } else { | 594 } else { |
| 550 AppendName(m_CurByte); | 595 AppendName(m_CurByte); |
| 551 } | 596 } |
| 552 } | 597 } |
| 553 void CFX_SAXReader::SkipNode() { | 598 void CFX_SAXReader::SkipNode() { |
| 554 int32_t iLen = m_SkipStack.GetSize(); | 599 int32_t iLen = m_SkipStack.GetSize(); |
| 555 if (m_SkipChar == '\'' || m_SkipChar == '\"') { | 600 if (m_SkipChar == '\'' || m_SkipChar == '\"') { |
| 556 if (m_CurByte != m_SkipChar) { | 601 if (m_CurByte != m_SkipChar) { |
| 557 return; | 602 return; |
| 558 } | 603 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 601 FXSYS_memmove(m_pszData, m_pszData + 7, | 646 FXSYS_memmove(m_pszData, m_pszData + 7, |
| 602 m_iDataLength * sizeof(uint8_t)); | 647 m_iDataLength * sizeof(uint8_t)); |
| 603 m_bCharData = TRUE; | 648 m_bCharData = TRUE; |
| 604 if (m_pHandler) { | 649 if (m_pHandler) { |
| 605 NotifyData(); | 650 NotifyData(); |
| 606 } | 651 } |
| 607 m_bCharData = FALSE; | 652 m_bCharData = FALSE; |
| 608 } else { | 653 } else { |
| 609 Pop(); | 654 Pop(); |
| 610 } | 655 } |
| 611 m_eMode = FX_SAXMODE_Text; | 656 m_eMode = CFX_SaxMode::Text; |
| 612 } | 657 } |
| 613 } | 658 } |
| 614 break; | 659 break; |
| 615 } | 660 } |
| 616 if (iLen > 0) { | 661 if (iLen > 0) { |
| 617 ParseChar(m_CurByte); | 662 ParseChar(m_CurByte); |
| 618 } | 663 } |
| 619 } | 664 } |
| 620 | 665 |
| 621 void CFX_SAXReader::NotifyData() { | 666 void CFX_SAXReader::NotifyData() { |
| 622 if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) | 667 if (m_pCurItem->m_eNode == CFX_SaxNode::Tag) |
| 623 m_pHandler->OnTagData(m_pCurItem->m_pNode, | 668 m_pHandler->OnTagData( |
| 624 m_bCharData ? FX_SAXNODE_CharData : FX_SAXNODE_Text, | 669 m_pCurItem->m_pNode, |
| 625 CFX_ByteStringC(m_pszData, m_iDataLength), | 670 m_bCharData ? CFX_SaxNode::CharData : CFX_SaxNode::Text, |
| 626 m_File.m_dwCur + m_dwDataOffset); | 671 CFX_ByteStringC(m_pszData, m_iDataLength), |
| 672 m_File.m_dwCur + m_dwDataOffset); | |
| 627 } | 673 } |
| 628 | 674 |
| 629 void CFX_SAXReader::NotifyEnter() { | 675 void CFX_SAXReader::NotifyEnter() { |
| 630 if (m_pCurItem->m_eNode == FX_SAXNODE_Tag || | 676 if (m_pCurItem->m_eNode == CFX_SaxNode::Tag || |
| 631 m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { | 677 m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
| 632 m_pCurItem->m_pNode = | 678 m_pCurItem->m_pNode = |
| 633 m_pHandler->OnTagEnter(CFX_ByteStringC(m_pszData, m_iDataLength), | 679 m_pHandler->OnTagEnter(CFX_ByteStringC(m_pszData, m_iDataLength), |
| 634 m_pCurItem->m_eNode, m_dwNodePos); | 680 m_pCurItem->m_eNode, m_dwNodePos); |
| 635 } | 681 } |
| 636 } | 682 } |
| 637 | 683 |
| 638 void CFX_SAXReader::NotifyAttribute() { | 684 void CFX_SAXReader::NotifyAttribute() { |
| 639 if (m_pCurItem->m_eNode == FX_SAXNODE_Tag || | 685 if (m_pCurItem->m_eNode == CFX_SaxNode::Tag || |
| 640 m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { | 686 m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
| 641 m_pHandler->OnTagAttribute(m_pCurItem->m_pNode, | 687 m_pHandler->OnTagAttribute(m_pCurItem->m_pNode, |
| 642 CFX_ByteStringC(m_pszName, m_iNameLength), | 688 CFX_ByteStringC(m_pszName, m_iNameLength), |
| 643 CFX_ByteStringC(m_pszData, m_iDataLength)); | 689 CFX_ByteStringC(m_pszData, m_iDataLength)); |
| 644 } | 690 } |
| 645 } | 691 } |
| 646 | 692 |
| 647 void CFX_SAXReader::NotifyBreak() { | 693 void CFX_SAXReader::NotifyBreak() { |
| 648 if (m_pCurItem->m_eNode == FX_SAXNODE_Tag) | 694 if (m_pCurItem->m_eNode == CFX_SaxNode::Tag) |
| 649 m_pHandler->OnTagBreak(m_pCurItem->m_pNode); | 695 m_pHandler->OnTagBreak(m_pCurItem->m_pNode); |
| 650 } | 696 } |
| 651 | 697 |
| 652 void CFX_SAXReader::NotifyClose() { | 698 void CFX_SAXReader::NotifyClose() { |
| 653 if (m_pCurItem->m_eNode == FX_SAXNODE_Tag || | 699 if (m_pCurItem->m_eNode == CFX_SaxNode::Tag || |
| 654 m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { | 700 m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
| 655 m_pHandler->OnTagClose(m_pCurItem->m_pNode, m_dwNodePos); | 701 m_pHandler->OnTagClose(m_pCurItem->m_pNode, m_dwNodePos); |
| 656 } | 702 } |
| 657 } | 703 } |
| 658 | 704 |
| 659 void CFX_SAXReader::NotifyEnd() { | 705 void CFX_SAXReader::NotifyEnd() { |
| 660 if (m_pCurItem->m_eNode != FX_SAXNODE_Tag) | 706 if (m_pCurItem->m_eNode != CFX_SaxNode::Tag) |
| 661 return; | 707 return; |
| 662 | 708 |
| 663 m_pHandler->OnTagEnd(m_pCurItem->m_pNode, | 709 m_pHandler->OnTagEnd(m_pCurItem->m_pNode, |
| 664 CFX_ByteStringC(m_pszData, m_iDataLength), m_dwNodePos); | 710 CFX_ByteStringC(m_pszData, m_iDataLength), m_dwNodePos); |
| 665 } | 711 } |
| 666 | 712 |
| 667 void CFX_SAXReader::NotifyTargetData() { | 713 void CFX_SAXReader::NotifyTargetData() { |
| 668 if (m_pCurItem->m_eNode == FX_SAXNODE_Instruction) { | 714 if (m_pCurItem->m_eNode == CFX_SaxNode::Instruction) { |
| 669 m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, | 715 m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, |
| 670 CFX_ByteStringC(m_pszName, m_iNameLength), | 716 CFX_ByteStringC(m_pszName, m_iNameLength), |
| 671 m_dwNodePos); | 717 m_dwNodePos); |
| 672 } else if (m_pCurItem->m_eNode == FX_SAXNODE_Comment) { | 718 } else if (m_pCurItem->m_eNode == CFX_SaxNode::Comment) { |
| 673 m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, | 719 m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, |
| 674 CFX_ByteStringC(m_pszData, m_iDataLength), | 720 CFX_ByteStringC(m_pszData, m_iDataLength), |
| 675 m_dwNodePos); | 721 m_dwNodePos); |
| 676 } | 722 } |
| 677 } | 723 } |
| 678 | 724 |
| 679 void CFX_SAXReader::SkipCurrentNode() { | 725 void CFX_SAXReader::SkipCurrentNode() { |
| 680 if (!m_pCurItem) | 726 if (!m_pCurItem) |
| 681 return; | 727 return; |
| 682 | 728 |
| 683 m_pCurItem->m_bSkip = TRUE; | 729 m_pCurItem->m_bSkip = TRUE; |
| 684 } | 730 } |
| 685 | 731 |
| 686 void CFX_SAXReader::SetHandler(CXFA_SAXReaderHandler* pHandler) { | 732 void CFX_SAXReader::SetHandler(CXFA_SAXReaderHandler* pHandler) { |
| 687 m_pHandler = pHandler; | 733 m_pHandler = pHandler; |
| 688 } | 734 } |
| OLD | NEW |