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

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

Issue 2072803002: Make code compile with clang_use_chrome_plugin (final) (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: rebase Created 4 years, 6 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/fde_xml_imp.h ('k') | xfa/fgas/crt/fgas_stream.cpp » ('j') | 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/fde_xml_imp.h" 7 #include "xfa/fde/xml/fde_xml_imp.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 } 73 }
74 return FALSE; 74 return FALSE;
75 } 75 }
76 76
77 CFDE_XMLNode::CFDE_XMLNode() 77 CFDE_XMLNode::CFDE_XMLNode()
78 : m_pParent(nullptr), 78 : m_pParent(nullptr),
79 m_pChild(nullptr), 79 m_pChild(nullptr),
80 m_pPrior(nullptr), 80 m_pPrior(nullptr),
81 m_pNext(nullptr) {} 81 m_pNext(nullptr) {}
82 82
83 void CFDE_XMLNode::Release() {
84 delete this;
85 }
86
87 FDE_XMLNODETYPE CFDE_XMLNode::GetType() const {
88 return FDE_XMLNODE_Unknown;
89 }
90
83 CFDE_XMLNode::~CFDE_XMLNode() { 91 CFDE_XMLNode::~CFDE_XMLNode() {
84 DeleteChildren(); 92 DeleteChildren();
85 } 93 }
86 94
87 void CFDE_XMLNode::DeleteChildren() { 95 void CFDE_XMLNode::DeleteChildren() {
88 CFDE_XMLNode* pChild = m_pChild; 96 CFDE_XMLNode* pChild = m_pChild;
89 while (pChild) { 97 while (pChild) {
90 CFDE_XMLNode* pTemp = pChild->m_pNext; 98 CFDE_XMLNode* pTemp = pChild->m_pNext;
91 pChild->Release(); 99 pChild->Release();
92 pChild = pTemp; 100 pChild = pTemp;
93 } 101 }
94 m_pChild = nullptr; 102 m_pChild = nullptr;
95 } 103 }
104
96 int32_t CFDE_XMLNode::CountChildNodes() const { 105 int32_t CFDE_XMLNode::CountChildNodes() const {
97 int32_t iCount = 0; 106 int32_t iCount = 0;
98 CFDE_XMLNode* pChild = m_pChild; 107 CFDE_XMLNode* pChild = m_pChild;
99 while (pChild) { 108 while (pChild) {
100 iCount++; 109 iCount++;
101 pChild = pChild->m_pNext; 110 pChild = pChild->m_pNext;
102 } 111 }
103 return iCount; 112 return iCount;
104 } 113 }
114
105 CFDE_XMLNode* CFDE_XMLNode::GetChildNode(int32_t index) const { 115 CFDE_XMLNode* CFDE_XMLNode::GetChildNode(int32_t index) const {
106 CFDE_XMLNode* pChild = m_pChild; 116 CFDE_XMLNode* pChild = m_pChild;
107 while (pChild) { 117 while (pChild) {
108 if (index == 0) { 118 if (index == 0) {
109 return pChild; 119 return pChild;
110 } 120 }
111 index--; 121 index--;
112 pChild = pChild->m_pNext; 122 pChild = pChild->m_pNext;
113 } 123 }
114 return nullptr; 124 return nullptr;
115 } 125 }
126
116 int32_t CFDE_XMLNode::GetChildNodeIndex(CFDE_XMLNode* pNode) const { 127 int32_t CFDE_XMLNode::GetChildNodeIndex(CFDE_XMLNode* pNode) const {
117 int32_t index = 0; 128 int32_t index = 0;
118 CFDE_XMLNode* pChild = m_pChild; 129 CFDE_XMLNode* pChild = m_pChild;
119 while (pChild) { 130 while (pChild) {
120 if (pChild == pNode) { 131 if (pChild == pNode) {
121 return index; 132 return index;
122 } 133 }
123 index++; 134 index++;
124 pChild = pChild->m_pNext; 135 pChild = pChild->m_pNext;
125 } 136 }
126 return -1; 137 return -1;
127 } 138 }
139
128 CFDE_XMLNode* CFDE_XMLNode::GetPath(const FX_WCHAR* pPath, 140 CFDE_XMLNode* CFDE_XMLNode::GetPath(const FX_WCHAR* pPath,
129 int32_t iLength, 141 int32_t iLength,
130 FX_BOOL bQualifiedName) const { 142 FX_BOOL bQualifiedName) const {
131 ASSERT(pPath); 143 ASSERT(pPath);
132 if (iLength < 0) { 144 if (iLength < 0) {
133 iLength = FXSYS_wcslen(pPath); 145 iLength = FXSYS_wcslen(pPath);
134 } 146 }
135 if (iLength == 0) { 147 if (iLength == 0) {
136 return nullptr; 148 return nullptr;
137 } 149 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 return pFind; 187 return pFind;
176 } 188 }
177 } 189 }
178 pNode = pNode->m_pNext; 190 pNode = pNode->m_pNext;
179 } 191 }
180 } 192 }
181 if (!pFind || iLength < 1) 193 if (!pFind || iLength < 1)
182 return pFind; 194 return pFind;
183 return pFind->GetPath(pStart, iLength, bQualifiedName); 195 return pFind->GetPath(pStart, iLength, bQualifiedName);
184 } 196 }
197
185 int32_t CFDE_XMLNode::InsertChildNode(CFDE_XMLNode* pNode, int32_t index) { 198 int32_t CFDE_XMLNode::InsertChildNode(CFDE_XMLNode* pNode, int32_t index) {
186 pNode->m_pParent = this; 199 pNode->m_pParent = this;
187 if (!m_pChild) { 200 if (!m_pChild) {
188 m_pChild = pNode; 201 m_pChild = pNode;
189 pNode->m_pPrior = nullptr; 202 pNode->m_pPrior = nullptr;
190 pNode->m_pNext = nullptr; 203 pNode->m_pNext = nullptr;
191 return 0; 204 return 0;
192 } 205 }
193 if (index == 0) { 206 if (index == 0) {
194 pNode->m_pNext = m_pChild; 207 pNode->m_pNext = m_pChild;
195 pNode->m_pPrior = nullptr; 208 pNode->m_pPrior = nullptr;
196 m_pChild->m_pPrior = pNode; 209 m_pChild->m_pPrior = pNode;
197 m_pChild = pNode; 210 m_pChild = pNode;
198 return 0; 211 return 0;
199 } 212 }
200 int32_t iCount = 0; 213 int32_t iCount = 0;
201 CFDE_XMLNode* pFind = m_pChild; 214 CFDE_XMLNode* pFind = m_pChild;
202 while (++iCount != index && pFind->m_pNext) { 215 while (++iCount != index && pFind->m_pNext) {
203 pFind = pFind->m_pNext; 216 pFind = pFind->m_pNext;
204 } 217 }
205 pNode->m_pPrior = pFind; 218 pNode->m_pPrior = pFind;
206 pNode->m_pNext = pFind->m_pNext; 219 pNode->m_pNext = pFind->m_pNext;
207 if (pFind->m_pNext) 220 if (pFind->m_pNext)
208 pFind->m_pNext->m_pPrior = pNode; 221 pFind->m_pNext->m_pPrior = pNode;
209 pFind->m_pNext = pNode; 222 pFind->m_pNext = pNode;
210 return iCount; 223 return iCount;
211 } 224 }
225
212 void CFDE_XMLNode::RemoveChildNode(CFDE_XMLNode* pNode) { 226 void CFDE_XMLNode::RemoveChildNode(CFDE_XMLNode* pNode) {
213 ASSERT(m_pChild && pNode); 227 ASSERT(m_pChild && pNode);
214 if (m_pChild == pNode) { 228 if (m_pChild == pNode) {
215 m_pChild = pNode->m_pNext; 229 m_pChild = pNode->m_pNext;
216 } else { 230 } else {
217 pNode->m_pPrior->m_pNext = pNode->m_pNext; 231 pNode->m_pPrior->m_pNext = pNode->m_pNext;
218 } 232 }
219 if (pNode->m_pNext) 233 if (pNode->m_pNext)
220 pNode->m_pNext->m_pPrior = pNode->m_pPrior; 234 pNode->m_pNext->m_pPrior = pNode->m_pPrior;
221 pNode->m_pParent = nullptr; 235 pNode->m_pParent = nullptr;
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 } else if (m_pParent) { 359 } else if (m_pParent) {
346 m_pParent->m_pChild = pNode; 360 m_pParent->m_pChild = pNode;
347 } 361 }
348 m_pPrior = pNode; 362 m_pPrior = pNode;
349 return TRUE; 363 return TRUE;
350 } 364 }
351 default: 365 default:
352 return FALSE; 366 return FALSE;
353 } 367 }
354 } 368 }
369
355 CFDE_XMLNode* CFDE_XMLNode::RemoveNodeItem(CFDE_XMLNode::NodeItem eItem) { 370 CFDE_XMLNode* CFDE_XMLNode::RemoveNodeItem(CFDE_XMLNode::NodeItem eItem) {
356 CFDE_XMLNode* pNode = nullptr; 371 CFDE_XMLNode* pNode = nullptr;
357 switch (eItem) { 372 switch (eItem) {
358 case CFDE_XMLNode::NextSibling: 373 case CFDE_XMLNode::NextSibling:
359 if (m_pNext) { 374 if (m_pNext) {
360 pNode = m_pNext; 375 pNode = m_pNext;
361 m_pNext = pNode->m_pNext; 376 m_pNext = pNode->m_pNext;
362 if (m_pNext) { 377 if (m_pNext) {
363 m_pNext->m_pPrior = this; 378 m_pNext->m_pPrior = this;
364 } 379 }
365 pNode->m_pParent = nullptr; 380 pNode->m_pParent = nullptr;
366 pNode->m_pNext = nullptr; 381 pNode->m_pNext = nullptr;
367 pNode->m_pPrior = nullptr; 382 pNode->m_pPrior = nullptr;
368 } 383 }
369 break; 384 break;
370 default: 385 default:
371 break; 386 break;
372 } 387 }
373 return pNode; 388 return pNode;
374 } 389 }
390
375 CFDE_XMLNode* CFDE_XMLNode::Clone(FX_BOOL bRecursive) { 391 CFDE_XMLNode* CFDE_XMLNode::Clone(FX_BOOL bRecursive) {
376 return nullptr; 392 return nullptr;
377 } 393 }
394
378 void CFDE_XMLNode::SaveXMLNode(IFX_Stream* pXMLStream) { 395 void CFDE_XMLNode::SaveXMLNode(IFX_Stream* pXMLStream) {
379 CFDE_XMLNode* pNode = (CFDE_XMLNode*)this; 396 CFDE_XMLNode* pNode = (CFDE_XMLNode*)this;
380 switch (pNode->GetType()) { 397 switch (pNode->GetType()) {
381 case FDE_XMLNODE_Instruction: { 398 case FDE_XMLNODE_Instruction: {
382 CFX_WideString ws; 399 CFX_WideString ws;
383 CFDE_XMLInstruction* pInstruction = (CFDE_XMLInstruction*)pNode; 400 CFDE_XMLInstruction* pInstruction = (CFDE_XMLInstruction*)pNode;
384 if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) { 401 if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) {
385 ws = L"<?xml version=\"1.0\" encoding=\""; 402 ws = L"<?xml version=\"1.0\" encoding=\"";
386 uint16_t wCodePage = pXMLStream->GetCodePage(); 403 uint16_t wCodePage = pXMLStream->GetCodePage();
387 if (wCodePage == FX_CODEPAGE_UTF16LE) { 404 if (wCodePage == FX_CODEPAGE_UTF16LE) {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 ws += ((CFDE_XMLCharData*)pNode)->m_wsCharData; 494 ws += ((CFDE_XMLCharData*)pNode)->m_wsCharData;
478 ws += L"]]>"; 495 ws += L"]]>";
479 pXMLStream->WriteString(ws.c_str(), ws.GetLength()); 496 pXMLStream->WriteString(ws.c_str(), ws.GetLength());
480 } break; 497 } break;
481 case FDE_XMLNODE_Unknown: 498 case FDE_XMLNODE_Unknown:
482 break; 499 break;
483 default: 500 default:
484 break; 501 break;
485 } 502 }
486 } 503 }
504
487 void CFDE_XMLNode::CloneChildren(CFDE_XMLNode* pClone) { 505 void CFDE_XMLNode::CloneChildren(CFDE_XMLNode* pClone) {
488 if (!m_pChild) { 506 if (!m_pChild) {
489 return; 507 return;
490 } 508 }
491 CFDE_XMLNode* pNext = m_pChild; 509 CFDE_XMLNode* pNext = m_pChild;
492 CFDE_XMLNode* pCloneNext = pNext->Clone(TRUE); 510 CFDE_XMLNode* pCloneNext = pNext->Clone(TRUE);
493 pClone->InsertChildNode(pCloneNext); 511 pClone->InsertChildNode(pCloneNext);
494 pNext = pNext->m_pNext; 512 pNext = pNext->m_pNext;
495 while (pNext) { 513 while (pNext) {
496 CFDE_XMLNode* pChild = pNext->Clone(TRUE); 514 CFDE_XMLNode* pChild = pNext->Clone(TRUE);
497 pCloneNext->InsertNodeItem(CFDE_XMLNode::NextSibling, pChild); 515 pCloneNext->InsertNodeItem(CFDE_XMLNode::NextSibling, pChild);
498 pCloneNext = pChild; 516 pCloneNext = pChild;
499 pNext = pNext->m_pNext; 517 pNext = pNext->m_pNext;
500 } 518 }
501 } 519 }
502 520
503 CFDE_XMLInstruction::CFDE_XMLInstruction(const CFX_WideString& wsTarget) 521 CFDE_XMLInstruction::CFDE_XMLInstruction(const CFX_WideString& wsTarget)
504 : m_wsTarget(wsTarget) { 522 : m_wsTarget(wsTarget) {
505 ASSERT(m_wsTarget.GetLength() > 0); 523 ASSERT(m_wsTarget.GetLength() > 0);
506 } 524 }
525
526 void CFDE_XMLInstruction::Release() {
527 delete this;
528 }
529
530 FDE_XMLNODETYPE CFDE_XMLInstruction::GetType() const {
531 return FDE_XMLNODE_Instruction;
532 }
533
507 CFDE_XMLNode* CFDE_XMLInstruction::Clone(FX_BOOL bRecursive) { 534 CFDE_XMLNode* CFDE_XMLInstruction::Clone(FX_BOOL bRecursive) {
508 CFDE_XMLInstruction* pClone = new CFDE_XMLInstruction(m_wsTarget); 535 CFDE_XMLInstruction* pClone = new CFDE_XMLInstruction(m_wsTarget);
509 if (!pClone) { 536 if (!pClone) {
510 return pClone; 537 return pClone;
511 } 538 }
512 pClone->m_Attributes.Copy(m_Attributes); 539 pClone->m_Attributes.Copy(m_Attributes);
513 pClone->m_TargetData.Copy(m_TargetData); 540 pClone->m_TargetData.Copy(m_TargetData);
514 if (bRecursive) { 541 if (bRecursive) {
515 CloneChildren(pClone); 542 CloneChildren(pClone);
516 } 543 }
517 return pClone; 544 return pClone;
518 } 545 }
546
519 int32_t CFDE_XMLInstruction::CountAttributes() const { 547 int32_t CFDE_XMLInstruction::CountAttributes() const {
520 return m_Attributes.GetSize() / 2; 548 return m_Attributes.GetSize() / 2;
521 } 549 }
550
522 FX_BOOL CFDE_XMLInstruction::GetAttribute(int32_t index, 551 FX_BOOL CFDE_XMLInstruction::GetAttribute(int32_t index,
523 CFX_WideString& wsAttriName, 552 CFX_WideString& wsAttriName,
524 CFX_WideString& wsAttriValue) const { 553 CFX_WideString& wsAttriValue) const {
525 int32_t iCount = m_Attributes.GetSize(); 554 int32_t iCount = m_Attributes.GetSize();
526 ASSERT(index > -1 && index < iCount / 2); 555 ASSERT(index > -1 && index < iCount / 2);
527 for (int32_t i = 0; i < iCount; i += 2) { 556 for (int32_t i = 0; i < iCount; i += 2) {
528 if (index == 0) { 557 if (index == 0) {
529 wsAttriName = m_Attributes[i]; 558 wsAttriName = m_Attributes[i];
530 wsAttriValue = m_Attributes[i + 1]; 559 wsAttriValue = m_Attributes[i + 1];
531 return TRUE; 560 return TRUE;
532 } 561 }
533 index--; 562 index--;
534 } 563 }
535 return FALSE; 564 return FALSE;
536 } 565 }
566
537 FX_BOOL CFDE_XMLInstruction::HasAttribute(const FX_WCHAR* pwsAttriName) const { 567 FX_BOOL CFDE_XMLInstruction::HasAttribute(const FX_WCHAR* pwsAttriName) const {
538 int32_t iCount = m_Attributes.GetSize(); 568 int32_t iCount = m_Attributes.GetSize();
539 for (int32_t i = 0; i < iCount; i += 2) { 569 for (int32_t i = 0; i < iCount; i += 2) {
540 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 570 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
541 return TRUE; 571 return TRUE;
542 } 572 }
543 } 573 }
544 return FALSE; 574 return FALSE;
545 } 575 }
576
546 void CFDE_XMLInstruction::GetString(const FX_WCHAR* pwsAttriName, 577 void CFDE_XMLInstruction::GetString(const FX_WCHAR* pwsAttriName,
547 CFX_WideString& wsAttriValue, 578 CFX_WideString& wsAttriValue,
548 const FX_WCHAR* pwsDefValue) const { 579 const FX_WCHAR* pwsDefValue) const {
549 int32_t iCount = m_Attributes.GetSize(); 580 int32_t iCount = m_Attributes.GetSize();
550 for (int32_t i = 0; i < iCount; i += 2) { 581 for (int32_t i = 0; i < iCount; i += 2) {
551 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 582 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
552 wsAttriValue = m_Attributes[i + 1]; 583 wsAttriValue = m_Attributes[i + 1];
553 return; 584 return;
554 } 585 }
555 } 586 }
556 wsAttriValue = pwsDefValue; 587 wsAttriValue = pwsDefValue;
557 } 588 }
589
558 void CFDE_XMLInstruction::SetString(const CFX_WideString& wsAttriName, 590 void CFDE_XMLInstruction::SetString(const CFX_WideString& wsAttriName,
559 const CFX_WideString& wsAttriValue) { 591 const CFX_WideString& wsAttriValue) {
560 ASSERT(wsAttriName.GetLength() > 0); 592 ASSERT(wsAttriName.GetLength() > 0);
561 int32_t iCount = m_Attributes.GetSize(); 593 int32_t iCount = m_Attributes.GetSize();
562 for (int32_t i = 0; i < iCount; i += 2) { 594 for (int32_t i = 0; i < iCount; i += 2) {
563 if (m_Attributes[i].Compare(wsAttriName) == 0) { 595 if (m_Attributes[i].Compare(wsAttriName) == 0) {
564 m_Attributes[i] = wsAttriName; 596 m_Attributes[i] = wsAttriName;
565 m_Attributes[i + 1] = wsAttriValue; 597 m_Attributes[i + 1] = wsAttriValue;
566 return; 598 return;
567 } 599 }
568 } 600 }
569 m_Attributes.Add(wsAttriName); 601 m_Attributes.Add(wsAttriName);
570 m_Attributes.Add(wsAttriValue); 602 m_Attributes.Add(wsAttriValue);
571 } 603 }
604
572 int32_t CFDE_XMLInstruction::GetInteger(const FX_WCHAR* pwsAttriName, 605 int32_t CFDE_XMLInstruction::GetInteger(const FX_WCHAR* pwsAttriName,
573 int32_t iDefValue) const { 606 int32_t iDefValue) const {
574 int32_t iCount = m_Attributes.GetSize(); 607 int32_t iCount = m_Attributes.GetSize();
575 for (int32_t i = 0; i < iCount; i += 2) { 608 for (int32_t i = 0; i < iCount; i += 2) {
576 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 609 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
577 return FXSYS_wtoi(m_Attributes[i + 1].c_str()); 610 return FXSYS_wtoi(m_Attributes[i + 1].c_str());
578 } 611 }
579 } 612 }
580 return iDefValue; 613 return iDefValue;
581 } 614 }
615
582 void CFDE_XMLInstruction::SetInteger(const FX_WCHAR* pwsAttriName, 616 void CFDE_XMLInstruction::SetInteger(const FX_WCHAR* pwsAttriName,
583 int32_t iAttriValue) { 617 int32_t iAttriValue) {
584 CFX_WideString wsValue; 618 CFX_WideString wsValue;
585 wsValue.Format(L"%d", iAttriValue); 619 wsValue.Format(L"%d", iAttriValue);
586 SetString(pwsAttriName, wsValue); 620 SetString(pwsAttriName, wsValue);
587 } 621 }
622
588 FX_FLOAT CFDE_XMLInstruction::GetFloat(const FX_WCHAR* pwsAttriName, 623 FX_FLOAT CFDE_XMLInstruction::GetFloat(const FX_WCHAR* pwsAttriName,
589 FX_FLOAT fDefValue) const { 624 FX_FLOAT fDefValue) const {
590 int32_t iCount = m_Attributes.GetSize(); 625 int32_t iCount = m_Attributes.GetSize();
591 for (int32_t i = 0; i < iCount; i += 2) { 626 for (int32_t i = 0; i < iCount; i += 2) {
592 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 627 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
593 return FX_wcstof(m_Attributes[i + 1].c_str()); 628 return FX_wcstof(m_Attributes[i + 1].c_str());
594 } 629 }
595 } 630 }
596 return fDefValue; 631 return fDefValue;
597 } 632 }
633
598 void CFDE_XMLInstruction::SetFloat(const FX_WCHAR* pwsAttriName, 634 void CFDE_XMLInstruction::SetFloat(const FX_WCHAR* pwsAttriName,
599 FX_FLOAT fAttriValue) { 635 FX_FLOAT fAttriValue) {
600 CFX_WideString wsValue; 636 CFX_WideString wsValue;
601 wsValue.Format(L"%f", fAttriValue); 637 wsValue.Format(L"%f", fAttriValue);
602 SetString(pwsAttriName, wsValue); 638 SetString(pwsAttriName, wsValue);
603 } 639 }
640
604 void CFDE_XMLInstruction::RemoveAttribute(const FX_WCHAR* pwsAttriName) { 641 void CFDE_XMLInstruction::RemoveAttribute(const FX_WCHAR* pwsAttriName) {
605 int32_t iCount = m_Attributes.GetSize(); 642 int32_t iCount = m_Attributes.GetSize();
606 for (int32_t i = 0; i < iCount; i += 2) { 643 for (int32_t i = 0; i < iCount; i += 2) {
607 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 644 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
608 m_Attributes.RemoveAt(i + 1); 645 m_Attributes.RemoveAt(i + 1);
609 m_Attributes.RemoveAt(i); 646 m_Attributes.RemoveAt(i);
610 return; 647 return;
611 } 648 }
612 } 649 }
613 } 650 }
651
614 int32_t CFDE_XMLInstruction::CountData() const { 652 int32_t CFDE_XMLInstruction::CountData() const {
615 return m_TargetData.GetSize(); 653 return m_TargetData.GetSize();
616 } 654 }
655
617 FX_BOOL CFDE_XMLInstruction::GetData(int32_t index, 656 FX_BOOL CFDE_XMLInstruction::GetData(int32_t index,
618 CFX_WideString& wsData) const { 657 CFX_WideString& wsData) const {
619 if (index < 0 || index >= m_TargetData.GetSize()) { 658 if (index < 0 || index >= m_TargetData.GetSize()) {
620 return FALSE; 659 return FALSE;
621 } 660 }
622 wsData = m_TargetData[index]; 661 wsData = m_TargetData[index];
623 return TRUE; 662 return TRUE;
624 } 663 }
664
625 void CFDE_XMLInstruction::AppendData(const CFX_WideString& wsData) { 665 void CFDE_XMLInstruction::AppendData(const CFX_WideString& wsData) {
626 m_TargetData.Add(wsData); 666 m_TargetData.Add(wsData);
627 } 667 }
668
628 void CFDE_XMLInstruction::RemoveData(int32_t index) { 669 void CFDE_XMLInstruction::RemoveData(int32_t index) {
629 m_TargetData.RemoveAt(index); 670 m_TargetData.RemoveAt(index);
630 } 671 }
631 672
673 CFDE_XMLInstruction::~CFDE_XMLInstruction() {}
674
632 CFDE_XMLElement::CFDE_XMLElement(const CFX_WideString& wsTag) 675 CFDE_XMLElement::CFDE_XMLElement(const CFX_WideString& wsTag)
633 : CFDE_XMLNode(), m_wsTag(wsTag), m_Attributes() { 676 : CFDE_XMLNode(), m_wsTag(wsTag), m_Attributes() {
634 ASSERT(m_wsTag.GetLength() > 0); 677 ASSERT(m_wsTag.GetLength() > 0);
635 } 678 }
679
636 CFDE_XMLElement::~CFDE_XMLElement() { 680 CFDE_XMLElement::~CFDE_XMLElement() {
637 m_Attributes.RemoveAll(); 681 m_Attributes.RemoveAll();
638 } 682 }
683
684 void CFDE_XMLElement::Release() {
685 delete this;
686 }
687
688 FDE_XMLNODETYPE CFDE_XMLElement::GetType() const {
689 return FDE_XMLNODE_Element;
690 }
691
639 CFDE_XMLNode* CFDE_XMLElement::Clone(FX_BOOL bRecursive) { 692 CFDE_XMLNode* CFDE_XMLElement::Clone(FX_BOOL bRecursive) {
640 CFDE_XMLElement* pClone = new CFDE_XMLElement(m_wsTag); 693 CFDE_XMLElement* pClone = new CFDE_XMLElement(m_wsTag);
641 if (!pClone) { 694 if (!pClone) {
642 return nullptr; 695 return nullptr;
643 } 696 }
644 pClone->m_Attributes.Copy(m_Attributes); 697 pClone->m_Attributes.Copy(m_Attributes);
645 if (bRecursive) { 698 if (bRecursive) {
646 CloneChildren(pClone); 699 CloneChildren(pClone);
647 } else { 700 } else {
648 CFX_WideString wsText; 701 CFX_WideString wsText;
649 CFDE_XMLNode* pChild = m_pChild; 702 CFDE_XMLNode* pChild = m_pChild;
650 while (pChild) { 703 while (pChild) {
651 switch (pChild->GetType()) { 704 switch (pChild->GetType()) {
652 case FDE_XMLNODE_Text: 705 case FDE_XMLNODE_Text:
653 wsText += ((CFDE_XMLText*)pChild)->m_wsText; 706 wsText += ((CFDE_XMLText*)pChild)->m_wsText;
654 break; 707 break;
655 default: 708 default:
656 break; 709 break;
657 } 710 }
658 pChild = pChild->m_pNext; 711 pChild = pChild->m_pNext;
659 } 712 }
660 pClone->SetTextData(wsText); 713 pClone->SetTextData(wsText);
661 } 714 }
662 return pClone; 715 return pClone;
663 } 716 }
717
664 void CFDE_XMLElement::GetTagName(CFX_WideString& wsTag) const { 718 void CFDE_XMLElement::GetTagName(CFX_WideString& wsTag) const {
665 wsTag = m_wsTag; 719 wsTag = m_wsTag;
666 } 720 }
721
667 void CFDE_XMLElement::GetLocalTagName(CFX_WideString& wsTag) const { 722 void CFDE_XMLElement::GetLocalTagName(CFX_WideString& wsTag) const {
668 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); 723 FX_STRSIZE iFind = m_wsTag.Find(L':', 0);
669 if (iFind < 0) { 724 if (iFind < 0) {
670 wsTag = m_wsTag; 725 wsTag = m_wsTag;
671 } else { 726 } else {
672 wsTag = m_wsTag.Right(m_wsTag.GetLength() - iFind - 1); 727 wsTag = m_wsTag.Right(m_wsTag.GetLength() - iFind - 1);
673 } 728 }
674 } 729 }
730
675 void CFDE_XMLElement::GetNamespacePrefix(CFX_WideString& wsPrefix) const { 731 void CFDE_XMLElement::GetNamespacePrefix(CFX_WideString& wsPrefix) const {
676 FX_STRSIZE iFind = m_wsTag.Find(L':', 0); 732 FX_STRSIZE iFind = m_wsTag.Find(L':', 0);
677 if (iFind < 0) { 733 if (iFind < 0) {
678 wsPrefix.clear(); 734 wsPrefix.clear();
679 } else { 735 } else {
680 wsPrefix = m_wsTag.Left(iFind); 736 wsPrefix = m_wsTag.Left(iFind);
681 } 737 }
682 } 738 }
739
683 void CFDE_XMLElement::GetNamespaceURI(CFX_WideString& wsNamespace) const { 740 void CFDE_XMLElement::GetNamespaceURI(CFX_WideString& wsNamespace) const {
684 CFX_WideString wsAttri(L"xmlns"), wsPrefix; 741 CFX_WideString wsAttri(L"xmlns"), wsPrefix;
685 GetNamespacePrefix(wsPrefix); 742 GetNamespacePrefix(wsPrefix);
686 if (wsPrefix.GetLength() > 0) { 743 if (wsPrefix.GetLength() > 0) {
687 wsAttri += L":"; 744 wsAttri += L":";
688 wsAttri += wsPrefix; 745 wsAttri += wsPrefix;
689 } 746 }
690 wsNamespace.clear(); 747 wsNamespace.clear();
691 CFDE_XMLNode* pNode = (CFDE_XMLNode*)this; 748 CFDE_XMLNode* pNode = (CFDE_XMLNode*)this;
692 while (pNode) { 749 while (pNode) {
693 if (pNode->GetType() != FDE_XMLNODE_Element) { 750 if (pNode->GetType() != FDE_XMLNODE_Element) {
694 break; 751 break;
695 } 752 }
696 CFDE_XMLElement* pElement = (CFDE_XMLElement*)pNode; 753 CFDE_XMLElement* pElement = (CFDE_XMLElement*)pNode;
697 if (!pElement->HasAttribute(wsAttri.c_str())) { 754 if (!pElement->HasAttribute(wsAttri.c_str())) {
698 pNode = pNode->GetNodeItem(CFDE_XMLNode::Parent); 755 pNode = pNode->GetNodeItem(CFDE_XMLNode::Parent);
699 continue; 756 continue;
700 } 757 }
701 pElement->GetString(wsAttri.c_str(), wsNamespace); 758 pElement->GetString(wsAttri.c_str(), wsNamespace);
702 break; 759 break;
703 } 760 }
704 } 761 }
762
705 int32_t CFDE_XMLElement::CountAttributes() const { 763 int32_t CFDE_XMLElement::CountAttributes() const {
706 return m_Attributes.GetSize() / 2; 764 return m_Attributes.GetSize() / 2;
707 } 765 }
766
708 FX_BOOL CFDE_XMLElement::GetAttribute(int32_t index, 767 FX_BOOL CFDE_XMLElement::GetAttribute(int32_t index,
709 CFX_WideString& wsAttriName, 768 CFX_WideString& wsAttriName,
710 CFX_WideString& wsAttriValue) const { 769 CFX_WideString& wsAttriValue) const {
711 int32_t iCount = m_Attributes.GetSize(); 770 int32_t iCount = m_Attributes.GetSize();
712 ASSERT(index > -1 && index < iCount / 2); 771 ASSERT(index > -1 && index < iCount / 2);
713 for (int32_t i = 0; i < iCount; i += 2) { 772 for (int32_t i = 0; i < iCount; i += 2) {
714 if (index == 0) { 773 if (index == 0) {
715 wsAttriName = m_Attributes[i]; 774 wsAttriName = m_Attributes[i];
716 wsAttriValue = m_Attributes[i + 1]; 775 wsAttriValue = m_Attributes[i + 1];
717 return TRUE; 776 return TRUE;
718 } 777 }
719 index--; 778 index--;
720 } 779 }
721 return FALSE; 780 return FALSE;
722 } 781 }
782
723 FX_BOOL CFDE_XMLElement::HasAttribute(const FX_WCHAR* pwsAttriName) const { 783 FX_BOOL CFDE_XMLElement::HasAttribute(const FX_WCHAR* pwsAttriName) const {
724 int32_t iCount = m_Attributes.GetSize(); 784 int32_t iCount = m_Attributes.GetSize();
725 for (int32_t i = 0; i < iCount; i += 2) { 785 for (int32_t i = 0; i < iCount; i += 2) {
726 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 786 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
727 return TRUE; 787 return TRUE;
728 } 788 }
729 } 789 }
730 return FALSE; 790 return FALSE;
731 } 791 }
792
732 void CFDE_XMLElement::GetString(const FX_WCHAR* pwsAttriName, 793 void CFDE_XMLElement::GetString(const FX_WCHAR* pwsAttriName,
733 CFX_WideString& wsAttriValue, 794 CFX_WideString& wsAttriValue,
734 const FX_WCHAR* pwsDefValue) const { 795 const FX_WCHAR* pwsDefValue) const {
735 int32_t iCount = m_Attributes.GetSize(); 796 int32_t iCount = m_Attributes.GetSize();
736 for (int32_t i = 0; i < iCount; i += 2) { 797 for (int32_t i = 0; i < iCount; i += 2) {
737 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 798 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
738 wsAttriValue = m_Attributes[i + 1]; 799 wsAttriValue = m_Attributes[i + 1];
739 return; 800 return;
740 } 801 }
741 } 802 }
742 wsAttriValue = pwsDefValue; 803 wsAttriValue = pwsDefValue;
743 } 804 }
805
744 void CFDE_XMLElement::SetString(const CFX_WideString& wsAttriName, 806 void CFDE_XMLElement::SetString(const CFX_WideString& wsAttriName,
745 const CFX_WideString& wsAttriValue) { 807 const CFX_WideString& wsAttriValue) {
746 ASSERT(wsAttriName.GetLength() > 0); 808 ASSERT(wsAttriName.GetLength() > 0);
747 int32_t iCount = m_Attributes.GetSize(); 809 int32_t iCount = m_Attributes.GetSize();
748 for (int32_t i = 0; i < iCount; i += 2) { 810 for (int32_t i = 0; i < iCount; i += 2) {
749 if (m_Attributes[i].Compare(wsAttriName) == 0) { 811 if (m_Attributes[i].Compare(wsAttriName) == 0) {
750 m_Attributes[i] = wsAttriName; 812 m_Attributes[i] = wsAttriName;
751 m_Attributes[i + 1] = wsAttriValue; 813 m_Attributes[i + 1] = wsAttriValue;
752 return; 814 return;
753 } 815 }
754 } 816 }
755 m_Attributes.Add(wsAttriName); 817 m_Attributes.Add(wsAttriName);
756 m_Attributes.Add(wsAttriValue); 818 m_Attributes.Add(wsAttriValue);
757 } 819 }
820
758 int32_t CFDE_XMLElement::GetInteger(const FX_WCHAR* pwsAttriName, 821 int32_t CFDE_XMLElement::GetInteger(const FX_WCHAR* pwsAttriName,
759 int32_t iDefValue) const { 822 int32_t iDefValue) const {
760 int32_t iCount = m_Attributes.GetSize(); 823 int32_t iCount = m_Attributes.GetSize();
761 for (int32_t i = 0; i < iCount; i += 2) { 824 for (int32_t i = 0; i < iCount; i += 2) {
762 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 825 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
763 return FXSYS_wtoi(m_Attributes[i + 1].c_str()); 826 return FXSYS_wtoi(m_Attributes[i + 1].c_str());
764 } 827 }
765 } 828 }
766 return iDefValue; 829 return iDefValue;
767 } 830 }
831
768 void CFDE_XMLElement::SetInteger(const FX_WCHAR* pwsAttriName, 832 void CFDE_XMLElement::SetInteger(const FX_WCHAR* pwsAttriName,
769 int32_t iAttriValue) { 833 int32_t iAttriValue) {
770 CFX_WideString wsValue; 834 CFX_WideString wsValue;
771 wsValue.Format(L"%d", iAttriValue); 835 wsValue.Format(L"%d", iAttriValue);
772 SetString(pwsAttriName, wsValue); 836 SetString(pwsAttriName, wsValue);
773 } 837 }
838
774 FX_FLOAT CFDE_XMLElement::GetFloat(const FX_WCHAR* pwsAttriName, 839 FX_FLOAT CFDE_XMLElement::GetFloat(const FX_WCHAR* pwsAttriName,
775 FX_FLOAT fDefValue) const { 840 FX_FLOAT fDefValue) const {
776 int32_t iCount = m_Attributes.GetSize(); 841 int32_t iCount = m_Attributes.GetSize();
777 for (int32_t i = 0; i < iCount; i += 2) { 842 for (int32_t i = 0; i < iCount; i += 2) {
778 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 843 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
779 return FX_wcstof(m_Attributes[i + 1].c_str()); 844 return FX_wcstof(m_Attributes[i + 1].c_str());
780 } 845 }
781 } 846 }
782 return fDefValue; 847 return fDefValue;
783 } 848 }
849
784 void CFDE_XMLElement::SetFloat(const FX_WCHAR* pwsAttriName, 850 void CFDE_XMLElement::SetFloat(const FX_WCHAR* pwsAttriName,
785 FX_FLOAT fAttriValue) { 851 FX_FLOAT fAttriValue) {
786 CFX_WideString wsValue; 852 CFX_WideString wsValue;
787 wsValue.Format(L"%f", fAttriValue); 853 wsValue.Format(L"%f", fAttriValue);
788 SetString(pwsAttriName, wsValue); 854 SetString(pwsAttriName, wsValue);
789 } 855 }
856
790 void CFDE_XMLElement::RemoveAttribute(const FX_WCHAR* pwsAttriName) { 857 void CFDE_XMLElement::RemoveAttribute(const FX_WCHAR* pwsAttriName) {
791 int32_t iCount = m_Attributes.GetSize(); 858 int32_t iCount = m_Attributes.GetSize();
792 for (int32_t i = 0; i < iCount; i += 2) { 859 for (int32_t i = 0; i < iCount; i += 2) {
793 if (m_Attributes[i].Compare(pwsAttriName) == 0) { 860 if (m_Attributes[i].Compare(pwsAttriName) == 0) {
794 m_Attributes.RemoveAt(i + 1); 861 m_Attributes.RemoveAt(i + 1);
795 m_Attributes.RemoveAt(i); 862 m_Attributes.RemoveAt(i);
796 return; 863 return;
797 } 864 }
798 } 865 }
799 } 866 }
867
800 void CFDE_XMLElement::GetTextData(CFX_WideString& wsText) const { 868 void CFDE_XMLElement::GetTextData(CFX_WideString& wsText) const {
801 CFX_WideTextBuf buffer; 869 CFX_WideTextBuf buffer;
802 CFDE_XMLNode* pChild = m_pChild; 870 CFDE_XMLNode* pChild = m_pChild;
803 while (pChild) { 871 while (pChild) {
804 switch (pChild->GetType()) { 872 switch (pChild->GetType()) {
805 case FDE_XMLNODE_Text: 873 case FDE_XMLNODE_Text:
806 buffer << ((CFDE_XMLText*)pChild)->m_wsText; 874 buffer << ((CFDE_XMLText*)pChild)->m_wsText;
807 break; 875 break;
808 case FDE_XMLNODE_CharData: 876 case FDE_XMLNODE_CharData:
809 buffer << ((CFDE_XMLCharData*)pChild)->m_wsCharData; 877 buffer << ((CFDE_XMLCharData*)pChild)->m_wsCharData;
810 break; 878 break;
811 default: 879 default:
812 break; 880 break;
813 } 881 }
814 pChild = pChild->m_pNext; 882 pChild = pChild->m_pNext;
815 } 883 }
816 wsText = buffer.AsStringC(); 884 wsText = buffer.AsStringC();
817 } 885 }
886
818 void CFDE_XMLElement::SetTextData(const CFX_WideString& wsText) { 887 void CFDE_XMLElement::SetTextData(const CFX_WideString& wsText) {
819 if (wsText.GetLength() < 1) { 888 if (wsText.GetLength() < 1) {
820 return; 889 return;
821 } 890 }
822 InsertChildNode(new CFDE_XMLText(wsText)); 891 InsertChildNode(new CFDE_XMLText(wsText));
823 } 892 }
893
824 CFDE_XMLText::CFDE_XMLText(const CFX_WideString& wsText) 894 CFDE_XMLText::CFDE_XMLText(const CFX_WideString& wsText)
825 : CFDE_XMLNode(), m_wsText(wsText) {} 895 : CFDE_XMLNode(), m_wsText(wsText) {}
896
897 void CFDE_XMLText::Release() {
898 delete this;
899 }
900
901 FDE_XMLNODETYPE CFDE_XMLText::GetType() const {
902 return FDE_XMLNODE_Text;
903 }
904
826 CFDE_XMLNode* CFDE_XMLText::Clone(FX_BOOL bRecursive) { 905 CFDE_XMLNode* CFDE_XMLText::Clone(FX_BOOL bRecursive) {
827 CFDE_XMLText* pClone = new CFDE_XMLText(m_wsText); 906 CFDE_XMLText* pClone = new CFDE_XMLText(m_wsText);
828 return pClone; 907 return pClone;
829 } 908 }
830 909
910 CFDE_XMLText::~CFDE_XMLText() {}
911
831 CFDE_XMLCharData::CFDE_XMLCharData(const CFX_WideString& wsCData) 912 CFDE_XMLCharData::CFDE_XMLCharData(const CFX_WideString& wsCData)
832 : CFDE_XMLDeclaration(), m_wsCharData(wsCData) {} 913 : CFDE_XMLDeclaration(), m_wsCharData(wsCData) {}
914
915 void CFDE_XMLCharData::Release() {
916 delete this;
917 }
918
919 FDE_XMLNODETYPE CFDE_XMLCharData::GetType() const {
920 return FDE_XMLNODE_CharData;
921 }
922
833 CFDE_XMLNode* CFDE_XMLCharData::Clone(FX_BOOL bRecursive) { 923 CFDE_XMLNode* CFDE_XMLCharData::Clone(FX_BOOL bRecursive) {
834 CFDE_XMLCharData* pClone = new CFDE_XMLCharData(m_wsCharData); 924 CFDE_XMLCharData* pClone = new CFDE_XMLCharData(m_wsCharData);
835 return pClone; 925 return pClone;
836 } 926 }
837 927
928 CFDE_XMLCharData::~CFDE_XMLCharData() {}
929
838 CFDE_XMLDoc::CFDE_XMLDoc() 930 CFDE_XMLDoc::CFDE_XMLDoc()
839 : m_pRoot(nullptr), m_pSyntaxParser(nullptr), m_pXMLParser(nullptr) { 931 : m_pRoot(nullptr), m_pSyntaxParser(nullptr), m_pXMLParser(nullptr) {
840 Reset(TRUE); 932 Reset(TRUE);
841 CFDE_XMLInstruction* pXML = new CFDE_XMLInstruction(L"xml"); 933 CFDE_XMLInstruction* pXML = new CFDE_XMLInstruction(L"xml");
842 m_pRoot->InsertChildNode(pXML); 934 m_pRoot->InsertChildNode(pXML);
843 } 935 }
936
844 CFDE_XMLDoc::~CFDE_XMLDoc() { 937 CFDE_XMLDoc::~CFDE_XMLDoc() {
845 Reset(FALSE); 938 Reset(FALSE);
846 } 939 }
940
847 void CFDE_XMLDoc::Reset(FX_BOOL bInitRoot) { 941 void CFDE_XMLDoc::Reset(FX_BOOL bInitRoot) {
848 m_iStatus = 0; 942 m_iStatus = 0;
849 m_pStream = nullptr; 943 m_pStream = nullptr;
850 if (bInitRoot) { 944 if (bInitRoot) {
851 if (m_pRoot) 945 if (m_pRoot)
852 m_pRoot->DeleteChildren(); 946 m_pRoot->DeleteChildren();
853 else 947 else
854 m_pRoot = new CFDE_XMLNode; 948 m_pRoot = new CFDE_XMLNode;
855 } else { 949 } else {
856 if (m_pRoot) { 950 if (m_pRoot) {
857 m_pRoot->Release(); 951 m_pRoot->Release();
858 m_pRoot = nullptr; 952 m_pRoot = nullptr;
859 } 953 }
860 } 954 }
861 ReleaseParser(); 955 ReleaseParser();
862 } 956 }
957
863 void CFDE_XMLDoc::ReleaseParser() { 958 void CFDE_XMLDoc::ReleaseParser() {
864 if (m_pXMLParser) { 959 if (m_pXMLParser) {
865 m_pXMLParser->Release(); 960 m_pXMLParser->Release();
866 m_pXMLParser = nullptr; 961 m_pXMLParser = nullptr;
867 } 962 }
868 if (m_pSyntaxParser) { 963 if (m_pSyntaxParser) {
869 m_pSyntaxParser->Release(); 964 m_pSyntaxParser->Release();
870 m_pSyntaxParser = nullptr; 965 m_pSyntaxParser = nullptr;
871 } 966 }
872 } 967 }
873 968
874 FX_BOOL CFDE_XMLDoc::LoadXML(CFDE_XMLParser* pXMLParser) { 969 FX_BOOL CFDE_XMLDoc::LoadXML(CFDE_XMLParser* pXMLParser) {
875 if (!pXMLParser) 970 if (!pXMLParser)
876 return FALSE; 971 return FALSE;
877 972
878 Reset(TRUE); 973 Reset(TRUE);
879 m_pXMLParser = pXMLParser; 974 m_pXMLParser = pXMLParser;
880 return !!m_pXMLParser; 975 return !!m_pXMLParser;
881 } 976 }
977
882 int32_t CFDE_XMLDoc::DoLoad(IFX_Pause* pPause) { 978 int32_t CFDE_XMLDoc::DoLoad(IFX_Pause* pPause) {
883 if (m_iStatus >= 100) 979 if (m_iStatus >= 100)
884 return m_iStatus; 980 return m_iStatus;
885 return m_iStatus = m_pXMLParser->DoParser(pPause); 981 return m_iStatus = m_pXMLParser->DoParser(pPause);
886 } 982 }
983
887 void CFDE_XMLDoc::CloseXML() { 984 void CFDE_XMLDoc::CloseXML() {
888 ReleaseParser(); 985 ReleaseParser();
889 } 986 }
987
890 void CFDE_XMLDoc::SaveXMLNode(IFX_Stream* pXMLStream, CFDE_XMLNode* pINode) { 988 void CFDE_XMLDoc::SaveXMLNode(IFX_Stream* pXMLStream, CFDE_XMLNode* pINode) {
891 CFDE_XMLNode* pNode = (CFDE_XMLNode*)pINode; 989 CFDE_XMLNode* pNode = (CFDE_XMLNode*)pINode;
892 switch (pNode->GetType()) { 990 switch (pNode->GetType()) {
893 case FDE_XMLNODE_Instruction: { 991 case FDE_XMLNODE_Instruction: {
894 CFX_WideString ws; 992 CFX_WideString ws;
895 CFDE_XMLInstruction* pInstruction = (CFDE_XMLInstruction*)pNode; 993 CFDE_XMLInstruction* pInstruction = (CFDE_XMLInstruction*)pNode;
896 if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) { 994 if (pInstruction->m_wsTarget.CompareNoCase(L"xml") == 0) {
897 ws = L"<?xml version=\"1.0\" encoding=\""; 995 ws = L"<?xml version=\"1.0\" encoding=\"";
898 uint16_t wCodePage = pXMLStream->GetCodePage(); 996 uint16_t wCodePage = pXMLStream->GetCodePage();
899 if (wCodePage == FX_CODEPAGE_UTF16LE) { 997 if (wCodePage == FX_CODEPAGE_UTF16LE) {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 ws += ((CFDE_XMLCharData*)pNode)->m_wsCharData; 1087 ws += ((CFDE_XMLCharData*)pNode)->m_wsCharData;
990 ws += L"]]>"; 1088 ws += L"]]>";
991 pXMLStream->WriteString(ws.c_str(), ws.GetLength()); 1089 pXMLStream->WriteString(ws.c_str(), ws.GetLength());
992 } break; 1090 } break;
993 case FDE_XMLNODE_Unknown: 1091 case FDE_XMLNODE_Unknown:
994 break; 1092 break;
995 default: 1093 default:
996 break; 1094 break;
997 } 1095 }
998 } 1096 }
1097
999 void CFDE_XMLDoc::SaveXML(IFX_Stream* pXMLStream, FX_BOOL bSaveBOM) { 1098 void CFDE_XMLDoc::SaveXML(IFX_Stream* pXMLStream, FX_BOOL bSaveBOM) {
1000 if (!pXMLStream || pXMLStream == m_pStream) { 1099 if (!pXMLStream || pXMLStream == m_pStream) {
1001 m_pStream->Seek(FX_STREAMSEEK_Begin, 0); 1100 m_pStream->Seek(FX_STREAMSEEK_Begin, 0);
1002 pXMLStream = m_pStream; 1101 pXMLStream = m_pStream;
1003 } 1102 }
1004 ASSERT((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Text) != 0); 1103 ASSERT((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Text) != 0);
1005 ASSERT((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Write) != 0); 1104 ASSERT((pXMLStream->GetAccessModes() & FX_STREAMACCESS_Write) != 0);
1006 uint16_t wCodePage = pXMLStream->GetCodePage(); 1105 uint16_t wCodePage = pXMLStream->GetCodePage();
1007 if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE && 1106 if (wCodePage != FX_CODEPAGE_UTF16LE && wCodePage != FX_CODEPAGE_UTF16BE &&
1008 wCodePage != FX_CODEPAGE_UTF8) { 1107 wCodePage != FX_CODEPAGE_UTF8) {
(...skipping 12 matching lines...) Expand all
1021 int32_t iPos = pXMLStream->GetPosition(); 1120 int32_t iPos = pXMLStream->GetPosition();
1022 pXMLStream->SetLength(iPos); 1121 pXMLStream->SetLength(iPos);
1023 } 1122 }
1024 } 1123 }
1025 1124
1026 CFDE_BlockBuffer::CFDE_BlockBuffer(int32_t iAllocStep) 1125 CFDE_BlockBuffer::CFDE_BlockBuffer(int32_t iAllocStep)
1027 : m_iDataLength(0), 1126 : m_iDataLength(0),
1028 m_iBufferSize(0), 1127 m_iBufferSize(0),
1029 m_iAllocStep(iAllocStep), 1128 m_iAllocStep(iAllocStep),
1030 m_iStartPosition(0) {} 1129 m_iStartPosition(0) {}
1130
1031 CFDE_BlockBuffer::~CFDE_BlockBuffer() { 1131 CFDE_BlockBuffer::~CFDE_BlockBuffer() {
1032 ClearBuffer(); 1132 ClearBuffer();
1033 } 1133 }
1134
1034 FX_WCHAR* CFDE_BlockBuffer::GetAvailableBlock(int32_t& iIndexInBlock) { 1135 FX_WCHAR* CFDE_BlockBuffer::GetAvailableBlock(int32_t& iIndexInBlock) {
1035 iIndexInBlock = 0; 1136 iIndexInBlock = 0;
1036 if (!m_BlockArray.GetSize()) { 1137 if (!m_BlockArray.GetSize()) {
1037 return nullptr; 1138 return nullptr;
1038 } 1139 }
1039 int32_t iRealIndex = m_iStartPosition + m_iDataLength; 1140 int32_t iRealIndex = m_iStartPosition + m_iDataLength;
1040 if (iRealIndex == m_iBufferSize) { 1141 if (iRealIndex == m_iBufferSize) {
1041 FX_WCHAR* pBlock = FX_Alloc(FX_WCHAR, m_iAllocStep); 1142 FX_WCHAR* pBlock = FX_Alloc(FX_WCHAR, m_iAllocStep);
1042 m_BlockArray.Add(pBlock); 1143 m_BlockArray.Add(pBlock);
1043 m_iBufferSize += m_iAllocStep; 1144 m_iBufferSize += m_iAllocStep;
1044 return pBlock; 1145 return pBlock;
1045 } 1146 }
1046 iIndexInBlock = iRealIndex % m_iAllocStep; 1147 iIndexInBlock = iRealIndex % m_iAllocStep;
1047 return m_BlockArray[iRealIndex / m_iAllocStep]; 1148 return m_BlockArray[iRealIndex / m_iAllocStep];
1048 } 1149 }
1150
1049 FX_BOOL CFDE_BlockBuffer::InitBuffer(int32_t iBufferSize) { 1151 FX_BOOL CFDE_BlockBuffer::InitBuffer(int32_t iBufferSize) {
1050 ClearBuffer(); 1152 ClearBuffer();
1051 int32_t iNumOfBlock = (iBufferSize - 1) / m_iAllocStep + 1; 1153 int32_t iNumOfBlock = (iBufferSize - 1) / m_iAllocStep + 1;
1052 for (int32_t i = 0; i < iNumOfBlock; i++) { 1154 for (int32_t i = 0; i < iNumOfBlock; i++) {
1053 m_BlockArray.Add(FX_Alloc(FX_WCHAR, m_iAllocStep)); 1155 m_BlockArray.Add(FX_Alloc(FX_WCHAR, m_iAllocStep));
1054 } 1156 }
1055 m_iBufferSize = iNumOfBlock * m_iAllocStep; 1157 m_iBufferSize = iNumOfBlock * m_iAllocStep;
1056 return TRUE; 1158 return TRUE;
1057 } 1159 }
1160
1058 void CFDE_BlockBuffer::SetTextChar(int32_t iIndex, FX_WCHAR ch) { 1161 void CFDE_BlockBuffer::SetTextChar(int32_t iIndex, FX_WCHAR ch) {
1059 if (iIndex < 0) { 1162 if (iIndex < 0) {
1060 return; 1163 return;
1061 } 1164 }
1062 int32_t iRealIndex = m_iStartPosition + iIndex; 1165 int32_t iRealIndex = m_iStartPosition + iIndex;
1063 int32_t iBlockIndex = iRealIndex / m_iAllocStep; 1166 int32_t iBlockIndex = iRealIndex / m_iAllocStep;
1064 int32_t iInnerIndex = iRealIndex % m_iAllocStep; 1167 int32_t iInnerIndex = iRealIndex % m_iAllocStep;
1065 int32_t iBlockSize = m_BlockArray.GetSize(); 1168 int32_t iBlockSize = m_BlockArray.GetSize();
1066 if (iBlockIndex >= iBlockSize) { 1169 if (iBlockIndex >= iBlockSize) {
1067 int32_t iNewBlocks = iBlockIndex - iBlockSize + 1; 1170 int32_t iNewBlocks = iBlockIndex - iBlockSize + 1;
1068 do { 1171 do {
1069 FX_WCHAR* pBlock = FX_Alloc(FX_WCHAR, m_iAllocStep); 1172 FX_WCHAR* pBlock = FX_Alloc(FX_WCHAR, m_iAllocStep);
1070 m_BlockArray.Add(pBlock); 1173 m_BlockArray.Add(pBlock);
1071 m_iBufferSize += m_iAllocStep; 1174 m_iBufferSize += m_iAllocStep;
1072 } while (--iNewBlocks); 1175 } while (--iNewBlocks);
1073 } 1176 }
1074 FX_WCHAR* pTextData = m_BlockArray[iBlockIndex]; 1177 FX_WCHAR* pTextData = m_BlockArray[iBlockIndex];
1075 *(pTextData + iInnerIndex) = ch; 1178 *(pTextData + iInnerIndex) = ch;
1076 if (m_iDataLength <= iIndex) { 1179 if (m_iDataLength <= iIndex) {
1077 m_iDataLength = iIndex + 1; 1180 m_iDataLength = iIndex + 1;
1078 } 1181 }
1079 } 1182 }
1183
1080 int32_t CFDE_BlockBuffer::DeleteTextChars(int32_t iCount, FX_BOOL bDirection) { 1184 int32_t CFDE_BlockBuffer::DeleteTextChars(int32_t iCount, FX_BOOL bDirection) {
1081 if (iCount <= 0) { 1185 if (iCount <= 0) {
1082 return m_iDataLength; 1186 return m_iDataLength;
1083 } 1187 }
1084 if (iCount >= m_iDataLength) { 1188 if (iCount >= m_iDataLength) {
1085 Reset(FALSE); 1189 Reset(FALSE);
1086 return 0; 1190 return 0;
1087 } 1191 }
1088 if (bDirection) { 1192 if (bDirection) {
1089 m_iStartPosition += iCount; 1193 m_iStartPosition += iCount;
1090 m_iDataLength -= iCount; 1194 m_iDataLength -= iCount;
1091 } else { 1195 } else {
1092 m_iDataLength -= iCount; 1196 m_iDataLength -= iCount;
1093 } 1197 }
1094 return m_iDataLength; 1198 return m_iDataLength;
1095 } 1199 }
1200
1096 void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData, 1201 void CFDE_BlockBuffer::GetTextData(CFX_WideString& wsTextData,
1097 int32_t iStart, 1202 int32_t iStart,
1098 int32_t iLength) const { 1203 int32_t iLength) const {
1099 wsTextData.clear(); 1204 wsTextData.clear();
1100 int32_t iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition; 1205 int32_t iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition;
1101 if (iStart < 0 || iStart > iMaybeDataLength) { 1206 if (iStart < 0 || iStart > iMaybeDataLength) {
1102 return; 1207 return;
1103 } 1208 }
1104 if (iLength == -1 || iLength > iMaybeDataLength) { 1209 if (iLength == -1 || iLength > iMaybeDataLength) {
1105 iLength = iMaybeDataLength; 1210 iLength = iMaybeDataLength;
(...skipping 22 matching lines...) Expand all
1128 if (i == iEndBlockIndex) { 1233 if (i == iEndBlockIndex) {
1129 iCopyLength -= ((m_iAllocStep - 1) - iEndInnerIndex); 1234 iCopyLength -= ((m_iAllocStep - 1) - iEndInnerIndex);
1130 } 1235 }
1131 FX_WCHAR* pBlockBuf = m_BlockArray[i]; 1236 FX_WCHAR* pBlockBuf = m_BlockArray[i];
1132 FXSYS_memcpy(pBuf + iPointer, pBlockBuf + iBufferPointer, 1237 FXSYS_memcpy(pBuf + iPointer, pBlockBuf + iBufferPointer,
1133 iCopyLength * sizeof(FX_WCHAR)); 1238 iCopyLength * sizeof(FX_WCHAR));
1134 iPointer += iCopyLength; 1239 iPointer += iCopyLength;
1135 } 1240 }
1136 wsTextData.ReleaseBuffer(iLength); 1241 wsTextData.ReleaseBuffer(iLength);
1137 } 1242 }
1243
1138 void CFDE_BlockBuffer::TextDataIndex2BufIndex(const int32_t iIndex, 1244 void CFDE_BlockBuffer::TextDataIndex2BufIndex(const int32_t iIndex,
1139 int32_t& iBlockIndex, 1245 int32_t& iBlockIndex,
1140 int32_t& iInnerIndex) const { 1246 int32_t& iInnerIndex) const {
1141 ASSERT(iIndex >= 0); 1247 ASSERT(iIndex >= 0);
1142 int32_t iRealIndex = m_iStartPosition + iIndex; 1248 int32_t iRealIndex = m_iStartPosition + iIndex;
1143 iBlockIndex = iRealIndex / m_iAllocStep; 1249 iBlockIndex = iRealIndex / m_iAllocStep;
1144 iInnerIndex = iRealIndex % m_iAllocStep; 1250 iInnerIndex = iRealIndex % m_iAllocStep;
1145 } 1251 }
1252
1146 void CFDE_BlockBuffer::ClearBuffer() { 1253 void CFDE_BlockBuffer::ClearBuffer() {
1147 m_iBufferSize = 0; 1254 m_iBufferSize = 0;
1148 int32_t iSize = m_BlockArray.GetSize(); 1255 int32_t iSize = m_BlockArray.GetSize();
1149 for (int32_t i = 0; i < iSize; i++) { 1256 for (int32_t i = 0; i < iSize; i++) {
1150 FX_Free(m_BlockArray[i]); 1257 FX_Free(m_BlockArray[i]);
1151 } 1258 }
1152 m_BlockArray.RemoveAll(); 1259 m_BlockArray.RemoveAll();
1153 } 1260 }
1154 1261
1155 CFDE_XMLSyntaxParser::CFDE_XMLSyntaxParser() 1262 CFDE_XMLSyntaxParser::CFDE_XMLSyntaxParser()
(...skipping 16 matching lines...) Expand all
1172 m_iIndexInBlock(0), 1279 m_iIndexInBlock(0),
1173 m_iTextDataLength(0), 1280 m_iTextDataLength(0),
1174 m_syntaxParserResult(FDE_XmlSyntaxResult::None), 1281 m_syntaxParserResult(FDE_XmlSyntaxResult::None),
1175 m_syntaxParserState(FDE_XmlSyntaxState::Text), 1282 m_syntaxParserState(FDE_XmlSyntaxState::Text),
1176 m_wQuotationMark(0), 1283 m_wQuotationMark(0),
1177 m_iEntityStart(-1), 1284 m_iEntityStart(-1),
1178 m_SkipStack(16) { 1285 m_SkipStack(16) {
1179 m_CurNode.iNodeNum = -1; 1286 m_CurNode.iNodeNum = -1;
1180 m_CurNode.eNodeType = FDE_XMLNODE_Unknown; 1287 m_CurNode.eNodeType = FDE_XMLNODE_Unknown;
1181 } 1288 }
1289
1182 void CFDE_XMLSyntaxParser::Init(IFX_Stream* pStream, 1290 void CFDE_XMLSyntaxParser::Init(IFX_Stream* pStream,
1183 int32_t iXMLPlaneSize, 1291 int32_t iXMLPlaneSize,
1184 int32_t iTextDataSize) { 1292 int32_t iTextDataSize) {
1185 ASSERT(!m_pStream && !m_pBuffer); 1293 ASSERT(!m_pStream && !m_pBuffer);
1186 ASSERT(pStream && iXMLPlaneSize > 0); 1294 ASSERT(pStream && iXMLPlaneSize > 0);
1187 int32_t iStreamLength = pStream->GetLength(); 1295 int32_t iStreamLength = pStream->GetLength();
1188 ASSERT(iStreamLength > 0); 1296 ASSERT(iStreamLength > 0);
1189 m_pStream = pStream; 1297 m_pStream = pStream;
1190 m_iXMLPlaneSize = std::min(iXMLPlaneSize, iStreamLength); 1298 m_iXMLPlaneSize = std::min(iXMLPlaneSize, iStreamLength);
1191 uint8_t bom[4]; 1299 uint8_t bom[4];
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 nbytes = 4; 1821 nbytes = 4;
1714 } else if ((uint32_t)unicode < 0x4000000) { 1822 } else if ((uint32_t)unicode < 0x4000000) {
1715 nbytes = 5; 1823 nbytes = 5;
1716 } else { 1824 } else {
1717 nbytes = 6; 1825 nbytes = 6;
1718 } 1826 }
1719 iDstNum += nbytes; 1827 iDstNum += nbytes;
1720 } 1828 }
1721 return iDstNum; 1829 return iDstNum;
1722 } 1830 }
1831
1723 FX_FILESIZE CFDE_XMLSyntaxParser::GetCurrentBinaryPos() const { 1832 FX_FILESIZE CFDE_XMLSyntaxParser::GetCurrentBinaryPos() const {
1724 if (!m_pStream) 1833 if (!m_pStream)
1725 return 0; 1834 return 0;
1726 1835
1727 int32_t nSrcLen = m_pStart - m_pBuffer; 1836 int32_t nSrcLen = m_pStart - m_pBuffer;
1728 int32_t nDstLen = FX_GetUTF8EncodeLength(m_pBuffer, nSrcLen); 1837 int32_t nDstLen = FX_GetUTF8EncodeLength(m_pBuffer, nSrcLen);
1729 return m_iParsedBytes + nDstLen; 1838 return m_iParsedBytes + nDstLen;
1730 } 1839 }
1731 1840
1732 void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) { 1841 void CFDE_XMLSyntaxParser::ParseTextChar(FX_WCHAR ch) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1795 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); 1904 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE);
1796 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); 1905 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock);
1797 m_iEntityStart = -1; 1906 m_iEntityStart = -1;
1798 } else { 1907 } else {
1799 if (m_iEntityStart < 0 && ch == L'&') { 1908 if (m_iEntityStart < 0 && ch == L'&') {
1800 m_iEntityStart = m_iDataLength - 1; 1909 m_iEntityStart = m_iDataLength - 1;
1801 } 1910 }
1802 } 1911 }
1803 m_pStart++; 1912 m_pStart++;
1804 } 1913 }
OLDNEW
« no previous file with comments | « xfa/fde/xml/fde_xml_imp.h ('k') | xfa/fgas/crt/fgas_stream.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698