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

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

Issue 2378133003: Switch CFX_SAXReader to use std::stack. (Closed)
Patch Set: address comments, switch to unique_ptr 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/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
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
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
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
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 }
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