summaryrefslogtreecommitdiff
path: root/xfa/src/fdp/src/css/fde_csssyntax.h
blob: c18e0f9717ebf6eefc25fa6349090c7ab33398ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef _FDE_CSSSYNTAX
#define _FDE_CSSSYNTAX
class CFDE_CSSTextBuf : public CFX_Target
{
public:
    CFDE_CSSTextBuf();
    ~CFDE_CSSTextBuf();
    FX_BOOL							AttachBuffer(FX_LPCWSTR pBuffer, FX_INT32 iBufLen);
    FX_BOOL							EstimateSize(FX_INT32 iAllocSize);
    FX_INT32						LoadFromStream(IFX_Stream *pTxtStream, FX_INT32 iStreamOffset, FX_INT32 iMaxChars, FX_BOOL &bEOS);
    FX_BOOL							AppendChar(FX_WCHAR wch)
    {
        if (m_iDatLen >= m_iBufLen && !ExpandBuf(m_iBufLen * 2)) {
            return FALSE;
        }
        return (m_pBuffer[m_iDatLen++] = wch), TRUE;
    }
    void							Clear()
    {
        m_iDatPos = m_iDatLen = 0;
    }
    void							Reset();
    FX_INT32						TrimEnd()
    {
        while (m_iDatLen > 0 && m_pBuffer[m_iDatLen - 1] <= ' ') {
            --m_iDatLen;
        }
        AppendChar(0);
        return --m_iDatLen;
    }
    void							Subtract(FX_INT32 iStart, FX_INT32 iLength);
    FX_BOOL							IsEOF() const
    {
        return m_iDatPos >= m_iDatLen;
    }
    FX_WCHAR						GetAt(FX_INT32 index) const
    {
        return m_pBuffer[index];
    }
    FX_WCHAR						GetChar() const
    {
        return m_pBuffer[m_iDatPos];
    }
    FX_WCHAR						GetNextChar() const
    {
        return (m_iDatPos + 1 >= m_iDatLen) ? 0 : m_pBuffer[m_iDatPos + 1];
    }
    void							MoveNext()
    {
        m_iDatPos++;
    }
    FX_INT32						GetLength() const
    {
        return m_iDatLen;
    }
    FX_LPCWSTR						GetBuffer() const
    {
        return m_pBuffer;
    }
protected:
    FX_BOOL							ExpandBuf(FX_INT32 iDesiredSize);
    FX_BOOL							m_bExtBuf;
    FX_LPWSTR						m_pBuffer;
    FX_INT32						m_iBufLen;
    FX_INT32						m_iDatLen;
    FX_INT32						m_iDatPos;
};
#define FDE_CSSSYNTAXCHECK_AllowCharset	1
#define FDE_CSSSYNTAXCHECK_AllowImport	2
enum FDE_CSSSYNTAXMODE {
    FDE_CSSSYNTAXMODE_RuleSet,
    FDE_CSSSYNTAXMODE_Comment,
    FDE_CSSSYNTAXMODE_AtRule,
    FDE_CSSSYNTAXMODE_UnknownRule,
    FDE_CSSSYNTAXMODE_Charset,
    FDE_CSSSYNTAXMODE_Import,
    FDE_CSSSYNTAXMODE_MediaRule,
    FDE_CSSSYNTAXMODE_URI,
    FDE_CSSSYNTAXMODE_MediaType,
    FDE_CSSSYNTAXMODE_Selector,
    FDE_CSSSYNTAXMODE_PropertyName,
    FDE_CSSSYNTAXMODE_PropertyValue,
};
class CFDE_CSSSyntaxParser : public IFDE_CSSSyntaxParser, public CFX_Target
{
public:
    CFDE_CSSSyntaxParser();
    ~CFDE_CSSSyntaxParser();
    virtual void					Release()
    {
        FDE_Delete this;
    }
    virtual FX_BOOL					Init(IFX_Stream *pStream, FX_INT32 iCSSPlaneSize, FX_INT32 iTextDataSize = 32, FX_BOOL bOnlyDeclaration = FALSE);
    virtual FX_BOOL					Init(FX_LPCWSTR pBuffer, FX_INT32 iBufferSize, FX_INT32 iTextDatSize = 32, FX_BOOL bOnlyDeclaration = FALSE);
    virtual FDE_CSSSYNTAXSTATUS		DoSyntaxParse();
    virtual FX_LPCWSTR				GetCurrentString(FX_INT32 &iLength) const;
protected:
    void							Reset(FX_BOOL bOnlyDeclaration);
    void							SwitchMode(FDE_CSSSYNTAXMODE eMode);
    FX_INT32						SwitchToComment();

    FX_BOOL							RestoreMode();
    FX_BOOL							AppendChar(FX_WCHAR wch);
    FX_INT32						SaveTextData();
    FX_BOOL							IsCharsetEnabled() const
    {
        return (m_dwCheck & FDE_CSSSYNTAXCHECK_AllowCharset) != 0;
    }
    void							DisableCharset()
    {
        m_dwCheck = FDE_CSSSYNTAXCHECK_AllowImport;
    }
    FX_BOOL							IsImportEnabled() const;
    void							DisableImport()
    {
        m_dwCheck = 0;
    }
    IFX_Stream						*m_pStream;
    FX_INT32						m_iStreamPos;
    FX_INT32						m_iPlaneSize;
    CFDE_CSSTextBuf					m_TextData;
    CFDE_CSSTextBuf					m_TextPlane;
    FX_INT32						m_iTextDatLen;
    FX_DWORD						m_dwCheck;
    FDE_CSSSYNTAXMODE				m_eMode;
    FDE_CSSSYNTAXSTATUS				m_eStatus;
    CFX_StackTemplate<FDE_CSSSYNTAXMODE> m_ModeStack;
};
#endif