1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef _XFA_FM_SIMPLEEXPRESSION_H
8 #define _XFA_FM_SIMPLEEXPRESSION_H
9 enum XFA_FM_SimpleExpressionType {
10   ASSIGN,
11   LOGICALOR,
12   LOGICALAND,
13   EQUALITY,
14   NOTEQUALITY,
15   LESS,
16   LESSEQUAL,
17   GREATER,
18   GREATEREQUAL,
19   PLUS,
20   MINUS,
21   MULTIPLE,
22   DIVIDE,
23   POSITIVE,
24   NEGATIVE,
25   NOT,
26   CALL,
27   DOT,
28   DOTDOT,
29   CONCATFMOBJECT,
30   ISFMOBJECT,
31   ISFMARRAY,
32   GETFMVALUE,
33   GETFMJSOBJ,
34   VARFILTER
35 };
36 CFX_WideStringC XFA_FM_EXPTypeToString(
37     XFA_FM_SimpleExpressionType simpleExpType);
38 struct XFA_FMBuildInFunc {
39   uint32_t m_uHash;
40   const FX_WCHAR* m_buildinfunc;
41 };
42 struct XFA_FMSOMMethod {
43   uint32_t m_uHash;
44   const FX_WCHAR* m_wsSomMethodName;
45   FX_DWORD m_dParameters;
46 };
47 enum XFA_FM_AccessorIndex {
48   ACCESSOR_NO_INDEX,
49   ACCESSOR_NO_RELATIVEINDEX,
50   ACCESSOR_POSITIVE_INDEX,
51   ACCESSOR_NEGATIVE_INDEX
52 };
53 class CXFA_FMSimpleExpression {
54  public:
55   CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op);
~CXFA_FMSimpleExpression()56   virtual ~CXFA_FMSimpleExpression(){};
57   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
58   virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript);
59 
60   XFA_FM_TOKEN GetOperatorToken() const;
61 
62  protected:
63   FX_DWORD m_line;
64   XFA_FM_TOKEN m_op;
65 };
66 class CXFA_FMNullExpression : public CXFA_FMSimpleExpression {
67  public:
68   CXFA_FMNullExpression(FX_DWORD line);
~CXFA_FMNullExpression()69   virtual ~CXFA_FMNullExpression(){};
70   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
71 };
72 class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression {
73  public:
74   CXFA_FMNumberExpression(FX_DWORD line, CFX_WideStringC wsNumber);
~CXFA_FMNumberExpression()75   virtual ~CXFA_FMNumberExpression(){};
76   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
77 
78  protected:
79   CFX_WideStringC m_wsNumber;
80 };
81 class CXFA_FMStringExpression : public CXFA_FMSimpleExpression {
82  public:
83   CXFA_FMStringExpression(FX_DWORD line, CFX_WideStringC wsString);
~CXFA_FMStringExpression()84   virtual ~CXFA_FMStringExpression(){};
85   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
86 
87  protected:
88   CFX_WideStringC m_wsString;
89 };
90 class CXFA_FMIdentifierExpressionn : public CXFA_FMSimpleExpression {
91  public:
92   CXFA_FMIdentifierExpressionn(FX_DWORD line, CFX_WideStringC wsIdentifier);
~CXFA_FMIdentifierExpressionn()93   virtual ~CXFA_FMIdentifierExpressionn(){};
94   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
95 
96  protected:
97   CFX_WideStringC m_wsIdentifier;
98 };
99 class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression {
100  public:
101   CXFA_FMUnaryExpression(FX_DWORD line,
102                          XFA_FM_TOKEN op,
103                          CXFA_FMSimpleExpression* pExp);
104   virtual ~CXFA_FMUnaryExpression();
105   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
106 
107  protected:
108   CXFA_FMSimpleExpression* m_pExp;
109 };
110 class CXFA_FMBinExpression : public CXFA_FMSimpleExpression {
111  public:
112   CXFA_FMBinExpression(FX_DWORD line,
113                        XFA_FM_TOKEN op,
114                        CXFA_FMSimpleExpression* pExp1,
115                        CXFA_FMSimpleExpression* pExp2);
116   virtual ~CXFA_FMBinExpression();
117   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
118 
119  protected:
120   CXFA_FMSimpleExpression* m_pExp1;
121   CXFA_FMSimpleExpression* m_pExp2;
122 };
123 class CXFA_FMAssignExpression : public CXFA_FMBinExpression {
124  public:
125   CXFA_FMAssignExpression(FX_DWORD line,
126                           XFA_FM_TOKEN op,
127                           CXFA_FMSimpleExpression* pExp1,
128                           CXFA_FMSimpleExpression* pExp2);
~CXFA_FMAssignExpression()129   virtual ~CXFA_FMAssignExpression(){};
130   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
131   virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript);
132 };
133 class CXFA_FMLogicalOrExpression : public CXFA_FMBinExpression {
134  public:
135   CXFA_FMLogicalOrExpression(FX_DWORD line,
136                              XFA_FM_TOKEN op,
137                              CXFA_FMSimpleExpression* pExp1,
138                              CXFA_FMSimpleExpression* pExp2);
~CXFA_FMLogicalOrExpression()139   virtual ~CXFA_FMLogicalOrExpression(){};
140   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
141 };
142 class CXFA_FMLogicalAndExpression : public CXFA_FMBinExpression {
143  public:
144   CXFA_FMLogicalAndExpression(FX_DWORD line,
145                               XFA_FM_TOKEN op,
146                               CXFA_FMSimpleExpression* pExp1,
147                               CXFA_FMSimpleExpression* pExp2);
~CXFA_FMLogicalAndExpression()148   virtual ~CXFA_FMLogicalAndExpression(){};
149   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
150 };
151 class CXFA_FMEqualityExpression : public CXFA_FMBinExpression {
152  public:
153   CXFA_FMEqualityExpression(FX_DWORD line,
154                             XFA_FM_TOKEN op,
155                             CXFA_FMSimpleExpression* pExp1,
156                             CXFA_FMSimpleExpression* pExp2);
~CXFA_FMEqualityExpression()157   virtual ~CXFA_FMEqualityExpression(){};
158   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
159 };
160 class CXFA_FMRelationalExpression : public CXFA_FMBinExpression {
161  public:
162   CXFA_FMRelationalExpression(FX_DWORD line,
163                               XFA_FM_TOKEN op,
164                               CXFA_FMSimpleExpression* pExp1,
165                               CXFA_FMSimpleExpression* pExp2);
~CXFA_FMRelationalExpression()166   virtual ~CXFA_FMRelationalExpression(){};
167   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
168 };
169 class CXFA_FMAdditiveExpression : public CXFA_FMBinExpression {
170  public:
171   CXFA_FMAdditiveExpression(FX_DWORD line,
172                             XFA_FM_TOKEN op,
173                             CXFA_FMSimpleExpression* pExp1,
174                             CXFA_FMSimpleExpression* pExp2);
~CXFA_FMAdditiveExpression()175   virtual ~CXFA_FMAdditiveExpression(){};
176   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
177 };
178 class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression {
179  public:
180   CXFA_FMMultiplicativeExpression(FX_DWORD line,
181                                   XFA_FM_TOKEN op,
182                                   CXFA_FMSimpleExpression* pExp1,
183                                   CXFA_FMSimpleExpression* pExp2);
~CXFA_FMMultiplicativeExpression()184   virtual ~CXFA_FMMultiplicativeExpression(){};
185   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
186 };
187 class CXFA_FMPosExpression : public CXFA_FMUnaryExpression {
188  public:
189   CXFA_FMPosExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
~CXFA_FMPosExpression()190   virtual ~CXFA_FMPosExpression(){};
191   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
192 };
193 class CXFA_FMNegExpression : public CXFA_FMUnaryExpression {
194  public:
195   CXFA_FMNegExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
~CXFA_FMNegExpression()196   virtual ~CXFA_FMNegExpression(){};
197   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
198 };
199 class CXFA_FMNotExpression : public CXFA_FMUnaryExpression {
200  public:
201   CXFA_FMNotExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
~CXFA_FMNotExpression()202   virtual ~CXFA_FMNotExpression(){};
203   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
204 };
205 class CXFA_FMCallExpression : public CXFA_FMUnaryExpression {
206  public:
207   CXFA_FMCallExpression(FX_DWORD line,
208                         CXFA_FMSimpleExpression* pExp,
209                         CFX_PtrArray* pArguments,
210                         FX_BOOL bIsSomMethod);
211   virtual ~CXFA_FMCallExpression();
212   virtual FX_BOOL IsBuildInFunc(CFX_WideTextBuf& funcName);
213   virtual FX_DWORD IsSomMethodWithObjPara(const CFX_WideStringC& methodName);
214   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
215 
216  private:
217   FX_BOOL m_bIsSomMethod;
218   CFX_PtrArray* m_pArguments;
219 };
220 class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression {
221  public:
222   CXFA_FMDotAccessorExpression(FX_DWORD line,
223                                CXFA_FMSimpleExpression* pAccessor,
224                                XFA_FM_TOKEN op,
225                                CFX_WideStringC wsIdentifier,
226                                CXFA_FMSimpleExpression* pIndexExp);
~CXFA_FMDotAccessorExpression()227   virtual ~CXFA_FMDotAccessorExpression(){};
228   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
229 
230  protected:
231   CFX_WideStringC m_wsIdentifier;
232 };
233 class CXFA_FMIndexExpression : public CXFA_FMUnaryExpression {
234  public:
235   CXFA_FMIndexExpression(FX_DWORD line,
236                          XFA_FM_AccessorIndex accessorIndex,
237                          CXFA_FMSimpleExpression* pIndexExp,
238                          FX_BOOL bIsStarIndex);
~CXFA_FMIndexExpression()239   virtual ~CXFA_FMIndexExpression(){};
240   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
241 
242  protected:
243   XFA_FM_AccessorIndex m_accessorIndex;
244   FX_BOOL m_bIsStarIndex;
245 };
246 class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression {
247  public:
248   CXFA_FMDotDotAccessorExpression(FX_DWORD line,
249                                   CXFA_FMSimpleExpression* pAccessor,
250                                   XFA_FM_TOKEN op,
251                                   CFX_WideStringC wsIdentifier,
252                                   CXFA_FMSimpleExpression* pIndexExp);
~CXFA_FMDotDotAccessorExpression()253   virtual ~CXFA_FMDotDotAccessorExpression(){};
254   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
255 
256  protected:
257   CFX_WideStringC m_wsIdentifier;
258 };
259 class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression {
260  public:
261   CXFA_FMMethodCallExpression(FX_DWORD line,
262                               CXFA_FMSimpleExpression* pAccessorExp1,
263                               CXFA_FMSimpleExpression* pCallExp);
~CXFA_FMMethodCallExpression()264   virtual ~CXFA_FMMethodCallExpression(){};
265   virtual void ToJavaScript(CFX_WideTextBuf& javascript);
266 
267  protected:
268 };
269 #endif
270