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 |