| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fde/xml/fde_xml_imp.h" | 7 #include "xfa/fde/xml/fde_xml_imp.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 1473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1484 m_iBufferChars = 0; | 1484 m_iBufferChars = 0; |
| 1485 } | 1485 } |
| 1486 uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { | 1486 uint32_t CFDE_XMLSyntaxParser::DoSyntaxParse() { |
| 1487 if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || | 1487 if (m_dwStatus == FDE_XMLSYNTAXSTATUS_Error || |
| 1488 m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { | 1488 m_dwStatus == FDE_XMLSYNTAXSTATUS_EOS) { |
| 1489 return m_dwStatus; | 1489 return m_dwStatus; |
| 1490 } | 1490 } |
| 1491 FXSYS_assert(m_pStream && m_pBuffer && m_BlockBuffer.IsInitialized()); | 1491 FXSYS_assert(m_pStream && m_pBuffer && m_BlockBuffer.IsInitialized()); |
| 1492 int32_t iStreamLength = m_pStream->GetLength(); | 1492 int32_t iStreamLength = m_pStream->GetLength(); |
| 1493 int32_t iPos; | 1493 int32_t iPos; |
| 1494 FX_WCHAR ch; | 1494 |
| 1495 uint32_t dwStatus = FDE_XMLSYNTAXSTATUS_None; | 1495 uint32_t dwStatus = FDE_XMLSYNTAXSTATUS_None; |
| 1496 while (TRUE) { | 1496 while (TRUE) { |
| 1497 if (m_pStart >= m_pEnd) { | 1497 if (m_pStart >= m_pEnd) { |
| 1498 if (m_bEOS || m_iCurrentPos >= iStreamLength) { | 1498 if (m_bEOS || m_iCurrentPos >= iStreamLength) { |
| 1499 m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; | 1499 m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; |
| 1500 return m_dwStatus; | 1500 return m_dwStatus; |
| 1501 } | 1501 } |
| 1502 m_iParsedChars += (m_pEnd - m_pBuffer); | 1502 m_iParsedChars += (m_pEnd - m_pBuffer); |
| 1503 m_iParsedBytes = m_iCurrentPos; | 1503 m_iParsedBytes = m_iCurrentPos; |
| 1504 if (m_pStream->GetPosition() != m_iCurrentPos) { | 1504 if (m_pStream->GetPosition() != m_iCurrentPos) { |
| 1505 m_pStream->Seek(FX_STREAMSEEK_Begin, m_iCurrentPos); | 1505 m_pStream->Seek(FX_STREAMSEEK_Begin, m_iCurrentPos); |
| 1506 } | 1506 } |
| 1507 m_iBufferChars = | 1507 m_iBufferChars = |
| 1508 m_pStream->ReadString(m_pBuffer, m_iXMLPlaneSize, m_bEOS); | 1508 m_pStream->ReadString(m_pBuffer, m_iXMLPlaneSize, m_bEOS); |
| 1509 iPos = m_pStream->GetPosition(); | 1509 iPos = m_pStream->GetPosition(); |
| 1510 if (m_iBufferChars < 1) { | 1510 if (m_iBufferChars < 1) { |
| 1511 m_iCurrentPos = iStreamLength; | 1511 m_iCurrentPos = iStreamLength; |
| 1512 m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; | 1512 m_dwStatus = FDE_XMLSYNTAXSTATUS_EOS; |
| 1513 return m_dwStatus; | 1513 return m_dwStatus; |
| 1514 } | 1514 } |
| 1515 m_iCurrentPos = iPos; | 1515 m_iCurrentPos = iPos; |
| 1516 m_pStart = m_pBuffer; | 1516 m_pStart = m_pBuffer; |
| 1517 m_pEnd = m_pBuffer + m_iBufferChars; | 1517 m_pEnd = m_pBuffer + m_iBufferChars; |
| 1518 } | 1518 } |
| 1519 |
| 1519 while (m_pStart < m_pEnd) { | 1520 while (m_pStart < m_pEnd) { |
| 1520 ch = *m_pStart; | 1521 FX_WCHAR ch = *m_pStart; |
| 1521 switch (m_dwMode) { | 1522 switch (m_dwMode) { |
| 1522 case FDE_XMLSYNTAXMODE_Text: | 1523 case FDE_XMLSYNTAXMODE_Text: |
| 1523 if (ch == L'<') { | 1524 if (ch == L'<') { |
| 1524 if (m_iDataLength > 0) { | 1525 if (m_iDataLength > 0) { |
| 1525 m_iTextDataLength = m_iDataLength; | 1526 m_iTextDataLength = m_iDataLength; |
| 1526 m_BlockBuffer.Reset(); | 1527 m_BlockBuffer.Reset(); |
| 1527 m_pCurrentBlock = | 1528 m_pCurrentBlock = |
| 1528 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | 1529 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
| 1529 m_iEntityStart = -1; | 1530 m_iEntityStart = -1; |
| 1530 dwStatus = FDE_XMLSYNTAXSTATUS_Text; | 1531 dwStatus = FDE_XMLSYNTAXSTATUS_Text; |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1776 if (!m_pCurrentBlock) { | 1777 if (!m_pCurrentBlock) { |
| 1777 return FDE_XMLSYNTAXSTATUS_Error; | 1778 return FDE_XMLSYNTAXSTATUS_Error; |
| 1778 } | 1779 } |
| 1779 } | 1780 } |
| 1780 m_pCurrentBlock[m_iIndexInBlock++] = ch; | 1781 m_pCurrentBlock[m_iIndexInBlock++] = ch; |
| 1781 m_iDataLength++; | 1782 m_iDataLength++; |
| 1782 } | 1783 } |
| 1783 m_pStart++; | 1784 m_pStart++; |
| 1784 break; | 1785 break; |
| 1785 case FDE_XMLSYNTAXMODE_SkipCommentOrDecl: | 1786 case FDE_XMLSYNTAXMODE_SkipCommentOrDecl: |
| 1786 if (ch == '-') { | 1787 if (FX_wcsnicmp(m_pStart, L"--", 2) == 0) { |
| 1788 m_pStart += 2; |
| 1787 m_dwMode = FDE_XMLSYNTAXMODE_SkipComment; | 1789 m_dwMode = FDE_XMLSYNTAXMODE_SkipComment; |
| 1790 } else if (FX_wcsnicmp(m_pStart, L"[CDATA[", 7) == 0) { |
| 1791 m_pStart += 7; |
| 1792 m_dwMode = FDE_XMLSYNTAXMODE_SkipCData; |
| 1788 } else { | 1793 } else { |
| 1789 m_dwMode = FDE_XMLSYNTAXMODE_SkipDeclNode; | 1794 m_dwMode = FDE_XMLSYNTAXMODE_SkipDeclNode; |
| 1790 m_SkipChar = L'>'; | 1795 m_SkipChar = L'>'; |
| 1791 m_SkipStack.Push(L'>'); | 1796 m_SkipStack.Push(L'>'); |
| 1792 } | 1797 } |
| 1793 break; | 1798 break; |
| 1799 case FDE_XMLSYNTAXMODE_SkipCData: { |
| 1800 if (FX_wcsnicmp(m_pStart, L"]]>", 3) == 0) { |
| 1801 m_pStart += 3; |
| 1802 dwStatus = FDE_XMLSYNTAXSTATUS_CData; |
| 1803 m_iTextDataLength = m_iDataLength; |
| 1804 m_BlockBuffer.Reset(); |
| 1805 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
| 1806 m_dwMode = FDE_XMLSYNTAXMODE_Text; |
| 1807 } else { |
| 1808 if (m_iIndexInBlock == m_iAllocStep) { |
| 1809 m_pCurrentBlock = |
| 1810 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
| 1811 if (!m_pCurrentBlock) |
| 1812 return FDE_XMLSYNTAXSTATUS_Error; |
| 1813 } |
| 1814 m_pCurrentBlock[m_iIndexInBlock++] = ch; |
| 1815 m_iDataLength++; |
| 1816 m_pStart++; |
| 1817 } |
| 1818 break; |
| 1819 } |
| 1794 case FDE_XMLSYNTAXMODE_SkipDeclNode: | 1820 case FDE_XMLSYNTAXMODE_SkipDeclNode: |
| 1795 if (m_SkipChar == L'\'' || m_SkipChar == L'\"') { | 1821 if (m_SkipChar == L'\'' || m_SkipChar == L'\"') { |
| 1796 m_pStart++; | 1822 m_pStart++; |
| 1797 if (ch != m_SkipChar) { | 1823 if (ch != m_SkipChar) |
| 1798 break; | 1824 break; |
| 1799 } | 1825 |
| 1800 m_SkipStack.Pop(); | 1826 m_SkipStack.Pop(); |
| 1801 uint32_t* pDWord = m_SkipStack.GetTopElement(); | 1827 uint32_t* pDWord = m_SkipStack.GetTopElement(); |
| 1802 if (pDWord == NULL) { | 1828 if (!pDWord) |
| 1803 m_dwMode = FDE_XMLSYNTAXMODE_Text; | 1829 m_dwMode = FDE_XMLSYNTAXMODE_Text; |
| 1804 } else { | 1830 else |
| 1805 m_SkipChar = (FX_WCHAR)*pDWord; | 1831 m_SkipChar = (FX_WCHAR)*pDWord; |
| 1806 } | |
| 1807 } else { | 1832 } else { |
| 1808 switch (ch) { | 1833 switch (ch) { |
| 1809 case L'<': | 1834 case L'<': |
| 1810 m_SkipChar = L'>'; | 1835 m_SkipChar = L'>'; |
| 1811 m_SkipStack.Push(L'>'); | 1836 m_SkipStack.Push(L'>'); |
| 1812 break; | 1837 break; |
| 1813 case L'[': | 1838 case L'[': |
| 1814 m_SkipChar = L']'; | 1839 m_SkipChar = L']'; |
| 1815 m_SkipStack.Push(L']'); | 1840 m_SkipStack.Push(L']'); |
| 1816 break; | 1841 break; |
| 1817 case L'(': | 1842 case L'(': |
| 1818 m_SkipChar = L')'; | 1843 m_SkipChar = L')'; |
| 1819 m_SkipStack.Push(L')'); | 1844 m_SkipStack.Push(L')'); |
| 1820 break; | 1845 break; |
| 1821 case L'\'': | 1846 case L'\'': |
| 1822 m_SkipChar = L'\''; | 1847 m_SkipChar = L'\''; |
| 1823 m_SkipStack.Push(L'\''); | 1848 m_SkipStack.Push(L'\''); |
| 1824 break; | 1849 break; |
| 1825 case L'\"': | 1850 case L'\"': |
| 1826 m_SkipChar = L'\"'; | 1851 m_SkipChar = L'\"'; |
| 1827 m_SkipStack.Push(L'\"'); | 1852 m_SkipStack.Push(L'\"'); |
| 1828 break; | 1853 break; |
| 1829 default: | 1854 default: |
| 1830 if (ch == m_SkipChar) { | 1855 if (ch == m_SkipChar) { |
| 1831 m_SkipStack.Pop(); | 1856 m_SkipStack.Pop(); |
| 1832 uint32_t* pDWord = m_SkipStack.GetTopElement(); | 1857 uint32_t* pDWord = m_SkipStack.GetTopElement(); |
| 1833 if (pDWord == NULL) { | 1858 if (!pDWord) { |
| 1834 if (m_iDataLength >= 9) { | 1859 if (m_iDataLength >= 9) { |
| 1835 CFX_WideString wsHeader; | 1860 CFX_WideString wsHeader; |
| 1836 m_BlockBuffer.GetTextData(wsHeader, 0, 7); | 1861 m_BlockBuffer.GetTextData(wsHeader, 0, 7); |
| 1837 if (wsHeader.Equal(FX_WSTRC(L"[CDATA["))) { | |
| 1838 CFX_WideString wsTailer; | |
| 1839 m_BlockBuffer.GetTextData(wsTailer, m_iDataLength - 2, | |
| 1840 2); | |
| 1841 if (wsTailer.Equal(FX_WSTRC(L"]]"))) { | |
| 1842 m_BlockBuffer.DeleteTextChars(7, TRUE); | |
| 1843 m_BlockBuffer.DeleteTextChars(2, FALSE); | |
| 1844 dwStatus = FDE_XMLSYNTAXSTATUS_CData; | |
| 1845 } | |
| 1846 } | |
| 1847 } | 1862 } |
| 1848 m_iTextDataLength = m_iDataLength; | 1863 m_iTextDataLength = m_iDataLength; |
| 1849 m_BlockBuffer.Reset(); | 1864 m_BlockBuffer.Reset(); |
| 1850 m_pCurrentBlock = | 1865 m_pCurrentBlock = |
| 1851 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | 1866 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
| 1852 m_dwMode = FDE_XMLSYNTAXMODE_Text; | 1867 m_dwMode = FDE_XMLSYNTAXMODE_Text; |
| 1853 } else { | 1868 } else { |
| 1854 m_SkipChar = (FX_WCHAR)*pDWord; | 1869 m_SkipChar = static_cast<FX_WCHAR>(*pDWord); |
| 1855 } | 1870 } |
| 1856 } | 1871 } |
| 1857 break; | 1872 break; |
| 1858 } | 1873 } |
| 1859 if (m_SkipStack.GetSize() > 0) { | 1874 if (m_SkipStack.GetSize() > 0) { |
| 1860 if (m_iIndexInBlock == m_iAllocStep) { | 1875 if (m_iIndexInBlock == m_iAllocStep) { |
| 1861 m_pCurrentBlock = | 1876 m_pCurrentBlock = |
| 1862 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | 1877 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
| 1863 if (!m_pCurrentBlock) { | 1878 if (!m_pCurrentBlock) { |
| 1864 return FDE_XMLSYNTAXSTATUS_Error; | 1879 return FDE_XMLSYNTAXSTATUS_Error; |
| 1865 } | 1880 } |
| 1866 } | 1881 } |
| 1867 m_pCurrentBlock[m_iIndexInBlock++] = ch; | 1882 m_pCurrentBlock[m_iIndexInBlock++] = ch; |
| 1868 m_iDataLength++; | 1883 m_iDataLength++; |
| 1869 } | 1884 } |
| 1870 m_pStart++; | 1885 m_pStart++; |
| 1871 } | 1886 } |
| 1872 break; | 1887 break; |
| 1873 case FDE_XMLSYNTAXMODE_SkipComment: | 1888 case FDE_XMLSYNTAXMODE_SkipComment: |
| 1874 if (ch == L'-') { | 1889 if (FX_wcsnicmp(m_pStart, L"-->", 3) == 0) { |
| 1875 if (m_iIndexInBlock == m_iAllocStep) { | 1890 m_pStart += 2; |
| 1876 m_pCurrentBlock = | 1891 m_dwMode = FDE_XMLSYNTAXMODE_Text; |
| 1877 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | |
| 1878 if (!m_pCurrentBlock) { | |
| 1879 return FDE_XMLSYNTAXSTATUS_Error; | |
| 1880 } | |
| 1881 } | |
| 1882 m_pCurrentBlock[m_iIndexInBlock++] = L'-'; | |
| 1883 m_iDataLength++; | |
| 1884 } else if (ch == L'>') { | |
| 1885 if (m_iDataLength > 1) { | |
| 1886 m_BlockBuffer.Reset(); | |
| 1887 m_pCurrentBlock = | |
| 1888 m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | |
| 1889 m_dwMode = FDE_XMLSYNTAXMODE_Text; | |
| 1890 } | |
| 1891 } else { | |
| 1892 m_BlockBuffer.Reset(); | |
| 1893 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | |
| 1894 } | 1892 } |
| 1893 |
| 1895 m_pStart++; | 1894 m_pStart++; |
| 1896 break; | 1895 break; |
| 1897 case FDE_XMLSYNTAXMODE_TargetData: | 1896 case FDE_XMLSYNTAXMODE_TargetData: |
| 1898 if (FDE_IsXMLWhiteSpace(ch)) { | 1897 if (FDE_IsXMLWhiteSpace(ch)) { |
| 1899 if (m_iDataLength < 1) { | 1898 if (m_iDataLength < 1) { |
| 1900 m_pStart++; | 1899 m_pStart++; |
| 1901 break; | 1900 break; |
| 1902 } else if (m_wQuotationMark == 0) { | 1901 } else if (m_wQuotationMark == 0) { |
| 1903 m_iTextDataLength = m_iDataLength; | 1902 m_iTextDataLength = m_iDataLength; |
| 1904 m_wQuotationMark = 0; | 1903 m_wQuotationMark = 0; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1938 } | 1937 } |
| 1939 } | 1938 } |
| 1940 m_pCurrentBlock[m_iIndexInBlock++] = ch; | 1939 m_pCurrentBlock[m_iIndexInBlock++] = ch; |
| 1941 m_iDataLength++; | 1940 m_iDataLength++; |
| 1942 m_pStart++; | 1941 m_pStart++; |
| 1943 } | 1942 } |
| 1944 break; | 1943 break; |
| 1945 default: | 1944 default: |
| 1946 break; | 1945 break; |
| 1947 } | 1946 } |
| 1948 if (dwStatus != FDE_XMLSYNTAXSTATUS_None) { | 1947 if (dwStatus != FDE_XMLSYNTAXSTATUS_None) |
| 1949 return dwStatus; | 1948 return dwStatus; |
| 1950 } | |
| 1951 } | 1949 } |
| 1952 } | 1950 } |
| 1953 return 0; | 1951 return 0; |
| 1954 } | 1952 } |
| 1955 | 1953 |
| 1956 CFDE_XMLSyntaxParser::~CFDE_XMLSyntaxParser() { | 1954 CFDE_XMLSyntaxParser::~CFDE_XMLSyntaxParser() { |
| 1957 if (m_pCurrentBlock) { | 1955 if (m_pCurrentBlock) { |
| 1958 m_pCurrentBlock = NULL; | 1956 m_pCurrentBlock = NULL; |
| 1959 } | 1957 } |
| 1960 FX_Free(m_pBuffer); | 1958 FX_Free(m_pBuffer); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2074 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); | 2072 m_BlockBuffer.DeleteTextChars(m_iDataLength - m_iEntityStart, FALSE); |
| 2075 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); | 2073 m_pCurrentBlock = m_BlockBuffer.GetAvailableBlock(m_iIndexInBlock); |
| 2076 m_iEntityStart = -1; | 2074 m_iEntityStart = -1; |
| 2077 } else { | 2075 } else { |
| 2078 if (m_iEntityStart < 0 && ch == L'&') { | 2076 if (m_iEntityStart < 0 && ch == L'&') { |
| 2079 m_iEntityStart = m_iDataLength - 1; | 2077 m_iEntityStart = m_iDataLength - 1; |
| 2080 } | 2078 } |
| 2081 } | 2079 } |
| 2082 m_pStart++; | 2080 m_pStart++; |
| 2083 } | 2081 } |
| OLD | NEW |