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/cfx_saxreader.h" | 7 #include "xfa/fde/xml/cfx_saxreader.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <utility> | |
10 | 11 |
11 #include "xfa/fxfa/include/xfa_checksum.h" | 12 #include "xfa/fxfa/include/xfa_checksum.h" |
12 | 13 |
13 enum class CFX_SaxMode { | 14 enum class CFX_SaxMode { |
14 Text = 0, | 15 Text = 0, |
15 NodeStart, | 16 NodeStart, |
16 DeclOrComment, | 17 DeclOrComment, |
17 DeclNode, | 18 DeclNode, |
18 Comment, | 19 Comment, |
19 CommentContent, | 20 CommentContent, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
87 if (!pFile->ReadBlock(m_pBuf, dwStart, m_dwBufSize)) { | 88 if (!pFile->ReadBlock(m_pBuf, dwStart, m_dwBufSize)) { |
88 return FALSE; | 89 return FALSE; |
89 } | 90 } |
90 m_dwStart = dwStart; | 91 m_dwStart = dwStart; |
91 m_dwEnd = dwStart + dwLen; | 92 m_dwEnd = dwStart + dwLen; |
92 m_dwCur = dwStart; | 93 m_dwCur = dwStart; |
93 m_pFile = pFile; | 94 m_pFile = pFile; |
94 m_dwBufIndex = 0; | 95 m_dwBufIndex = 0; |
95 return TRUE; | 96 return TRUE; |
96 } | 97 } |
98 | |
97 FX_BOOL CFX_SAXFile::ReadNextBlock() { | 99 FX_BOOL CFX_SAXFile::ReadNextBlock() { |
98 ASSERT(m_pFile); | 100 ASSERT(m_pFile); |
99 uint32_t dwSize = m_dwEnd - m_dwCur; | 101 uint32_t dwSize = m_dwEnd - m_dwCur; |
100 if (dwSize == 0) { | 102 if (dwSize == 0) { |
101 return FALSE; | 103 return FALSE; |
102 } | 104 } |
103 m_dwBufSize = std::min(dwSize, kSaxFileBufSize); | 105 m_dwBufSize = std::min(dwSize, kSaxFileBufSize); |
104 if (!m_pFile->ReadBlock(m_pBuf, m_dwCur, m_dwBufSize)) { | 106 if (!m_pFile->ReadBlock(m_pBuf, m_dwCur, m_dwBufSize)) { |
105 return FALSE; | 107 return FALSE; |
106 } | 108 } |
107 m_dwBufIndex = 0; | 109 m_dwBufIndex = 0; |
108 return TRUE; | 110 return TRUE; |
109 } | 111 } |
112 | |
110 void CFX_SAXFile::Reset() { | 113 void CFX_SAXFile::Reset() { |
111 if (m_pBuf) { | 114 if (m_pBuf) { |
112 FX_Free(m_pBuf); | 115 FX_Free(m_pBuf); |
113 m_pBuf = nullptr; | 116 m_pBuf = nullptr; |
114 } | 117 } |
115 m_pFile = nullptr; | 118 m_pFile = nullptr; |
116 } | 119 } |
120 | |
117 CFX_SAXReader::CFX_SAXReader() | 121 CFX_SAXReader::CFX_SAXReader() |
118 : m_File(), | 122 : m_File(), |
119 m_pHandler(nullptr), | 123 m_pHandler(nullptr), |
120 m_iState(-1), | 124 m_iState(-1), |
121 m_pRoot(nullptr), | |
122 m_pCurItem(nullptr), | |
123 m_dwItemID(0), | 125 m_dwItemID(0), |
124 m_iDataSize(256), | 126 m_iDataSize(256), |
125 m_iNameSize(256), | 127 m_iNameSize(256), |
126 m_dwParseMode(0), | 128 m_dwParseMode(0), |
127 m_pCommentContext(nullptr) { | 129 m_pCommentContext(nullptr) { |
128 m_pszData = FX_Alloc(uint8_t, m_iDataSize); | 130 m_pszData = FX_Alloc(uint8_t, m_iDataSize); |
129 m_pszName = FX_Alloc(uint8_t, m_iNameSize); | 131 m_pszName = FX_Alloc(uint8_t, m_iNameSize); |
130 } | 132 } |
131 CFX_SAXReader::~CFX_SAXReader() { | 133 CFX_SAXReader::~CFX_SAXReader() { |
132 Reset(); | 134 Reset(); |
133 if (m_pszData) { | 135 if (m_pszData) { |
134 FX_Free(m_pszData); | 136 FX_Free(m_pszData); |
135 m_pszData = nullptr; | 137 m_pszData = nullptr; |
136 } | 138 } |
137 if (m_pszName) { | 139 if (m_pszName) { |
138 FX_Free(m_pszName); | 140 FX_Free(m_pszName); |
139 m_pszName = nullptr; | 141 m_pszName = nullptr; |
140 } | 142 } |
141 } | 143 } |
144 | |
142 void CFX_SAXReader::Reset() { | 145 void CFX_SAXReader::Reset() { |
143 m_File.Reset(); | 146 m_File.Reset(); |
144 CFX_SAXItem* pItem = m_pRoot; | 147 while (!m_Stack.empty()) |
145 while (pItem) { | 148 m_Stack.pop(); |
146 CFX_SAXItem* pNext = pItem->m_pNext; | 149 |
147 delete pItem; | |
148 pItem = pNext; | |
149 } | |
150 m_pRoot = nullptr; | |
151 m_pCurItem = nullptr; | |
152 m_dwItemID = 0; | 150 m_dwItemID = 0; |
153 m_SkipStack.RemoveAll(); | 151 m_SkipStack.RemoveAll(); |
154 m_SkipChar = 0; | 152 m_SkipChar = 0; |
155 m_iDataLength = 0; | 153 m_iDataLength = 0; |
156 m_iEntityStart = -1; | 154 m_iEntityStart = -1; |
157 m_iNameLength = 0; | 155 m_iNameLength = 0; |
158 m_iDataPos = 0; | 156 m_iDataPos = 0; |
159 if (m_pCommentContext) { | 157 delete m_pCommentContext; |
160 delete m_pCommentContext; | 158 m_pCommentContext = nullptr; |
161 m_pCommentContext = nullptr; | |
162 } | |
163 } | 159 } |
164 inline void CFX_SAXReader::Push() { | 160 |
165 CFX_SAXItem* pNew = new CFX_SAXItem; | 161 void CFX_SAXReader::Push() { |
166 pNew->m_dwID = ++m_dwItemID; | 162 std::unique_ptr<CFX_SAXItem> pNew(WrapUnique(new CFX_SAXItem(++m_dwItemID))); |
167 pNew->m_bSkip = m_pCurItem->m_bSkip; | 163 if (!m_Stack.empty()) |
168 pNew->m_pPrev = m_pCurItem; | 164 pNew->m_bSkip = m_Stack.top()->m_bSkip; |
169 m_pCurItem->m_pNext = pNew; | 165 m_Stack.push(std::move(pNew)); |
170 m_pCurItem = pNew; | |
171 } | 166 } |
172 inline void CFX_SAXReader::Pop() { | 167 |
173 if (!m_pCurItem) { | 168 void CFX_SAXReader::Pop() { |
169 CFX_SAXItem* pItem = GetCurrentItem(); | |
170 if (!pItem) | |
174 return; | 171 return; |
175 } | 172 |
176 CFX_SAXItem* pPrev = m_pCurItem->m_pPrev; | 173 delete pItem; |
Tom Sepez
2016/09/29 20:25:37
How does this play with unique_ptr & pop? Double
Lei Zhang
2016/09/29 20:29:57
Of course. Simplified.
| |
177 pPrev->m_pNext = nullptr; | 174 m_Stack.pop(); |
178 delete m_pCurItem; | |
179 m_pCurItem = pPrev; | |
180 } | 175 } |
181 inline void CFX_SAXReader::AppendData(uint8_t ch) { | 176 |
177 CFX_SAXItem* CFX_SAXReader::GetCurrentItem() const { | |
178 return m_Stack.empty() ? nullptr : m_Stack.top().get(); | |
179 } | |
180 | |
181 void CFX_SAXReader::AppendData(uint8_t ch) { | |
182 ReallocDataBuffer(); | 182 ReallocDataBuffer(); |
183 m_pszData[m_iDataPos++] = ch; | 183 m_pszData[m_iDataPos++] = ch; |
184 } | 184 } |
185 inline void CFX_SAXReader::AppendName(uint8_t ch) { | 185 |
186 void CFX_SAXReader::AppendName(uint8_t ch) { | |
186 ReallocNameBuffer(); | 187 ReallocNameBuffer(); |
187 m_pszName[m_iDataPos++] = ch; | 188 m_pszName[m_iDataPos++] = ch; |
188 } | 189 } |
190 | |
189 void CFX_SAXReader::ReallocDataBuffer() { | 191 void CFX_SAXReader::ReallocDataBuffer() { |
190 if (m_iDataPos < m_iDataSize) { | 192 if (m_iDataPos < m_iDataSize) { |
191 return; | 193 return; |
192 } | 194 } |
193 if (m_iDataSize <= 1024 * 1024) { | 195 if (m_iDataSize <= 1024 * 1024) { |
194 m_iDataSize *= 2; | 196 m_iDataSize *= 2; |
195 } else { | 197 } else { |
196 m_iDataSize += 1024 * 1024; | 198 m_iDataSize += 1024 * 1024; |
197 } | 199 } |
198 m_pszData = (uint8_t*)FX_Realloc(uint8_t, m_pszData, m_iDataSize); | 200 m_pszData = (uint8_t*)FX_Realloc(uint8_t, m_pszData, m_iDataSize); |
199 } | 201 } |
202 | |
200 void CFX_SAXReader::ReallocNameBuffer() { | 203 void CFX_SAXReader::ReallocNameBuffer() { |
201 if (m_iDataPos < m_iNameSize) { | 204 if (m_iDataPos < m_iNameSize) { |
202 return; | 205 return; |
203 } | 206 } |
204 if (m_iNameSize <= 1024 * 1024) { | 207 if (m_iNameSize <= 1024 * 1024) { |
205 m_iNameSize *= 2; | 208 m_iNameSize *= 2; |
206 } else { | 209 } else { |
207 m_iNameSize += 1024 * 1024; | 210 m_iNameSize += 1024 * 1024; |
208 } | 211 } |
209 m_pszName = (uint8_t*)FX_Realloc(uint8_t, m_pszName, m_iNameSize); | 212 m_pszName = (uint8_t*)FX_Realloc(uint8_t, m_pszName, m_iNameSize); |
210 } | 213 } |
211 inline FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) { | 214 |
215 FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) { | |
212 return (m_dwParseMode & CFX_SaxParseMode_NotSkipSpace) == 0 && ch < 0x21; | 216 return (m_dwParseMode & CFX_SaxParseMode_NotSkipSpace) == 0 && ch < 0x21; |
213 } | 217 } |
218 | |
214 int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, | 219 int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, |
215 uint32_t dwStart, | 220 uint32_t dwStart, |
216 uint32_t dwLen, | 221 uint32_t dwLen, |
217 uint32_t dwParseMode) { | 222 uint32_t dwParseMode) { |
218 m_iState = -1; | 223 m_iState = -1; |
219 Reset(); | 224 Reset(); |
220 if (!m_File.StartFile(pFile, dwStart, dwLen)) { | 225 if (!m_File.StartFile(pFile, dwStart, dwLen)) { |
221 return -1; | 226 return -1; |
222 } | 227 } |
223 m_iState = 0; | 228 m_iState = 0; |
224 m_eMode = CFX_SaxMode::Text; | 229 m_eMode = CFX_SaxMode::Text; |
225 m_ePrevMode = CFX_SaxMode::Text; | 230 m_ePrevMode = CFX_SaxMode::Text; |
226 m_bCharData = FALSE; | 231 m_bCharData = FALSE; |
227 m_dwDataOffset = 0; | 232 m_dwDataOffset = 0; |
228 m_pRoot = m_pCurItem = new CFX_SAXItem; | |
229 m_pCurItem->m_dwID = ++m_dwItemID; | |
230 m_dwParseMode = dwParseMode; | 233 m_dwParseMode = dwParseMode; |
234 m_Stack.emplace(new CFX_SAXItem(++m_dwItemID)); | |
231 return 0; | 235 return 0; |
232 } | 236 } |
233 | 237 |
234 int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) { | 238 int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) { |
235 if (m_iState < 0 || m_iState > 99) { | 239 if (m_iState < 0 || m_iState > 99) { |
236 return m_iState; | 240 return m_iState; |
237 } | 241 } |
238 while (m_File.m_dwCur < m_File.m_dwEnd) { | 242 while (m_File.m_dwCur < m_File.m_dwEnd) { |
239 uint32_t& index = m_File.m_dwBufIndex; | 243 uint32_t& index = m_File.m_dwBufIndex; |
240 uint32_t size = m_File.m_dwBufSize; | 244 uint32_t size = m_File.m_dwBufSize; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
331 m_iDataPos++; | 335 m_iDataPos++; |
332 m_iEntityStart = -1; | 336 m_iEntityStart = -1; |
333 } | 337 } |
334 } else { | 338 } else { |
335 if (m_iEntityStart < 0 && ch == '&') { | 339 if (m_iEntityStart < 0 && ch == '&') { |
336 m_iEntityStart = m_iDataPos; | 340 m_iEntityStart = m_iDataPos; |
337 } | 341 } |
338 m_iDataPos++; | 342 m_iDataPos++; |
339 } | 343 } |
340 } | 344 } |
345 | |
341 void CFX_SAXReader::ParseText() { | 346 void CFX_SAXReader::ParseText() { |
342 if (m_CurByte == '<') { | 347 if (m_CurByte == '<') { |
343 if (m_iDataPos > 0) { | 348 if (m_iDataPos > 0) { |
344 m_iDataLength = m_iDataPos; | 349 m_iDataLength = m_iDataPos; |
345 m_iDataPos = 0; | 350 m_iDataPos = 0; |
346 if (m_pHandler) { | 351 if (m_pHandler) { |
347 NotifyData(); | 352 NotifyData(); |
348 } | 353 } |
349 } | 354 } |
350 Push(); | 355 Push(); |
351 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; | 356 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; |
352 m_eMode = CFX_SaxMode::NodeStart; | 357 m_eMode = CFX_SaxMode::NodeStart; |
353 return; | 358 return; |
354 } | 359 } |
355 if (m_iDataPos < 1 && SkipSpace(m_CurByte)) { | 360 if (m_iDataPos < 1 && SkipSpace(m_CurByte)) { |
356 return; | 361 return; |
357 } | 362 } |
358 ParseChar(m_CurByte); | 363 ParseChar(m_CurByte); |
359 } | 364 } |
365 | |
360 void CFX_SAXReader::ParseNodeStart() { | 366 void CFX_SAXReader::ParseNodeStart() { |
361 if (m_CurByte == '?') { | 367 if (m_CurByte == '?') { |
362 m_pCurItem->m_eNode = CFX_SAXItem::Type::Instruction; | 368 GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Instruction; |
363 m_eMode = CFX_SaxMode::TagName; | 369 m_eMode = CFX_SaxMode::TagName; |
364 return; | 370 return; |
365 } | 371 } |
366 if (m_CurByte == '!') { | 372 if (m_CurByte == '!') { |
367 m_eMode = CFX_SaxMode::DeclOrComment; | 373 m_eMode = CFX_SaxMode::DeclOrComment; |
368 return; | 374 return; |
369 } | 375 } |
370 if (m_CurByte == '/') { | 376 if (m_CurByte == '/') { |
371 m_eMode = CFX_SaxMode::TagEnd; | 377 m_eMode = CFX_SaxMode::TagEnd; |
372 return; | 378 return; |
373 } | 379 } |
374 if (m_CurByte == '>') { | 380 if (m_CurByte == '>') { |
375 Pop(); | 381 Pop(); |
376 m_eMode = CFX_SaxMode::Text; | 382 m_eMode = CFX_SaxMode::Text; |
377 return; | 383 return; |
378 } | 384 } |
379 if (m_CurByte > 0x20) { | 385 if (m_CurByte > 0x20) { |
380 m_dwDataOffset = m_File.m_dwBufIndex; | 386 m_dwDataOffset = m_File.m_dwBufIndex; |
381 m_pCurItem->m_eNode = CFX_SAXItem::Type::Tag; | 387 GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Tag; |
382 m_eMode = CFX_SaxMode::TagName; | 388 m_eMode = CFX_SaxMode::TagName; |
383 AppendData(m_CurByte); | 389 AppendData(m_CurByte); |
384 } | 390 } |
385 } | 391 } |
392 | |
386 void CFX_SAXReader::ParseDeclOrComment() { | 393 void CFX_SAXReader::ParseDeclOrComment() { |
387 if (m_CurByte == '-') { | 394 if (m_CurByte == '-') { |
388 m_eMode = CFX_SaxMode::Comment; | 395 m_eMode = CFX_SaxMode::Comment; |
389 m_pCurItem->m_eNode = CFX_SAXItem::Type::Comment; | 396 GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Comment; |
390 if (!m_pCommentContext) | 397 if (!m_pCommentContext) |
391 m_pCommentContext = new CFX_SAXCommentContext; | 398 m_pCommentContext = new CFX_SAXCommentContext; |
392 | 399 |
393 m_pCommentContext->m_iHeaderCount = 1; | 400 m_pCommentContext->m_iHeaderCount = 1; |
394 m_pCommentContext->m_iTailCount = 0; | 401 m_pCommentContext->m_iTailCount = 0; |
395 } else { | 402 } else { |
396 m_eMode = CFX_SaxMode::DeclNode; | 403 m_eMode = CFX_SaxMode::DeclNode; |
397 m_dwDataOffset = m_File.m_dwBufIndex; | 404 m_dwDataOffset = m_File.m_dwBufIndex; |
398 m_SkipChar = '>'; | 405 m_SkipChar = '>'; |
399 m_SkipStack.Add('>'); | 406 m_SkipStack.Add('>'); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
472 } | 479 } |
473 m_eMode = CFX_SaxMode::Text; | 480 m_eMode = CFX_SaxMode::Text; |
474 } | 481 } |
475 return; | 482 return; |
476 } | 483 } |
477 if (m_iDataPos < 1) { | 484 if (m_iDataPos < 1) { |
478 m_dwDataOffset = m_File.m_dwBufIndex; | 485 m_dwDataOffset = m_File.m_dwBufIndex; |
479 } | 486 } |
480 AppendName(m_CurByte); | 487 AppendName(m_CurByte); |
481 } | 488 } |
489 | |
482 void CFX_SAXReader::ParseTagAttributeEqual() { | 490 void CFX_SAXReader::ParseTagAttributeEqual() { |
483 if (m_CurByte == '=') { | 491 if (m_CurByte == '=') { |
484 m_SkipChar = 0; | 492 m_SkipChar = 0; |
485 m_eMode = CFX_SaxMode::TagAttributeValue; | 493 m_eMode = CFX_SaxMode::TagAttributeValue; |
486 return; | 494 return; |
487 } else if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { | 495 } |
496 if (GetCurrentItem()->m_eNode == CFX_SAXItem::Type::Instruction) { | |
488 m_iDataPos = m_iNameLength; | 497 m_iDataPos = m_iNameLength; |
489 AppendName(0x20); | 498 AppendName(0x20); |
490 m_eMode = CFX_SaxMode::TargetData; | 499 m_eMode = CFX_SaxMode::TargetData; |
491 ParseTargetData(); | 500 ParseTargetData(); |
492 } | 501 } |
493 } | 502 } |
503 | |
494 void CFX_SAXReader::ParseTagAttributeValue() { | 504 void CFX_SAXReader::ParseTagAttributeValue() { |
495 if (m_SkipChar) { | 505 if (m_SkipChar) { |
496 if (m_SkipChar == m_CurByte) { | 506 if (m_SkipChar == m_CurByte) { |
497 { | 507 { |
498 m_iDataLength = m_iDataPos; | 508 m_iDataLength = m_iDataPos; |
499 m_iDataPos = 0; | 509 m_iDataPos = 0; |
500 if (m_pHandler) { | 510 if (m_pHandler) { |
501 NotifyAttribute(); | 511 NotifyAttribute(); |
502 } | 512 } |
503 } | 513 } |
504 m_SkipChar = 0; | 514 m_SkipChar = 0; |
505 m_eMode = CFX_SaxMode::TagAttributeName; | 515 m_eMode = CFX_SaxMode::TagAttributeName; |
506 return; | 516 return; |
507 } | 517 } |
508 ParseChar(m_CurByte); | 518 ParseChar(m_CurByte); |
509 return; | 519 return; |
510 } | 520 } |
511 if (m_CurByte < 0x21) { | 521 if (m_CurByte < 0x21) { |
512 return; | 522 return; |
513 } | 523 } |
514 if (m_iDataPos < 1) { | 524 if (m_iDataPos < 1) { |
515 if (m_CurByte == '\'' || m_CurByte == '\"') { | 525 if (m_CurByte == '\'' || m_CurByte == '\"') { |
516 m_SkipChar = m_CurByte; | 526 m_SkipChar = m_CurByte; |
517 } | 527 } |
518 } | 528 } |
519 } | 529 } |
530 | |
520 void CFX_SAXReader::ParseMaybeClose() { | 531 void CFX_SAXReader::ParseMaybeClose() { |
521 if (m_CurByte == '>') { | 532 if (m_CurByte == '>') { |
522 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { | 533 if (GetCurrentItem()->m_eNode == CFX_SAXItem::Type::Instruction) { |
523 m_iNameLength = m_iDataPos; | 534 m_iNameLength = m_iDataPos; |
524 m_iDataPos = 0; | 535 m_iDataPos = 0; |
525 if (m_pHandler) { | 536 if (m_pHandler) { |
526 NotifyTargetData(); | 537 NotifyTargetData(); |
527 } | 538 } |
528 } | 539 } |
529 ParseTagClose(); | 540 ParseTagClose(); |
530 m_eMode = CFX_SaxMode::Text; | 541 m_eMode = CFX_SaxMode::Text; |
531 } else if (m_ePrevMode == CFX_SaxMode::TagName) { | 542 } else if (m_ePrevMode == CFX_SaxMode::TagName) { |
532 AppendData('/'); | 543 AppendData('/'); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
640 } | 651 } |
641 } | 652 } |
642 break; | 653 break; |
643 } | 654 } |
644 if (iLen > 0) { | 655 if (iLen > 0) { |
645 ParseChar(m_CurByte); | 656 ParseChar(m_CurByte); |
646 } | 657 } |
647 } | 658 } |
648 | 659 |
649 void CFX_SAXReader::NotifyData() { | 660 void CFX_SAXReader::NotifyData() { |
650 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag) | 661 CFX_SAXItem* pItem = GetCurrentItem(); |
662 if (!pItem) | |
663 return; | |
664 | |
665 if (pItem->m_eNode == CFX_SAXItem::Type::Tag) | |
651 m_pHandler->OnTagData( | 666 m_pHandler->OnTagData( |
652 m_pCurItem->m_pNode, | 667 pItem->m_pNode, |
653 m_bCharData ? CFX_SAXItem::Type::CharData : CFX_SAXItem::Type::Text, | 668 m_bCharData ? CFX_SAXItem::Type::CharData : CFX_SAXItem::Type::Text, |
654 CFX_ByteStringC(m_pszData, m_iDataLength), | 669 CFX_ByteStringC(m_pszData, m_iDataLength), |
655 m_File.m_dwCur + m_dwDataOffset); | 670 m_File.m_dwCur + m_dwDataOffset); |
656 } | 671 } |
657 | 672 |
658 void CFX_SAXReader::NotifyEnter() { | 673 void CFX_SAXReader::NotifyEnter() { |
659 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag || | 674 CFX_SAXItem* pItem = GetCurrentItem(); |
660 m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { | 675 if (pItem->m_eNode == CFX_SAXItem::Type::Tag || |
661 m_pCurItem->m_pNode = | 676 pItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
662 m_pHandler->OnTagEnter(CFX_ByteStringC(m_pszData, m_iDataLength), | 677 pItem->m_pNode = m_pHandler->OnTagEnter( |
663 m_pCurItem->m_eNode, m_dwNodePos); | 678 CFX_ByteStringC(m_pszData, m_iDataLength), pItem->m_eNode, m_dwNodePos); |
664 } | 679 } |
665 } | 680 } |
666 | 681 |
667 void CFX_SAXReader::NotifyAttribute() { | 682 void CFX_SAXReader::NotifyAttribute() { |
668 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag || | 683 CFX_SAXItem* pItem = GetCurrentItem(); |
669 m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { | 684 if (pItem->m_eNode == CFX_SAXItem::Type::Tag || |
670 m_pHandler->OnTagAttribute(m_pCurItem->m_pNode, | 685 pItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
686 m_pHandler->OnTagAttribute(pItem->m_pNode, | |
671 CFX_ByteStringC(m_pszName, m_iNameLength), | 687 CFX_ByteStringC(m_pszName, m_iNameLength), |
672 CFX_ByteStringC(m_pszData, m_iDataLength)); | 688 CFX_ByteStringC(m_pszData, m_iDataLength)); |
673 } | 689 } |
674 } | 690 } |
675 | 691 |
676 void CFX_SAXReader::NotifyBreak() { | 692 void CFX_SAXReader::NotifyBreak() { |
677 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag) | 693 CFX_SAXItem* pItem = GetCurrentItem(); |
678 m_pHandler->OnTagBreak(m_pCurItem->m_pNode); | 694 if (pItem->m_eNode == CFX_SAXItem::Type::Tag) |
695 m_pHandler->OnTagBreak(pItem->m_pNode); | |
679 } | 696 } |
680 | 697 |
681 void CFX_SAXReader::NotifyClose() { | 698 void CFX_SAXReader::NotifyClose() { |
682 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag || | 699 CFX_SAXItem* pItem = GetCurrentItem(); |
683 m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { | 700 if (pItem->m_eNode == CFX_SAXItem::Type::Tag || |
684 m_pHandler->OnTagClose(m_pCurItem->m_pNode, m_dwNodePos); | 701 pItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
702 m_pHandler->OnTagClose(pItem->m_pNode, m_dwNodePos); | |
685 } | 703 } |
686 } | 704 } |
687 | 705 |
688 void CFX_SAXReader::NotifyEnd() { | 706 void CFX_SAXReader::NotifyEnd() { |
689 if (m_pCurItem->m_eNode != CFX_SAXItem::Type::Tag) | 707 CFX_SAXItem* pItem = GetCurrentItem(); |
708 if (!pItem || pItem->m_eNode != CFX_SAXItem::Type::Tag) | |
690 return; | 709 return; |
691 | 710 |
692 m_pHandler->OnTagEnd(m_pCurItem->m_pNode, | 711 m_pHandler->OnTagEnd(pItem->m_pNode, |
693 CFX_ByteStringC(m_pszData, m_iDataLength), m_dwNodePos); | 712 CFX_ByteStringC(m_pszData, m_iDataLength), m_dwNodePos); |
694 } | 713 } |
695 | 714 |
696 void CFX_SAXReader::NotifyTargetData() { | 715 void CFX_SAXReader::NotifyTargetData() { |
697 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { | 716 CFX_SAXItem* pItem = GetCurrentItem(); |
698 m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, | 717 if (pItem->m_eNode == CFX_SAXItem::Type::Instruction) { |
718 m_pHandler->OnTargetData(pItem->m_pNode, pItem->m_eNode, | |
699 CFX_ByteStringC(m_pszName, m_iNameLength), | 719 CFX_ByteStringC(m_pszName, m_iNameLength), |
700 m_dwNodePos); | 720 m_dwNodePos); |
701 } else if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Comment) { | 721 } else if (pItem->m_eNode == CFX_SAXItem::Type::Comment) { |
702 m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, | 722 m_pHandler->OnTargetData(pItem->m_pNode, pItem->m_eNode, |
703 CFX_ByteStringC(m_pszData, m_iDataLength), | 723 CFX_ByteStringC(m_pszData, m_iDataLength), |
704 m_dwNodePos); | 724 m_dwNodePos); |
705 } | 725 } |
706 } | 726 } |
707 | 727 |
708 void CFX_SAXReader::SkipCurrentNode() { | 728 void CFX_SAXReader::SkipCurrentNode() { |
709 if (!m_pCurItem) | 729 CFX_SAXItem* pItem = GetCurrentItem(); |
730 if (!pItem) | |
710 return; | 731 return; |
711 | 732 |
712 m_pCurItem->m_bSkip = TRUE; | 733 pItem->m_bSkip = TRUE; |
713 } | 734 } |
714 | 735 |
715 void CFX_SAXReader::SetHandler(CXFA_SAXReaderHandler* pHandler) { | 736 void CFX_SAXReader::SetHandler(CXFA_SAXReaderHandler* pHandler) { |
716 m_pHandler = pHandler; | 737 m_pHandler = pHandler; |
717 } | 738 } |
OLD | NEW |