| 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 "../../include/fxcrt/fx_xml.h" | 7 #include "../../include/fxcrt/fx_xml.h" |
| 8 #include "xml_int.h" | 8 #include "xml_int.h" |
| 9 CXML_Parser::~CXML_Parser() | 9 CXML_Parser::~CXML_Parser() |
| 10 { | 10 { |
| 11 if (m_bOwnedStream && m_pDataAcc) { | 11 if (m_bOwnedStream) { |
| 12 m_pDataAcc->Release(); | 12 m_pDataAcc->Release(); |
| 13 } | 13 } |
| 14 } | 14 } |
| 15 FX_BOOL CXML_Parser::Init(FX_LPBYTE pBuffer, size_t size) | 15 FX_BOOL CXML_Parser::Init(FX_LPBYTE pBuffer, size_t size) |
| 16 { | 16 { |
| 17 if (m_pAllocator) { | 17 m_pDataAcc = FX_NEW CXML_DataBufAcc(pBuffer, size); |
| 18 m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataBufAcc(pBuffer, siz
e, m_pAllocator); | |
| 19 } else { | |
| 20 m_pDataAcc = FX_NEW CXML_DataBufAcc(pBuffer, size, NULL); | |
| 21 } | |
| 22 if (!m_pDataAcc) { | 18 if (!m_pDataAcc) { |
| 23 return FALSE; | 19 return FALSE; |
| 24 } | 20 } |
| 25 return Init(TRUE); | 21 return Init(TRUE); |
| 26 } | 22 } |
| 27 FX_BOOL CXML_Parser::Init(IFX_FileRead *pFileRead) | 23 FX_BOOL CXML_Parser::Init(IFX_FileRead *pFileRead) |
| 28 { | 24 { |
| 29 if (m_pAllocator) { | 25 m_pDataAcc = FX_NEW CXML_DataStmAcc(pFileRead); |
| 30 m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataStmAcc(pFileRead, m
_pAllocator); | |
| 31 } else { | |
| 32 m_pDataAcc = FX_NEW CXML_DataStmAcc(pFileRead, NULL); | |
| 33 } | |
| 34 if (!m_pDataAcc) { | 26 if (!m_pDataAcc) { |
| 35 return FALSE; | 27 return FALSE; |
| 36 } | 28 } |
| 37 return Init(TRUE); | 29 return Init(TRUE); |
| 38 } | 30 } |
| 39 FX_BOOL CXML_Parser::Init(IFX_BufferRead *pBuffer) | 31 FX_BOOL CXML_Parser::Init(IFX_BufferRead *pBuffer) |
| 40 { | 32 { |
| 41 if (!pBuffer) { | 33 if (!pBuffer) { |
| 42 return FALSE; | 34 return FALSE; |
| 43 } | 35 } |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 do { | 121 do { |
| 130 while (m_dwIndex < m_dwBufferSize && g_FXCRT_XML_IsWhiteSpace(m_pBuffer[
m_dwIndex])) { | 122 while (m_dwIndex < m_dwBufferSize && g_FXCRT_XML_IsWhiteSpace(m_pBuffer[
m_dwIndex])) { |
| 131 m_dwIndex ++; | 123 m_dwIndex ++; |
| 132 } | 124 } |
| 133 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 125 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 134 if (m_dwIndex < m_dwBufferSize || IsEOF()) { | 126 if (m_dwIndex < m_dwBufferSize || IsEOF()) { |
| 135 break; | 127 break; |
| 136 } | 128 } |
| 137 } while (ReadNextBlock()); | 129 } while (ReadNextBlock()); |
| 138 } | 130 } |
| 139 void CXML_Parser::GetName(CFX_ByteStringL &space, CFX_ByteStringL &name) | 131 void CXML_Parser::GetName(CFX_ByteString &space, CFX_ByteString &name) |
| 140 { | 132 { |
| 141 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 133 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 142 if (IsEOF()) { | 134 if (IsEOF()) { |
| 143 return; | 135 return; |
| 144 } | 136 } |
| 145 CFX_ByteTextBuf buf(m_pAllocator); | 137 CFX_ByteTextBuf buf; |
| 146 FX_BYTE ch; | 138 FX_BYTE ch; |
| 147 do { | 139 do { |
| 148 while (m_dwIndex < m_dwBufferSize) { | 140 while (m_dwIndex < m_dwBufferSize) { |
| 149 ch = m_pBuffer[m_dwIndex]; | 141 ch = m_pBuffer[m_dwIndex]; |
| 150 if (ch == ':') { | 142 if (ch == ':') { |
| 151 buf.GetByteStringL(space); | 143 space = buf.GetByteString(); |
| 152 buf.Clear(); | 144 buf.Clear(); |
| 153 } else if (g_FXCRT_XML_IsNameChar(ch)) { | 145 } else if (g_FXCRT_XML_IsNameChar(ch)) { |
| 154 buf.AppendChar(ch); | 146 buf.AppendChar(ch); |
| 155 } else { | 147 } else { |
| 156 break; | 148 break; |
| 157 } | 149 } |
| 158 m_dwIndex ++; | 150 m_dwIndex ++; |
| 159 } | 151 } |
| 160 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 152 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 161 if (m_dwIndex < m_dwBufferSize || IsEOF()) { | 153 if (m_dwIndex < m_dwBufferSize || IsEOF()) { |
| 162 break; | 154 break; |
| 163 } | 155 } |
| 164 } while (ReadNextBlock()); | 156 } while (ReadNextBlock()); |
| 165 buf.GetByteStringL(name); | 157 name = buf.GetByteString(); |
| 166 } | 158 } |
| 167 void CXML_Parser::SkipLiterals(FX_BSTR str) | 159 void CXML_Parser::SkipLiterals(FX_BSTR str) |
| 168 { | 160 { |
| 169 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 161 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 170 if (IsEOF()) { | 162 if (IsEOF()) { |
| 171 return; | 163 return; |
| 172 } | 164 } |
| 173 FX_INT32 i = 0, iLen = str.GetLength(); | 165 FX_INT32 i = 0, iLen = str.GetLength(); |
| 174 do { | 166 do { |
| 175 while (m_dwIndex < m_dwBufferSize) { | 167 while (m_dwIndex < m_dwBufferSize) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 197 m_dwIndex = m_dwBufferSize; | 189 m_dwIndex = m_dwBufferSize; |
| 198 } | 190 } |
| 199 FX_DWORD CXML_Parser::GetCharRef() | 191 FX_DWORD CXML_Parser::GetCharRef() |
| 200 { | 192 { |
| 201 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 193 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 202 if (IsEOF()) { | 194 if (IsEOF()) { |
| 203 return 0; | 195 return 0; |
| 204 } | 196 } |
| 205 FX_BYTE ch; | 197 FX_BYTE ch; |
| 206 FX_INT32 iState = 0; | 198 FX_INT32 iState = 0; |
| 207 CFX_ByteTextBuf buf(m_pAllocator); | 199 CFX_ByteTextBuf buf; |
| 208 FX_DWORD code = 0; | 200 FX_DWORD code = 0; |
| 209 do { | 201 do { |
| 210 while (m_dwIndex < m_dwBufferSize) { | 202 while (m_dwIndex < m_dwBufferSize) { |
| 211 ch = m_pBuffer[m_dwIndex]; | 203 ch = m_pBuffer[m_dwIndex]; |
| 212 switch (iState) { | 204 switch (iState) { |
| 213 case 0: | 205 case 0: |
| 214 if (ch == '#') { | 206 if (ch == '#') { |
| 215 m_dwIndex ++; | 207 m_dwIndex ++; |
| 216 iState = 2; | 208 iState = 2; |
| 217 break; | 209 break; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 break; | 268 break; |
| 277 } | 269 } |
| 278 } | 270 } |
| 279 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 271 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 280 if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) { | 272 if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) { |
| 281 break; | 273 break; |
| 282 } | 274 } |
| 283 } while (ReadNextBlock()); | 275 } while (ReadNextBlock()); |
| 284 return code; | 276 return code; |
| 285 } | 277 } |
| 286 void CXML_Parser::GetAttrValue(CFX_WideStringL &value) | 278 void CXML_Parser::GetAttrValue(CFX_WideString &value) |
| 287 { | 279 { |
| 288 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 280 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 289 if (IsEOF()) { | 281 if (IsEOF()) { |
| 290 return; | 282 return; |
| 291 } | 283 } |
| 292 CFX_UTF8Decoder decoder(m_pAllocator); | 284 CFX_UTF8Decoder decoder; |
| 293 FX_BYTE mark = 0, ch; | 285 FX_BYTE mark = 0, ch; |
| 294 do { | 286 do { |
| 295 while (m_dwIndex < m_dwBufferSize) { | 287 while (m_dwIndex < m_dwBufferSize) { |
| 296 ch = m_pBuffer[m_dwIndex]; | 288 ch = m_pBuffer[m_dwIndex]; |
| 297 if (mark == 0) { | 289 if (mark == 0) { |
| 298 if (ch != '\'' && ch != '"') { | 290 if (ch != '\'' && ch != '"') { |
| 299 return; | 291 return; |
| 300 } | 292 } |
| 301 mark = ch; | 293 mark = ch; |
| 302 m_dwIndex ++; | 294 m_dwIndex ++; |
| 303 ch = 0; | 295 ch = 0; |
| 304 continue; | 296 continue; |
| 305 } | 297 } |
| 306 m_dwIndex ++; | 298 m_dwIndex ++; |
| 307 if (ch == mark) { | 299 if (ch == mark) { |
| 308 break; | 300 break; |
| 309 } | 301 } |
| 310 if (ch == '&') { | 302 if (ch == '&') { |
| 311 decoder.AppendChar(GetCharRef()); | 303 decoder.AppendChar(GetCharRef()); |
| 312 if (IsEOF()) { | 304 if (IsEOF()) { |
| 313 decoder.GetResult(value); | 305 value = decoder.GetResult(); |
| 314 return; | 306 return; |
| 315 } | 307 } |
| 316 } else { | 308 } else { |
| 317 decoder.Input(ch); | 309 decoder.Input(ch); |
| 318 } | 310 } |
| 319 } | 311 } |
| 320 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 312 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 321 if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) { | 313 if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) { |
| 322 break; | 314 break; |
| 323 } | 315 } |
| 324 } while (ReadNextBlock()); | 316 } while (ReadNextBlock()); |
| 325 decoder.GetResult(value); | 317 value = decoder.GetResult(); |
| 326 } | 318 } |
| 327 void CXML_Parser::GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_B
OOL &bEndTag, FX_BOOL bStartTag) | 319 void CXML_Parser::GetTagName(CFX_ByteString &space, CFX_ByteString &name, FX_BOO
L &bEndTag, FX_BOOL bStartTag) |
| 328 { | 320 { |
| 329 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 321 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 330 if (IsEOF()) { | 322 if (IsEOF()) { |
| 331 return; | 323 return; |
| 332 } | 324 } |
| 333 bEndTag = FALSE; | 325 bEndTag = FALSE; |
| 334 FX_BYTE ch; | 326 FX_BYTE ch; |
| 335 FX_INT32 iState = bStartTag ? 1 : 0; | 327 FX_INT32 iState = bStartTag ? 1 : 0; |
| 336 do { | 328 do { |
| 337 while (m_dwIndex < m_dwBufferSize) { | 329 while (m_dwIndex < m_dwBufferSize) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 break; | 364 break; |
| 373 } | 365 } |
| 374 } while (ReadNextBlock()); | 366 } while (ReadNextBlock()); |
| 375 } | 367 } |
| 376 CXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent, FX_BOOL bStartTag
) | 368 CXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent, FX_BOOL bStartTag
) |
| 377 { | 369 { |
| 378 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 370 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 379 if (IsEOF()) { | 371 if (IsEOF()) { |
| 380 return NULL; | 372 return NULL; |
| 381 } | 373 } |
| 382 CFX_ByteStringL tag_name, tag_space; | 374 CFX_ByteString tag_name, tag_space; |
| 383 FX_BOOL bEndTag; | 375 FX_BOOL bEndTag; |
| 384 GetTagName(tag_space, tag_name, bEndTag, bStartTag); | 376 GetTagName(tag_space, tag_name, bEndTag, bStartTag); |
| 385 if (tag_name.IsEmpty() || bEndTag) { | 377 if (tag_name.IsEmpty() || bEndTag) { |
| 386 tag_space.Empty(m_pAllocator); | |
| 387 return NULL; | 378 return NULL; |
| 388 } | 379 } |
| 389 CXML_Element* pElement; | 380 CXML_Element* pElement; |
| 390 if (m_pAllocator) { | 381 pElement = FX_NEW CXML_Element; |
| 391 pElement = FX_NewAtAllocator(m_pAllocator)CXML_Element(m_pAllocator); | |
| 392 } else { | |
| 393 pElement = FX_NEW CXML_Element; | |
| 394 } | |
| 395 if (pElement) { | 382 if (pElement) { |
| 396 pElement->m_pParent = pParent; | 383 pElement->m_pParent = pParent; |
| 397 pElement->SetTag(tag_space, tag_name); | 384 pElement->SetTag(tag_space, tag_name); |
| 398 } | 385 } |
| 399 tag_space.Empty(m_pAllocator); | |
| 400 tag_name.Empty(m_pAllocator); | |
| 401 if (!pElement) { | 386 if (!pElement) { |
| 402 return NULL; | 387 return NULL; |
| 403 } | 388 } |
| 404 do { | 389 do { |
| 405 CFX_ByteStringL attr_space, attr_name; | 390 CFX_ByteString attr_space, attr_name; |
| 406 while (m_dwIndex < m_dwBufferSize) { | 391 while (m_dwIndex < m_dwBufferSize) { |
| 407 SkipWhiteSpaces(); | 392 SkipWhiteSpaces(); |
| 408 if (IsEOF()) { | 393 if (IsEOF()) { |
| 409 break; | 394 break; |
| 410 } | 395 } |
| 411 if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) { | 396 if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) { |
| 412 break; | 397 break; |
| 413 } | 398 } |
| 414 attr_space.Empty(m_pAllocator); | |
| 415 attr_name.Empty(m_pAllocator); | |
| 416 GetName(attr_space, attr_name); | 399 GetName(attr_space, attr_name); |
| 417 SkipWhiteSpaces(); | 400 SkipWhiteSpaces(); |
| 418 if (IsEOF()) { | 401 if (IsEOF()) { |
| 419 break; | 402 break; |
| 420 } | 403 } |
| 421 if (m_pBuffer[m_dwIndex] != '=') { | 404 if (m_pBuffer[m_dwIndex] != '=') { |
| 422 break; | 405 break; |
| 423 } | 406 } |
| 424 m_dwIndex ++; | 407 m_dwIndex ++; |
| 425 SkipWhiteSpaces(); | 408 SkipWhiteSpaces(); |
| 426 if (IsEOF()) { | 409 if (IsEOF()) { |
| 427 break; | 410 break; |
| 428 } | 411 } |
| 429 CFX_WideStringL attr_value; | 412 CFX_WideString attr_value; |
| 430 GetAttrValue(attr_value); | 413 GetAttrValue(attr_value); |
| 431 pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value, m_pAllo
cator); | 414 pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value); |
| 432 attr_value.Empty(m_pAllocator); | |
| 433 } | 415 } |
| 434 attr_space.Empty(m_pAllocator); | |
| 435 attr_name.Empty(m_pAllocator); | |
| 436 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 416 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 437 if (m_dwIndex < m_dwBufferSize || IsEOF()) { | 417 if (m_dwIndex < m_dwBufferSize || IsEOF()) { |
| 438 break; | 418 break; |
| 439 } | 419 } |
| 440 } while (ReadNextBlock()); | 420 } while (ReadNextBlock()); |
| 441 SkipWhiteSpaces(); | 421 SkipWhiteSpaces(); |
| 442 if (IsEOF()) { | 422 if (IsEOF()) { |
| 443 return pElement; | 423 return pElement; |
| 444 } | 424 } |
| 445 FX_BYTE ch = m_pBuffer[m_dwIndex ++]; | 425 FX_BYTE ch = m_pBuffer[m_dwIndex ++]; |
| 446 if (ch == '/') { | 426 if (ch == '/') { |
| 447 m_dwIndex ++; | 427 m_dwIndex ++; |
| 448 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 428 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 449 return pElement; | 429 return pElement; |
| 450 } | 430 } |
| 451 if (ch != '>') { | 431 if (ch != '>') { |
| 452 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 432 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 453 if (m_pAllocator) { | 433 delete pElement; |
| 454 FX_DeleteAtAllocator(pElement, m_pAllocator, CXML_Element); | |
| 455 } else { | |
| 456 delete pElement; | |
| 457 } | |
| 458 return NULL; | 434 return NULL; |
| 459 } | 435 } |
| 460 SkipWhiteSpaces(); | 436 SkipWhiteSpaces(); |
| 461 if (IsEOF()) { | 437 if (IsEOF()) { |
| 462 return pElement; | 438 return pElement; |
| 463 } | 439 } |
| 464 CFX_UTF8Decoder decoder(m_pAllocator); | 440 CFX_UTF8Decoder decoder; |
| 465 CFX_WideTextBuf content(m_pAllocator); | 441 CFX_WideTextBuf content; |
| 466 FX_BOOL bCDATA = FALSE; | 442 FX_BOOL bCDATA = FALSE; |
| 467 FX_INT32 iState = 0; | 443 FX_INT32 iState = 0; |
| 468 do { | 444 do { |
| 469 while (m_dwIndex < m_dwBufferSize) { | 445 while (m_dwIndex < m_dwBufferSize) { |
| 470 ch = m_pBuffer[m_dwIndex ++]; | 446 ch = m_pBuffer[m_dwIndex ++]; |
| 471 switch (iState) { | 447 switch (iState) { |
| 472 case 0: | 448 case 0: |
| 473 if (ch == '<') { | 449 if (ch == '<') { |
| 474 iState = 1; | 450 iState = 1; |
| 475 } else if (ch == '&') { | 451 } else if (ch == '&') { |
| 476 decoder.ClearStatus(); | 452 decoder.ClearStatus(); |
| 477 decoder.AppendChar(GetCharRef()); | 453 decoder.AppendChar(GetCharRef()); |
| 478 } else { | 454 } else { |
| 479 decoder.Input(ch); | 455 decoder.Input(ch); |
| 480 } | 456 } |
| 481 break; | 457 break; |
| 482 case 1: | 458 case 1: |
| 483 if (ch == '!') { | 459 if (ch == '!') { |
| 484 iState = 2; | 460 iState = 2; |
| 485 } else if (ch == '?') { | 461 } else if (ch == '?') { |
| 486 SkipLiterals(FX_BSTRC("?>")); | 462 SkipLiterals(FX_BSTRC("?>")); |
| 487 SkipWhiteSpaces(); | 463 SkipWhiteSpaces(); |
| 488 iState = 0; | 464 iState = 0; |
| 489 } else if (ch == '/') { | 465 } else if (ch == '/') { |
| 490 CFX_ByteStringL space, name; | 466 CFX_ByteString space, name; |
| 491 GetName(space, name); | 467 GetName(space, name); |
| 492 space.Empty(m_pAllocator); | |
| 493 name.Empty(m_pAllocator); | |
| 494 SkipWhiteSpaces(); | 468 SkipWhiteSpaces(); |
| 495 m_dwIndex ++; | 469 m_dwIndex ++; |
| 496 iState = 10; | 470 iState = 10; |
| 497 } else { | 471 } else { |
| 498 content << decoder.GetResult(); | 472 content << decoder.GetResult(); |
| 499 CFX_WideStringL dataStr; | 473 CFX_WideString dataStr = content.GetWideString(); |
| 500 content.GetWideStringL(dataStr); | |
| 501 if (!bCDATA && !m_bSaveSpaceChars) { | 474 if (!bCDATA && !m_bSaveSpaceChars) { |
| 502 dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n"); | 475 dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n"); |
| 503 } | 476 } |
| 504 InsertContentSegment(bCDATA, dataStr, pElement); | 477 InsertContentSegment(bCDATA, dataStr, pElement); |
| 505 dataStr.Empty(m_pAllocator); | |
| 506 content.Clear(); | 478 content.Clear(); |
| 507 decoder.Clear(); | 479 decoder.Clear(); |
| 508 bCDATA = FALSE; | 480 bCDATA = FALSE; |
| 509 iState = 0; | 481 iState = 0; |
| 510 m_dwIndex --; | 482 m_dwIndex --; |
| 511 CXML_Element* pSubElement = ParseElement(pElement, TRUE)
; | 483 CXML_Element* pSubElement = ParseElement(pElement, TRUE)
; |
| 512 if (pSubElement == NULL) { | 484 if (pSubElement == NULL) { |
| 513 break; | 485 break; |
| 514 } | 486 } |
| 515 pSubElement->m_pParent = pElement; | 487 pSubElement->m_pParent = pElement; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 535 if (iState == 10) { | 507 if (iState == 10) { |
| 536 break; | 508 break; |
| 537 } | 509 } |
| 538 } | 510 } |
| 539 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; | 511 m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex; |
| 540 if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) { | 512 if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) { |
| 541 break; | 513 break; |
| 542 } | 514 } |
| 543 } while (ReadNextBlock()); | 515 } while (ReadNextBlock()); |
| 544 content << decoder.GetResult(); | 516 content << decoder.GetResult(); |
| 545 CFX_WideStringL dataStr; | 517 CFX_WideString dataStr = content.GetWideString(); |
| 546 content.GetWideStringL(dataStr); | |
| 547 if (!m_bSaveSpaceChars) { | 518 if (!m_bSaveSpaceChars) { |
| 548 dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n"); | 519 dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n"); |
| 549 } | 520 } |
| 550 InsertContentSegment(bCDATA, dataStr, pElement); | 521 InsertContentSegment(bCDATA, dataStr, pElement); |
| 551 dataStr.Empty(m_pAllocator); | |
| 552 content.Clear(); | 522 content.Clear(); |
| 553 decoder.Clear(); | 523 decoder.Clear(); |
| 554 bCDATA = FALSE; | 524 bCDATA = FALSE; |
| 555 return pElement; | 525 return pElement; |
| 556 } | 526 } |
| 557 void CXML_Parser::InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Ele
ment* pElement) | 527 void CXML_Parser::InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Ele
ment* pElement) |
| 558 { | 528 { |
| 559 if (content.IsEmpty()) { | 529 if (content.IsEmpty()) { |
| 560 return; | 530 return; |
| 561 } | 531 } |
| 562 CXML_Content* pContent; | 532 CXML_Content* pContent; |
| 563 if (m_pAllocator) { | 533 pContent = FX_NEW CXML_Content; |
| 564 pContent = FX_NewAtAllocator(m_pAllocator)CXML_Content; | |
| 565 } else { | |
| 566 pContent = FX_NEW CXML_Content; | |
| 567 } | |
| 568 if (!pContent) { | 534 if (!pContent) { |
| 569 return; | 535 return; |
| 570 } | 536 } |
| 571 pContent->Set(bCDATA, content, m_pAllocator); | 537 pContent->Set(bCDATA, content); |
| 572 pElement->m_Children.Add((FX_LPVOID)CXML_Element::Content); | 538 pElement->m_Children.Add((FX_LPVOID)CXML_Element::Content); |
| 573 pElement->m_Children.Add(pContent); | 539 pElement->m_Children.Add(pContent); |
| 574 } | 540 } |
| 575 static CXML_Element* XML_ContinueParse(CXML_Parser &parser, FX_BOOL bSaveSpaceCh
ars, FX_FILESIZE* pParsedSize) | 541 static CXML_Element* XML_ContinueParse(CXML_Parser &parser, FX_BOOL bSaveSpaceCh
ars, FX_FILESIZE* pParsedSize) |
| 576 { | 542 { |
| 577 parser.m_bSaveSpaceChars = bSaveSpaceChars; | 543 parser.m_bSaveSpaceChars = bSaveSpaceChars; |
| 578 CXML_Element* pElement = parser.ParseElement(NULL, FALSE); | 544 CXML_Element* pElement = parser.ParseElement(NULL, FALSE); |
| 579 if (pParsedSize) { | 545 if (pParsedSize) { |
| 580 *pParsedSize = parser.m_nOffset; | 546 *pParsedSize = parser.m_nOffset; |
| 581 } | 547 } |
| 582 return pElement; | 548 return pElement; |
| 583 } | 549 } |
| 584 CXML_Element* CXML_Element::Parse(const void* pBuffer, size_t size, FX_BOOL bSav
eSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator) | 550 CXML_Element* CXML_Element::Parse(const void* pBuffer, size_t size, FX_BOOL bSav
eSpaceChars, FX_FILESIZE* pParsedSize) |
| 585 { | 551 { |
| 586 CXML_Parser parser(pAllocator); | 552 CXML_Parser parser; |
| 587 if (!parser.Init((FX_LPBYTE)pBuffer, size)) { | 553 if (!parser.Init((FX_LPBYTE)pBuffer, size)) { |
| 588 return NULL; | 554 return NULL; |
| 589 } | 555 } |
| 590 return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize); | 556 return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize); |
| 591 } | 557 } |
| 592 CXML_Element* CXML_Element::Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars,
FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator) | 558 CXML_Element* CXML_Element::Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars,
FX_FILESIZE* pParsedSize) |
| 593 { | 559 { |
| 594 CXML_Parser parser(pAllocator); | 560 CXML_Parser parser; |
| 595 if (!parser.Init(pFile)) { | 561 if (!parser.Init(pFile)) { |
| 596 return NULL; | 562 return NULL; |
| 597 } | 563 } |
| 598 return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize); | 564 return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize); |
| 599 } | 565 } |
| 600 CXML_Element* CXML_Element::Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceCha
rs, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator) | 566 CXML_Element* CXML_Element::Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceCha
rs, FX_FILESIZE* pParsedSize) |
| 601 { | 567 { |
| 602 CXML_Parser parser(pAllocator); | 568 CXML_Parser parser; |
| 603 if (!parser.Init(pBuffer)) { | 569 if (!parser.Init(pBuffer)) { |
| 604 return NULL; | 570 return NULL; |
| 605 } | 571 } |
| 606 return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize); | 572 return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize); |
| 607 } | 573 } |
| 608 CXML_Element::CXML_Element(IFX_Allocator* pAllocator) | 574 CXML_Element::CXML_Element() |
| 575 : m_QSpaceName() |
| 576 , m_TagName() |
| 577 , m_AttrMap() |
| 578 { |
| 579 } |
| 580 CXML_Element::CXML_Element(FX_BSTR qSpace, FX_BSTR tagName) |
| 581 : m_QSpaceName() |
| 582 , m_TagName() |
| 583 , m_AttrMap() |
| 584 { |
| 585 m_QSpaceName = qSpace; |
| 586 m_TagName = tagName; |
| 587 } |
| 588 CXML_Element::CXML_Element(FX_BSTR qTagName) |
| 609 : m_pParent(NULL) | 589 : m_pParent(NULL) |
| 610 , m_QSpaceName() | 590 , m_QSpaceName() |
| 611 , m_TagName() | 591 , m_TagName() |
| 612 , m_AttrMap() | 592 , m_AttrMap() |
| 613 , m_Children(pAllocator) | |
| 614 { | |
| 615 } | |
| 616 CXML_Element::CXML_Element(FX_BSTR qSpace, FX_BSTR tagName, IFX_Allocator* pAllo
cator) | |
| 617 : m_pParent(NULL) | |
| 618 , m_QSpaceName() | |
| 619 , m_TagName() | |
| 620 , m_AttrMap() | |
| 621 , m_Children(pAllocator) | |
| 622 { | |
| 623 m_QSpaceName.Set(qSpace, pAllocator); | |
| 624 m_TagName.Set(tagName, pAllocator); | |
| 625 } | |
| 626 CXML_Element::CXML_Element(FX_BSTR qTagName, IFX_Allocator* pAllocator) | |
| 627 : m_pParent(NULL) | |
| 628 , m_QSpaceName() | |
| 629 , m_TagName() | |
| 630 , m_AttrMap() | |
| 631 , m_Children(pAllocator) | |
| 632 { | 593 { |
| 633 SetTag(qTagName); | 594 SetTag(qTagName); |
| 634 } | 595 } |
| 635 CXML_Element::~CXML_Element() | 596 CXML_Element::~CXML_Element() |
| 636 { | 597 { |
| 637 Empty(); | 598 Empty(); |
| 638 } | 599 } |
| 639 void CXML_Element::Empty() | 600 void CXML_Element::Empty() |
| 640 { | 601 { |
| 641 IFX_Allocator* pAllocator = m_Children.m_pAllocator; | |
| 642 m_QSpaceName.Empty(pAllocator); | |
| 643 m_TagName.Empty(pAllocator); | |
| 644 m_AttrMap.RemoveAll(pAllocator); | |
| 645 RemoveChildren(); | 602 RemoveChildren(); |
| 646 } | 603 } |
| 647 void CXML_Element::RemoveChildren() | 604 void CXML_Element::RemoveChildren() |
| 648 { | 605 { |
| 649 IFX_Allocator* pAllocator = m_Children.m_pAllocator; | |
| 650 for (int i = 0; i < m_Children.GetSize(); i += 2) { | 606 for (int i = 0; i < m_Children.GetSize(); i += 2) { |
| 651 ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i); | 607 ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i); |
| 652 if (type == Content) { | 608 if (type == Content) { |
| 653 CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1); | 609 CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1); |
| 654 if (pAllocator) { | 610 delete content; |
| 655 FX_DeleteAtAllocator(content, pAllocator, CXML_Content); | |
| 656 } else { | |
| 657 delete content; | |
| 658 } | |
| 659 } else if (type == Element) { | 611 } else if (type == Element) { |
| 660 CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1); | 612 CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1); |
| 661 child->RemoveChildren(); | 613 child->RemoveChildren(); |
| 662 if (pAllocator) { | 614 delete child; |
| 663 FX_DeleteAtAllocator(child, pAllocator, CXML_Element); | |
| 664 } else { | |
| 665 delete child; | |
| 666 } | |
| 667 } | 615 } |
| 668 } | 616 } |
| 669 m_Children.RemoveAll(); | 617 m_Children.RemoveAll(); |
| 670 } | 618 } |
| 671 CFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const | 619 CFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const |
| 672 { | 620 { |
| 673 if (!bQualified || m_QSpaceName.IsEmpty()) { | 621 if (!bQualified || m_QSpaceName.IsEmpty()) { |
| 674 return m_TagName; | 622 return m_TagName; |
| 675 } | 623 } |
| 676 CFX_ByteString bsTag = m_QSpaceName; | 624 CFX_ByteString bsTag = m_QSpaceName; |
| 677 bsTag += ":"; | 625 bsTag += ":"; |
| 678 bsTag += m_TagName; | 626 bsTag += m_TagName; |
| 679 return bsTag; | 627 return bsTag; |
| 680 } | 628 } |
| 681 void CXML_Element::GetTagName(CFX_ByteStringL &tagName, FX_BOOL bQualified) cons
t | |
| 682 { | |
| 683 IFX_Allocator* pAllocator = m_Children.m_pAllocator; | |
| 684 if (!bQualified || m_QSpaceName.IsEmpty()) { | |
| 685 tagName.Set(m_TagName, pAllocator); | |
| 686 return; | |
| 687 } | |
| 688 FX_LPSTR str = tagName.AllocBuffer(m_QSpaceName.GetLength() + m_TagName.GetL
ength() + 2, pAllocator); | |
| 689 if (!str) { | |
| 690 return; | |
| 691 } | |
| 692 FXSYS_memcpy32(str, m_QSpaceName.GetCStr(), m_QSpaceName.GetLength()); | |
| 693 str += m_QSpaceName.GetLength(); | |
| 694 *str = ':'; | |
| 695 str ++; | |
| 696 FXSYS_memcpy32(str, m_TagName.GetCStr(), m_TagName.GetLength()); | |
| 697 str += m_TagName.GetLength(); | |
| 698 *str = '\0'; | |
| 699 } | |
| 700 CFX_ByteString CXML_Element::GetNamespace(FX_BOOL bQualified) const | 629 CFX_ByteString CXML_Element::GetNamespace(FX_BOOL bQualified) const |
| 701 { | 630 { |
| 702 if (bQualified) { | 631 if (bQualified) { |
| 703 return m_QSpaceName; | 632 return m_QSpaceName; |
| 704 } | 633 } |
| 705 return GetNamespaceURI(m_QSpaceName); | 634 return GetNamespaceURI(m_QSpaceName); |
| 706 } | 635 } |
| 707 void CXML_Element::GetNamespace(CFX_ByteStringL &nameSpace, FX_BOOL bQualified)
const | |
| 708 { | |
| 709 IFX_Allocator* pAllocator = m_Children.m_pAllocator; | |
| 710 if (bQualified) { | |
| 711 nameSpace.Set(m_QSpaceName, pAllocator); | |
| 712 return; | |
| 713 } | |
| 714 GetNamespaceURI(m_QSpaceName, nameSpace); | |
| 715 } | |
| 716 CFX_ByteString CXML_Element::GetNamespaceURI(FX_BSTR qName) const | 636 CFX_ByteString CXML_Element::GetNamespaceURI(FX_BSTR qName) const |
| 717 { | 637 { |
| 718 const CFX_WideStringL* pwsSpace; | 638 const CFX_WideString* pwsSpace; |
| 719 const CXML_Element *pElement = this; | 639 const CXML_Element *pElement = this; |
| 720 do { | 640 do { |
| 721 if (qName.IsEmpty()) { | 641 if (qName.IsEmpty()) { |
| 722 pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"
)); | 642 pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"
)); |
| 723 } else { | 643 } else { |
| 724 pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName); | 644 pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName); |
| 725 } | 645 } |
| 726 if (pwsSpace) { | 646 if (pwsSpace) { |
| 727 break; | 647 break; |
| 728 } | 648 } |
| 729 pElement = pElement->GetParent(); | 649 pElement = pElement->GetParent(); |
| 730 } while(pElement); | 650 } while(pElement); |
| 731 return pwsSpace ? FX_UTF8Encode(*pwsSpace) : CFX_ByteString(); | 651 return pwsSpace ? FX_UTF8Encode(*pwsSpace) : CFX_ByteString(); |
| 732 } | 652 } |
| 733 void CXML_Element::GetNamespaceURI(FX_BSTR qName, CFX_ByteStringL &uri) const | |
| 734 { | |
| 735 IFX_Allocator* pAllocator = m_Children.m_pAllocator; | |
| 736 const CFX_WideStringL* pwsSpace; | |
| 737 const CXML_Element *pElement = this; | |
| 738 do { | |
| 739 if (qName.IsEmpty()) { | |
| 740 pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"
)); | |
| 741 } else { | |
| 742 pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName); | |
| 743 } | |
| 744 if (pwsSpace) { | |
| 745 break; | |
| 746 } | |
| 747 pElement = pElement->GetParent(); | |
| 748 } while(pElement); | |
| 749 if (pwsSpace) { | |
| 750 FX_UTF8Encode(pwsSpace->GetPtr(), pwsSpace->GetLength(), uri, pAllocator
); | |
| 751 } | |
| 752 } | |
| 753 void CXML_Element::GetAttrByIndex(int index, CFX_ByteString& space, CFX_ByteStri
ng& name, CFX_WideString& value) const | 653 void CXML_Element::GetAttrByIndex(int index, CFX_ByteString& space, CFX_ByteStri
ng& name, CFX_WideString& value) const |
| 754 { | 654 { |
| 755 if (index < 0 || index >= m_AttrMap.GetSize()) { | 655 if (index < 0 || index >= m_AttrMap.GetSize()) { |
| 756 return; | 656 return; |
| 757 } | 657 } |
| 758 CXML_AttrItem& item = m_AttrMap.GetAt(index); | 658 CXML_AttrItem& item = m_AttrMap.GetAt(index); |
| 759 space = item.m_QSpaceName; | 659 space = item.m_QSpaceName; |
| 760 name = item.m_AttrName; | 660 name = item.m_AttrName; |
| 761 value = item.m_Value; | 661 value = item.m_Value; |
| 762 } | 662 } |
| 763 void CXML_Element::GetAttrByIndex(int index, CFX_ByteStringL &space, CFX_ByteStr
ingL &name, CFX_WideStringL &value) const | |
| 764 { | |
| 765 if (index < 0 || index >= m_AttrMap.GetSize()) { | |
| 766 return; | |
| 767 } | |
| 768 IFX_Allocator* pAllocator = m_Children.m_pAllocator; | |
| 769 CXML_AttrItem& item = m_AttrMap.GetAt(index); | |
| 770 space.Set(item.m_QSpaceName, pAllocator); | |
| 771 name.Set(item.m_AttrName, pAllocator); | |
| 772 value.Set(item.m_Value, pAllocator); | |
| 773 } | |
| 774 FX_BOOL CXML_Element::HasAttr(FX_BSTR name) const | 663 FX_BOOL CXML_Element::HasAttr(FX_BSTR name) const |
| 775 { | 664 { |
| 776 CFX_ByteStringC bsSpace, bsName; | 665 CFX_ByteStringC bsSpace, bsName; |
| 777 FX_XML_SplitQualifiedName(name, bsSpace, bsName); | 666 FX_XML_SplitQualifiedName(name, bsSpace, bsName); |
| 778 return m_AttrMap.Lookup(bsSpace, bsName) != NULL; | 667 return m_AttrMap.Lookup(bsSpace, bsName) != NULL; |
| 779 } | 668 } |
| 780 FX_BOOL CXML_Element::GetAttrValue(FX_BSTR name, CFX_WideString& attribute) cons
t | 669 FX_BOOL CXML_Element::GetAttrValue(FX_BSTR name, CFX_WideString& attribute) cons
t |
| 781 { | 670 { |
| 782 CFX_ByteStringC bsSpace, bsName; | 671 CFX_ByteStringC bsSpace, bsName; |
| 783 FX_XML_SplitQualifiedName(name, bsSpace, bsName); | 672 FX_XML_SplitQualifiedName(name, bsSpace, bsName); |
| 784 const CFX_WideStringL* pValue = m_AttrMap.Lookup(bsSpace, bsName); | 673 const CFX_WideString* pValue = m_AttrMap.Lookup(bsSpace, bsName); |
| 785 if (pValue) { | 674 if (pValue) { |
| 786 attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength()); | 675 attribute = CFX_WideString((FX_LPCWSTR)pValue, pValue->GetLength()); |
| 787 return TRUE; | 676 return TRUE; |
| 788 } | 677 } |
| 789 return FALSE; | 678 return FALSE; |
| 790 } | 679 } |
| 791 const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR name) const | |
| 792 { | |
| 793 CFX_ByteStringC bsSpace, bsName; | |
| 794 FX_XML_SplitQualifiedName(name, bsSpace, bsName); | |
| 795 return m_AttrMap.Lookup(bsSpace, bsName); | |
| 796 } | |
| 797 FX_BOOL CXML_Element::GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString&
attribute) const | 680 FX_BOOL CXML_Element::GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString&
attribute) const |
| 798 { | 681 { |
| 799 const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name); | 682 const CFX_WideString* pValue = m_AttrMap.Lookup(space, name); |
| 800 if (pValue) { | 683 if (pValue) { |
| 801 attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength()); | 684 attribute = CFX_WideString((FX_LPCWSTR)pValue, pValue->GetLength()); |
| 802 return TRUE; | 685 return TRUE; |
| 803 } | 686 } |
| 804 return FALSE; | 687 return FALSE; |
| 805 } | 688 } |
| 806 const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR space, FX_BSTR name
) const | |
| 807 { | |
| 808 return m_AttrMap.Lookup(space, name); | |
| 809 } | |
| 810 FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR name, int& attribute) const | 689 FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR name, int& attribute) const |
| 811 { | 690 { |
| 812 CFX_ByteStringC bsSpace, bsName; | 691 CFX_ByteStringC bsSpace, bsName; |
| 813 FX_XML_SplitQualifiedName(name, bsSpace, bsName); | 692 FX_XML_SplitQualifiedName(name, bsSpace, bsName); |
| 814 const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(bsSpace, bsName); | 693 const CFX_WideString* pwsValue = m_AttrMap.Lookup(bsSpace, bsName); |
| 815 if (pwsValue) { | 694 if (pwsValue) { |
| 816 attribute = pwsValue->GetInteger(); | 695 attribute = pwsValue->GetInteger(); |
| 817 return TRUE; | 696 return TRUE; |
| 818 } | 697 } |
| 819 return FALSE; | 698 return FALSE; |
| 820 } | 699 } |
| 821 FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute
) const | 700 FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute
) const |
| 822 { | 701 { |
| 823 const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(space, name); | 702 const CFX_WideString* pwsValue = m_AttrMap.Lookup(space, name); |
| 824 if (pwsValue) { | 703 if (pwsValue) { |
| 825 attribute = pwsValue->GetInteger(); | 704 attribute = pwsValue->GetInteger(); |
| 826 return TRUE; | 705 return TRUE; |
| 827 } | 706 } |
| 828 return FALSE; | 707 return FALSE; |
| 829 } | 708 } |
| 830 FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const | 709 FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const |
| 831 { | 710 { |
| 832 CFX_ByteStringC bsSpace, bsName; | 711 CFX_ByteStringC bsSpace, bsName; |
| 833 FX_XML_SplitQualifiedName(name, bsSpace, bsName); | 712 FX_XML_SplitQualifiedName(name, bsSpace, bsName); |
| 834 return GetAttrFloat(bsSpace, bsName, attribute); | 713 return GetAttrFloat(bsSpace, bsName, attribute); |
| 835 } | 714 } |
| 836 FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attrib
ute) const | 715 FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attrib
ute) const |
| 837 { | 716 { |
| 838 CFX_WideString value; | 717 const CFX_WideString* pValue = m_AttrMap.Lookup(space, name); |
| 839 const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name); | |
| 840 if (pValue) { | 718 if (pValue) { |
| 841 attribute = pValue->GetFloat(); | 719 attribute = pValue->GetFloat(); |
| 842 return TRUE; | 720 return TRUE; |
| 843 } | 721 } |
| 844 return FALSE; | 722 return FALSE; |
| 845 } | 723 } |
| 846 FX_DWORD CXML_Element::CountChildren() const | 724 FX_DWORD CXML_Element::CountChildren() const |
| 847 { | 725 { |
| 848 return m_Children.GetSize() / 2; | 726 return m_Children.GetSize() / 2; |
| 849 } | 727 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 861 if (index >= (FX_DWORD)m_Children.GetSize() || | 739 if (index >= (FX_DWORD)m_Children.GetSize() || |
| 862 (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) { | 740 (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) { |
| 863 return CFX_WideString(); | 741 return CFX_WideString(); |
| 864 } | 742 } |
| 865 CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1); | 743 CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1); |
| 866 if (pContent) { | 744 if (pContent) { |
| 867 return pContent->m_Content; | 745 return pContent->m_Content; |
| 868 } | 746 } |
| 869 return CFX_WideString(); | 747 return CFX_WideString(); |
| 870 } | 748 } |
| 871 const CFX_WideStringL* CXML_Element::GetContentPtr(FX_DWORD index) const | |
| 872 { | |
| 873 index <<= 1; | |
| 874 if (index >= (FX_DWORD)m_Children.GetSize() || | |
| 875 (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) { | |
| 876 return NULL; | |
| 877 } | |
| 878 CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1); | |
| 879 if (pContent) { | |
| 880 return &pContent->m_Content; | |
| 881 } | |
| 882 return NULL; | |
| 883 } | |
| 884 CXML_Element* CXML_Element::GetElement(FX_DWORD index) const | 749 CXML_Element* CXML_Element::GetElement(FX_DWORD index) const |
| 885 { | 750 { |
| 886 index <<= 1; | 751 index <<= 1; |
| 887 if (index >= (FX_DWORD)m_Children.GetSize() || | 752 if (index >= (FX_DWORD)m_Children.GetSize() || |
| 888 (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Element) { | 753 (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Element) { |
| 889 return NULL; | 754 return NULL; |
| 890 } | 755 } |
| 891 return (CXML_Element*)m_Children.GetAt(index + 1); | 756 return (CXML_Element*)m_Children.GetAt(index + 1); |
| 892 } | 757 } |
| 893 FX_DWORD CXML_Element::CountElements(FX_BSTR space, FX_BSTR tag) const | 758 FX_DWORD CXML_Element::CountElements(FX_BSTR space, FX_BSTR tag) const |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 928 FX_DWORD CXML_Element::FindElement(CXML_Element *pChild) const | 793 FX_DWORD CXML_Element::FindElement(CXML_Element *pChild) const |
| 929 { | 794 { |
| 930 for (int i = 0; i < m_Children.GetSize(); i += 2) { | 795 for (int i = 0; i < m_Children.GetSize(); i += 2) { |
| 931 if ((ChildType)(FX_UINTPTR)m_Children.GetAt(i) == Element && | 796 if ((ChildType)(FX_UINTPTR)m_Children.GetAt(i) == Element && |
| 932 (CXML_Element*)m_Children.GetAt(i + 1) == pChild) { | 797 (CXML_Element*)m_Children.GetAt(i + 1) == pChild) { |
| 933 return (FX_DWORD)(i >> 1); | 798 return (FX_DWORD)(i >> 1); |
| 934 } | 799 } |
| 935 } | 800 } |
| 936 return (FX_DWORD) - 1; | 801 return (FX_DWORD) - 1; |
| 937 } | 802 } |
| 938 const CFX_WideStringL* CXML_AttrMap::Lookup(FX_BSTR space, FX_BSTR name) const | 803 const CFX_WideString* CXML_AttrMap::Lookup(FX_BSTR space, FX_BSTR name) const |
| 939 { | 804 { |
| 940 if (m_pMap == NULL) { | 805 if (m_pMap == NULL) { |
| 941 return NULL; | 806 return NULL; |
| 942 } | 807 } |
| 943 for (int i = 0; i < m_pMap->GetSize(); i ++) { | 808 for (int i = 0; i < m_pMap->GetSize(); i ++) { |
| 944 CXML_AttrItem& item = GetAt(i); | 809 CXML_AttrItem& item = GetAt(i); |
| 945 if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName =
= name) { | 810 if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName =
= name) { |
| 946 return &item.m_Value; | 811 return &item.m_Value; |
| 947 } | 812 } |
| 948 } | 813 } |
| 949 return NULL; | 814 return NULL; |
| 950 } | 815 } |
| 951 void CXML_AttrMap::SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value, IFX_Allocat
or* pAllocator) | 816 void CXML_AttrMap::SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value) |
| 952 { | 817 { |
| 953 for (int i = 0; i < GetSize(); i ++) { | 818 for (int i = 0; i < GetSize(); i++) { |
| 954 CXML_AttrItem& item = GetAt(i); | 819 CXML_AttrItem& item = GetAt(i); |
| 955 if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName =
= name) { | 820 if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName =
= name) { |
| 956 item.m_Value.Set(value, pAllocator); | 821 item.m_Value = value; |
| 957 return; | 822 return; |
| 958 } | 823 } |
| 959 } | 824 } |
| 960 if (!m_pMap) { | 825 if (!m_pMap) { |
| 961 if (pAllocator) { | 826 m_pMap = FX_NEW CFX_ObjectArray < CXML_AttrItem > ; |
| 962 m_pMap = FX_NewAtAllocator(pAllocator)CFX_ObjectArray<CXML_AttrItem>
(pAllocator); | |
| 963 } else { | |
| 964 m_pMap = FX_NEW CFX_ObjectArray<CXML_AttrItem>; | |
| 965 } | |
| 966 } | 827 } |
| 967 if (!m_pMap) { | 828 if (!m_pMap) { |
| 968 return; | 829 return; |
| 969 } | 830 } |
| 970 CXML_AttrItem* pItem = (CXML_AttrItem*)m_pMap->AddSpace(); | 831 CXML_AttrItem* pItem = (CXML_AttrItem*)m_pMap->AddSpace(); |
| 971 if (!pItem) { | 832 if (!pItem) { |
| 972 return; | 833 return; |
| 973 } | 834 } |
| 974 pItem->m_QSpaceName.Set(space, pAllocator); | 835 pItem->m_QSpaceName = space; |
| 975 pItem->m_AttrName.Set(name, pAllocator); | 836 pItem->m_AttrName = name; |
| 976 pItem->m_Value.Set(value, pAllocator); | 837 pItem->m_Value = value; |
| 977 } | 838 } |
| 978 void CXML_AttrMap::RemoveAt(FX_BSTR space, FX_BSTR name, IFX_Allocator* pAllocat
or) | 839 void CXML_AttrMap::RemoveAt(FX_BSTR space, FX_BSTR name) |
| 979 { | 840 { |
| 980 if (m_pMap == NULL) { | 841 if (m_pMap == NULL) { |
| 981 return; | 842 return; |
| 982 } | 843 } |
| 983 for (int i = 0; i < m_pMap->GetSize(); i ++) { | 844 for (int i = 0; i < m_pMap->GetSize(); i ++) { |
| 984 CXML_AttrItem& item = GetAt(i); | 845 CXML_AttrItem& item = GetAt(i); |
| 985 if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName =
= name) { | 846 if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName =
= name) { |
| 986 item.Empty(pAllocator); | |
| 987 m_pMap->RemoveAt(i); | 847 m_pMap->RemoveAt(i); |
| 988 return; | 848 return; |
| 989 } | 849 } |
| 990 } | 850 } |
| 991 } | 851 } |
| 992 int CXML_AttrMap::GetSize() const | 852 int CXML_AttrMap::GetSize() const |
| 993 { | 853 { |
| 994 return m_pMap == NULL ? 0 : m_pMap->GetSize(); | 854 return m_pMap == NULL ? 0 : m_pMap->GetSize(); |
| 995 } | 855 } |
| 996 CXML_AttrItem& CXML_AttrMap::GetAt(int index) const | 856 CXML_AttrItem& CXML_AttrMap::GetAt(int index) const |
| 997 { | 857 { |
| 998 ASSERT(m_pMap != NULL); | 858 ASSERT(m_pMap != NULL); |
| 999 return (*m_pMap)[index]; | 859 return (*m_pMap)[index]; |
| 1000 } | 860 } |
| 1001 void CXML_AttrMap::RemoveAll(IFX_Allocator* pAllocator) | 861 void CXML_AttrMap::RemoveAll() |
| 1002 { | 862 { |
| 1003 if (!m_pMap) { | 863 if (!m_pMap) { |
| 1004 return; | 864 return; |
| 1005 } | 865 } |
| 1006 for (int i = 0; i < m_pMap->GetSize(); i ++) { | 866 for (int i = 0; i < m_pMap->GetSize(); i ++) { |
| 1007 CXML_AttrItem& item = (*m_pMap)[i]; | 867 CXML_AttrItem& item = (*m_pMap)[i]; |
| 1008 item.Empty(pAllocator); | |
| 1009 } | 868 } |
| 1010 m_pMap->RemoveAll(); | 869 m_pMap->RemoveAll(); |
| 1011 if (pAllocator) { | 870 delete m_pMap; |
| 1012 FX_DeleteAtAllocator(m_pMap, pAllocator, CFX_ObjectArray<CXML_AttrItem>)
; | |
| 1013 } else { | |
| 1014 delete m_pMap; | |
| 1015 } | |
| 1016 m_pMap = NULL; | 871 m_pMap = NULL; |
| 1017 } | 872 } |
| OLD | NEW |