Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: xfa/fde/xml/cfx_saxreader.cpp

Issue 2378133003: Switch CFX_SAXReader to use std::stack. (Closed)
Patch Set: rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/fde/xml/cfx_saxreader.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/xfa_checksum.h" 12 #include "xfa/fxfa/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
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() {
174 return; 169 if (!m_Stack.empty())
175 } 170 m_Stack.pop();
176 CFX_SAXItem* pPrev = m_pCurItem->m_pPrev;
177 pPrev->m_pNext = nullptr;
178 delete m_pCurItem;
179 m_pCurItem = pPrev;
180 } 171 }
181 inline void CFX_SAXReader::AppendData(uint8_t ch) { 172
173 CFX_SAXItem* CFX_SAXReader::GetCurrentItem() const {
174 return m_Stack.empty() ? nullptr : m_Stack.top().get();
175 }
176
177 void CFX_SAXReader::AppendData(uint8_t ch) {
182 ReallocDataBuffer(); 178 ReallocDataBuffer();
183 m_pszData[m_iDataPos++] = ch; 179 m_pszData[m_iDataPos++] = ch;
184 } 180 }
185 inline void CFX_SAXReader::AppendName(uint8_t ch) { 181
182 void CFX_SAXReader::AppendName(uint8_t ch) {
186 ReallocNameBuffer(); 183 ReallocNameBuffer();
187 m_pszName[m_iDataPos++] = ch; 184 m_pszName[m_iDataPos++] = ch;
188 } 185 }
186
189 void CFX_SAXReader::ReallocDataBuffer() { 187 void CFX_SAXReader::ReallocDataBuffer() {
190 if (m_iDataPos < m_iDataSize) { 188 if (m_iDataPos < m_iDataSize) {
191 return; 189 return;
192 } 190 }
193 if (m_iDataSize <= 1024 * 1024) { 191 if (m_iDataSize <= 1024 * 1024) {
194 m_iDataSize *= 2; 192 m_iDataSize *= 2;
195 } else { 193 } else {
196 m_iDataSize += 1024 * 1024; 194 m_iDataSize += 1024 * 1024;
197 } 195 }
198 m_pszData = (uint8_t*)FX_Realloc(uint8_t, m_pszData, m_iDataSize); 196 m_pszData = (uint8_t*)FX_Realloc(uint8_t, m_pszData, m_iDataSize);
199 } 197 }
198
200 void CFX_SAXReader::ReallocNameBuffer() { 199 void CFX_SAXReader::ReallocNameBuffer() {
201 if (m_iDataPos < m_iNameSize) { 200 if (m_iDataPos < m_iNameSize) {
202 return; 201 return;
203 } 202 }
204 if (m_iNameSize <= 1024 * 1024) { 203 if (m_iNameSize <= 1024 * 1024) {
205 m_iNameSize *= 2; 204 m_iNameSize *= 2;
206 } else { 205 } else {
207 m_iNameSize += 1024 * 1024; 206 m_iNameSize += 1024 * 1024;
208 } 207 }
209 m_pszName = (uint8_t*)FX_Realloc(uint8_t, m_pszName, m_iNameSize); 208 m_pszName = (uint8_t*)FX_Realloc(uint8_t, m_pszName, m_iNameSize);
210 } 209 }
211 inline FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) { 210
211 FX_BOOL CFX_SAXReader::SkipSpace(uint8_t ch) {
212 return (m_dwParseMode & CFX_SaxParseMode_NotSkipSpace) == 0 && ch < 0x21; 212 return (m_dwParseMode & CFX_SaxParseMode_NotSkipSpace) == 0 && ch < 0x21;
213 } 213 }
214
214 int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile, 215 int32_t CFX_SAXReader::StartParse(IFX_FileRead* pFile,
215 uint32_t dwStart, 216 uint32_t dwStart,
216 uint32_t dwLen, 217 uint32_t dwLen,
217 uint32_t dwParseMode) { 218 uint32_t dwParseMode) {
218 m_iState = -1; 219 m_iState = -1;
219 Reset(); 220 Reset();
220 if (!m_File.StartFile(pFile, dwStart, dwLen)) { 221 if (!m_File.StartFile(pFile, dwStart, dwLen)) {
221 return -1; 222 return -1;
222 } 223 }
223 m_iState = 0; 224 m_iState = 0;
224 m_eMode = CFX_SaxMode::Text; 225 m_eMode = CFX_SaxMode::Text;
225 m_ePrevMode = CFX_SaxMode::Text; 226 m_ePrevMode = CFX_SaxMode::Text;
226 m_bCharData = FALSE; 227 m_bCharData = FALSE;
227 m_dwDataOffset = 0; 228 m_dwDataOffset = 0;
228 m_pRoot = m_pCurItem = new CFX_SAXItem;
229 m_pCurItem->m_dwID = ++m_dwItemID;
230 m_dwParseMode = dwParseMode; 229 m_dwParseMode = dwParseMode;
230 m_Stack.emplace(new CFX_SAXItem(++m_dwItemID));
231 return 0; 231 return 0;
232 } 232 }
233 233
234 int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) { 234 int32_t CFX_SAXReader::ContinueParse(IFX_Pause* pPause) {
235 if (m_iState < 0 || m_iState > 99) { 235 if (m_iState < 0 || m_iState > 99) {
236 return m_iState; 236 return m_iState;
237 } 237 }
238 while (m_File.m_dwCur < m_File.m_dwEnd) { 238 while (m_File.m_dwCur < m_File.m_dwEnd) {
239 uint32_t& index = m_File.m_dwBufIndex; 239 uint32_t& index = m_File.m_dwBufIndex;
240 uint32_t size = m_File.m_dwBufSize; 240 uint32_t size = m_File.m_dwBufSize;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 m_iDataPos++; 331 m_iDataPos++;
332 m_iEntityStart = -1; 332 m_iEntityStart = -1;
333 } 333 }
334 } else { 334 } else {
335 if (m_iEntityStart < 0 && ch == '&') { 335 if (m_iEntityStart < 0 && ch == '&') {
336 m_iEntityStart = m_iDataPos; 336 m_iEntityStart = m_iDataPos;
337 } 337 }
338 m_iDataPos++; 338 m_iDataPos++;
339 } 339 }
340 } 340 }
341
341 void CFX_SAXReader::ParseText() { 342 void CFX_SAXReader::ParseText() {
342 if (m_CurByte == '<') { 343 if (m_CurByte == '<') {
343 if (m_iDataPos > 0) { 344 if (m_iDataPos > 0) {
344 m_iDataLength = m_iDataPos; 345 m_iDataLength = m_iDataPos;
345 m_iDataPos = 0; 346 m_iDataPos = 0;
346 if (m_pHandler) { 347 if (m_pHandler) {
347 NotifyData(); 348 NotifyData();
348 } 349 }
349 } 350 }
350 Push(); 351 Push();
351 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex; 352 m_dwNodePos = m_File.m_dwCur + m_File.m_dwBufIndex;
352 m_eMode = CFX_SaxMode::NodeStart; 353 m_eMode = CFX_SaxMode::NodeStart;
353 return; 354 return;
354 } 355 }
355 if (m_iDataPos < 1 && SkipSpace(m_CurByte)) { 356 if (m_iDataPos < 1 && SkipSpace(m_CurByte)) {
356 return; 357 return;
357 } 358 }
358 ParseChar(m_CurByte); 359 ParseChar(m_CurByte);
359 } 360 }
361
360 void CFX_SAXReader::ParseNodeStart() { 362 void CFX_SAXReader::ParseNodeStart() {
361 if (m_CurByte == '?') { 363 if (m_CurByte == '?') {
362 m_pCurItem->m_eNode = CFX_SAXItem::Type::Instruction; 364 GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Instruction;
363 m_eMode = CFX_SaxMode::TagName; 365 m_eMode = CFX_SaxMode::TagName;
364 return; 366 return;
365 } 367 }
366 if (m_CurByte == '!') { 368 if (m_CurByte == '!') {
367 m_eMode = CFX_SaxMode::DeclOrComment; 369 m_eMode = CFX_SaxMode::DeclOrComment;
368 return; 370 return;
369 } 371 }
370 if (m_CurByte == '/') { 372 if (m_CurByte == '/') {
371 m_eMode = CFX_SaxMode::TagEnd; 373 m_eMode = CFX_SaxMode::TagEnd;
372 return; 374 return;
373 } 375 }
374 if (m_CurByte == '>') { 376 if (m_CurByte == '>') {
375 Pop(); 377 Pop();
376 m_eMode = CFX_SaxMode::Text; 378 m_eMode = CFX_SaxMode::Text;
377 return; 379 return;
378 } 380 }
379 if (m_CurByte > 0x20) { 381 if (m_CurByte > 0x20) {
380 m_dwDataOffset = m_File.m_dwBufIndex; 382 m_dwDataOffset = m_File.m_dwBufIndex;
381 m_pCurItem->m_eNode = CFX_SAXItem::Type::Tag; 383 GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Tag;
382 m_eMode = CFX_SaxMode::TagName; 384 m_eMode = CFX_SaxMode::TagName;
383 AppendData(m_CurByte); 385 AppendData(m_CurByte);
384 } 386 }
385 } 387 }
388
386 void CFX_SAXReader::ParseDeclOrComment() { 389 void CFX_SAXReader::ParseDeclOrComment() {
387 if (m_CurByte == '-') { 390 if (m_CurByte == '-') {
388 m_eMode = CFX_SaxMode::Comment; 391 m_eMode = CFX_SaxMode::Comment;
389 m_pCurItem->m_eNode = CFX_SAXItem::Type::Comment; 392 GetCurrentItem()->m_eNode = CFX_SAXItem::Type::Comment;
390 if (!m_pCommentContext) 393 if (!m_pCommentContext)
391 m_pCommentContext = new CFX_SAXCommentContext; 394 m_pCommentContext = new CFX_SAXCommentContext;
392 395
393 m_pCommentContext->m_iHeaderCount = 1; 396 m_pCommentContext->m_iHeaderCount = 1;
394 m_pCommentContext->m_iTailCount = 0; 397 m_pCommentContext->m_iTailCount = 0;
395 } else { 398 } else {
396 m_eMode = CFX_SaxMode::DeclNode; 399 m_eMode = CFX_SaxMode::DeclNode;
397 m_dwDataOffset = m_File.m_dwBufIndex; 400 m_dwDataOffset = m_File.m_dwBufIndex;
398 m_SkipChar = '>'; 401 m_SkipChar = '>';
399 m_SkipStack.Add('>'); 402 m_SkipStack.Add('>');
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 } 475 }
473 m_eMode = CFX_SaxMode::Text; 476 m_eMode = CFX_SaxMode::Text;
474 } 477 }
475 return; 478 return;
476 } 479 }
477 if (m_iDataPos < 1) { 480 if (m_iDataPos < 1) {
478 m_dwDataOffset = m_File.m_dwBufIndex; 481 m_dwDataOffset = m_File.m_dwBufIndex;
479 } 482 }
480 AppendName(m_CurByte); 483 AppendName(m_CurByte);
481 } 484 }
485
482 void CFX_SAXReader::ParseTagAttributeEqual() { 486 void CFX_SAXReader::ParseTagAttributeEqual() {
483 if (m_CurByte == '=') { 487 if (m_CurByte == '=') {
484 m_SkipChar = 0; 488 m_SkipChar = 0;
485 m_eMode = CFX_SaxMode::TagAttributeValue; 489 m_eMode = CFX_SaxMode::TagAttributeValue;
486 return; 490 return;
487 } else if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { 491 }
492 if (GetCurrentItem()->m_eNode == CFX_SAXItem::Type::Instruction) {
488 m_iDataPos = m_iNameLength; 493 m_iDataPos = m_iNameLength;
489 AppendName(0x20); 494 AppendName(0x20);
490 m_eMode = CFX_SaxMode::TargetData; 495 m_eMode = CFX_SaxMode::TargetData;
491 ParseTargetData(); 496 ParseTargetData();
492 } 497 }
493 } 498 }
499
494 void CFX_SAXReader::ParseTagAttributeValue() { 500 void CFX_SAXReader::ParseTagAttributeValue() {
495 if (m_SkipChar) { 501 if (m_SkipChar) {
496 if (m_SkipChar == m_CurByte) { 502 if (m_SkipChar == m_CurByte) {
497 { 503 {
498 m_iDataLength = m_iDataPos; 504 m_iDataLength = m_iDataPos;
499 m_iDataPos = 0; 505 m_iDataPos = 0;
500 if (m_pHandler) { 506 if (m_pHandler) {
501 NotifyAttribute(); 507 NotifyAttribute();
502 } 508 }
503 } 509 }
504 m_SkipChar = 0; 510 m_SkipChar = 0;
505 m_eMode = CFX_SaxMode::TagAttributeName; 511 m_eMode = CFX_SaxMode::TagAttributeName;
506 return; 512 return;
507 } 513 }
508 ParseChar(m_CurByte); 514 ParseChar(m_CurByte);
509 return; 515 return;
510 } 516 }
511 if (m_CurByte < 0x21) { 517 if (m_CurByte < 0x21) {
512 return; 518 return;
513 } 519 }
514 if (m_iDataPos < 1) { 520 if (m_iDataPos < 1) {
515 if (m_CurByte == '\'' || m_CurByte == '\"') { 521 if (m_CurByte == '\'' || m_CurByte == '\"') {
516 m_SkipChar = m_CurByte; 522 m_SkipChar = m_CurByte;
517 } 523 }
518 } 524 }
519 } 525 }
526
520 void CFX_SAXReader::ParseMaybeClose() { 527 void CFX_SAXReader::ParseMaybeClose() {
521 if (m_CurByte == '>') { 528 if (m_CurByte == '>') {
522 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { 529 if (GetCurrentItem()->m_eNode == CFX_SAXItem::Type::Instruction) {
523 m_iNameLength = m_iDataPos; 530 m_iNameLength = m_iDataPos;
524 m_iDataPos = 0; 531 m_iDataPos = 0;
525 if (m_pHandler) { 532 if (m_pHandler) {
526 NotifyTargetData(); 533 NotifyTargetData();
527 } 534 }
528 } 535 }
529 ParseTagClose(); 536 ParseTagClose();
530 m_eMode = CFX_SaxMode::Text; 537 m_eMode = CFX_SaxMode::Text;
531 } else if (m_ePrevMode == CFX_SaxMode::TagName) { 538 } else if (m_ePrevMode == CFX_SaxMode::TagName) {
532 AppendData('/'); 539 AppendData('/');
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 } 647 }
641 } 648 }
642 break; 649 break;
643 } 650 }
644 if (iLen > 0) { 651 if (iLen > 0) {
645 ParseChar(m_CurByte); 652 ParseChar(m_CurByte);
646 } 653 }
647 } 654 }
648 655
649 void CFX_SAXReader::NotifyData() { 656 void CFX_SAXReader::NotifyData() {
650 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag) 657 CFX_SAXItem* pItem = GetCurrentItem();
658 if (!pItem)
659 return;
660
661 if (pItem->m_eNode == CFX_SAXItem::Type::Tag)
651 m_pHandler->OnTagData( 662 m_pHandler->OnTagData(
652 m_pCurItem->m_pNode, 663 pItem->m_pNode,
653 m_bCharData ? CFX_SAXItem::Type::CharData : CFX_SAXItem::Type::Text, 664 m_bCharData ? CFX_SAXItem::Type::CharData : CFX_SAXItem::Type::Text,
654 CFX_ByteStringC(m_pszData, m_iDataLength), 665 CFX_ByteStringC(m_pszData, m_iDataLength),
655 m_File.m_dwCur + m_dwDataOffset); 666 m_File.m_dwCur + m_dwDataOffset);
656 } 667 }
657 668
658 void CFX_SAXReader::NotifyEnter() { 669 void CFX_SAXReader::NotifyEnter() {
659 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag || 670 CFX_SAXItem* pItem = GetCurrentItem();
660 m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { 671 if (pItem->m_eNode == CFX_SAXItem::Type::Tag ||
661 m_pCurItem->m_pNode = 672 pItem->m_eNode == CFX_SAXItem::Type::Instruction) {
662 m_pHandler->OnTagEnter(CFX_ByteStringC(m_pszData, m_iDataLength), 673 pItem->m_pNode = m_pHandler->OnTagEnter(
663 m_pCurItem->m_eNode, m_dwNodePos); 674 CFX_ByteStringC(m_pszData, m_iDataLength), pItem->m_eNode, m_dwNodePos);
664 } 675 }
665 } 676 }
666 677
667 void CFX_SAXReader::NotifyAttribute() { 678 void CFX_SAXReader::NotifyAttribute() {
668 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag || 679 CFX_SAXItem* pItem = GetCurrentItem();
669 m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { 680 if (pItem->m_eNode == CFX_SAXItem::Type::Tag ||
670 m_pHandler->OnTagAttribute(m_pCurItem->m_pNode, 681 pItem->m_eNode == CFX_SAXItem::Type::Instruction) {
682 m_pHandler->OnTagAttribute(pItem->m_pNode,
671 CFX_ByteStringC(m_pszName, m_iNameLength), 683 CFX_ByteStringC(m_pszName, m_iNameLength),
672 CFX_ByteStringC(m_pszData, m_iDataLength)); 684 CFX_ByteStringC(m_pszData, m_iDataLength));
673 } 685 }
674 } 686 }
675 687
676 void CFX_SAXReader::NotifyBreak() { 688 void CFX_SAXReader::NotifyBreak() {
677 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag) 689 CFX_SAXItem* pItem = GetCurrentItem();
678 m_pHandler->OnTagBreak(m_pCurItem->m_pNode); 690 if (pItem->m_eNode == CFX_SAXItem::Type::Tag)
691 m_pHandler->OnTagBreak(pItem->m_pNode);
679 } 692 }
680 693
681 void CFX_SAXReader::NotifyClose() { 694 void CFX_SAXReader::NotifyClose() {
682 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Tag || 695 CFX_SAXItem* pItem = GetCurrentItem();
683 m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { 696 if (pItem->m_eNode == CFX_SAXItem::Type::Tag ||
684 m_pHandler->OnTagClose(m_pCurItem->m_pNode, m_dwNodePos); 697 pItem->m_eNode == CFX_SAXItem::Type::Instruction) {
698 m_pHandler->OnTagClose(pItem->m_pNode, m_dwNodePos);
685 } 699 }
686 } 700 }
687 701
688 void CFX_SAXReader::NotifyEnd() { 702 void CFX_SAXReader::NotifyEnd() {
689 if (m_pCurItem->m_eNode != CFX_SAXItem::Type::Tag) 703 CFX_SAXItem* pItem = GetCurrentItem();
704 if (!pItem || pItem->m_eNode != CFX_SAXItem::Type::Tag)
690 return; 705 return;
691 706
692 m_pHandler->OnTagEnd(m_pCurItem->m_pNode, 707 m_pHandler->OnTagEnd(pItem->m_pNode,
693 CFX_ByteStringC(m_pszData, m_iDataLength), m_dwNodePos); 708 CFX_ByteStringC(m_pszData, m_iDataLength), m_dwNodePos);
694 } 709 }
695 710
696 void CFX_SAXReader::NotifyTargetData() { 711 void CFX_SAXReader::NotifyTargetData() {
697 if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Instruction) { 712 CFX_SAXItem* pItem = GetCurrentItem();
698 m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, 713 if (pItem->m_eNode == CFX_SAXItem::Type::Instruction) {
714 m_pHandler->OnTargetData(pItem->m_pNode, pItem->m_eNode,
699 CFX_ByteStringC(m_pszName, m_iNameLength), 715 CFX_ByteStringC(m_pszName, m_iNameLength),
700 m_dwNodePos); 716 m_dwNodePos);
701 } else if (m_pCurItem->m_eNode == CFX_SAXItem::Type::Comment) { 717 } else if (pItem->m_eNode == CFX_SAXItem::Type::Comment) {
702 m_pHandler->OnTargetData(m_pCurItem->m_pNode, m_pCurItem->m_eNode, 718 m_pHandler->OnTargetData(pItem->m_pNode, pItem->m_eNode,
703 CFX_ByteStringC(m_pszData, m_iDataLength), 719 CFX_ByteStringC(m_pszData, m_iDataLength),
704 m_dwNodePos); 720 m_dwNodePos);
705 } 721 }
706 } 722 }
707 723
708 void CFX_SAXReader::SkipCurrentNode() { 724 void CFX_SAXReader::SkipCurrentNode() {
709 if (!m_pCurItem) 725 CFX_SAXItem* pItem = GetCurrentItem();
726 if (!pItem)
710 return; 727 return;
711 728
712 m_pCurItem->m_bSkip = TRUE; 729 pItem->m_bSkip = TRUE;
713 } 730 }
714 731
715 void CFX_SAXReader::SetHandler(CXFA_SAXReaderHandler* pHandler) { 732 void CFX_SAXReader::SetHandler(CXFA_SAXReaderHandler* pHandler) {
716 m_pHandler = pHandler; 733 m_pHandler = pHandler;
717 } 734 }
OLDNEW
« no previous file with comments | « xfa/fde/xml/cfx_saxreader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698