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/fxfa/parser/xfa_script_resolveprocessor.h" | 7 #include "xfa/fxfa/parser/xfa_script_resolveprocessor.h" |
8 | 8 |
9 #include "core/fxcrt/include/fx_ext.h" | 9 #include "core/fxcrt/include/fx_ext.h" |
10 #include "xfa/fxfa/parser/xfa_doclayout.h" | 10 #include "xfa/fxfa/parser/xfa_doclayout.h" |
11 #include "xfa/fxfa/parser/xfa_document.h" | 11 #include "xfa/fxfa/parser/xfa_document.h" |
12 #include "xfa/fxfa/parser/xfa_localemgr.h" | 12 #include "xfa/fxfa/parser/xfa_localemgr.h" |
13 #include "xfa/fxfa/parser/xfa_object.h" | 13 #include "xfa/fxfa/parser/xfa_object.h" |
14 #include "xfa/fxfa/parser/xfa_parser.h" | 14 #include "xfa/fxfa/parser/xfa_parser.h" |
15 #include "xfa/fxfa/parser/xfa_script.h" | 15 #include "xfa/fxfa/parser/xfa_script.h" |
16 #include "xfa/fxfa/parser/xfa_script_imp.h" | 16 #include "xfa/fxfa/parser/xfa_script_imp.h" |
17 #include "xfa/fxfa/parser/xfa_script_nodehelper.h" | 17 #include "xfa/fxfa/parser/xfa_script_nodehelper.h" |
18 #include "xfa/fxfa/parser/xfa_utils.h" | 18 #include "xfa/fxfa/parser/xfa_utils.h" |
19 | 19 |
20 CXFA_ResolveProcessor::CXFA_ResolveProcessor() | 20 CXFA_ResolveProcessor::CXFA_ResolveProcessor() |
21 : m_pNodeHelper(new CXFA_NodeHelper), m_iCurStart(0) {} | 21 : m_iCurStart(0), m_pNodeHelper(new CXFA_NodeHelper) {} |
22 | 22 |
23 CXFA_ResolveProcessor::~CXFA_ResolveProcessor() { | 23 CXFA_ResolveProcessor::~CXFA_ResolveProcessor() { |
24 delete m_pNodeHelper; | 24 delete m_pNodeHelper; |
25 } | 25 } |
26 | 26 |
27 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes(CXFA_ResolveNodesData& rnd) { | 27 int32_t CXFA_ResolveProcessor::Resolve(CXFA_ResolveNodesData& rnd) { |
28 if (!rnd.m_CurNode) { | 28 if (!rnd.m_CurNode) { |
29 return -1; | 29 return -1; |
30 } | 30 } |
31 if (!rnd.m_CurNode->IsNode()) { | 31 if (!rnd.m_CurNode->IsNode()) { |
32 if (rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) { | 32 if (rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) { |
33 return XFA_ResolveNodes_ForAttributeRs(rnd.m_CurNode, rnd, | 33 return ResolveForAttributeRs(rnd.m_CurNode, rnd, |
34 rnd.m_wsName.AsStringC()); | 34 rnd.m_wsName.AsStringC()); |
35 } | 35 } |
36 return 0; | 36 return 0; |
37 } | 37 } |
38 if (rnd.m_dwStyles & XFA_RESOLVENODE_AnyChild) { | 38 if (rnd.m_dwStyles & XFA_RESOLVENODE_AnyChild) { |
39 return XFA_ResolveNodes_AnyChild(rnd); | 39 return ResolveAnyChild(rnd); |
40 } | 40 } |
41 FX_WCHAR wch = rnd.m_wsName.GetAt(0); | 41 FX_WCHAR wch = rnd.m_wsName.GetAt(0); |
42 switch (wch) { | 42 switch (wch) { |
43 case '$': | 43 case '$': |
44 return XFA_ResolveNodes_Dollar(rnd); | 44 return ResolveDollar(rnd); |
45 case '!': | 45 case '!': |
46 return XFA_ResolveNodes_Excalmatory(rnd); | 46 return ResolveExcalmatory(rnd); |
47 case '#': | 47 case '#': |
48 return XFA_ResolveNodes_NumberSign(rnd); | 48 return ResolveNumberSign(rnd); |
49 case '*': | 49 case '*': |
50 return XFA_ResolveNodes_Asterisk(rnd); | 50 return ResolveAsterisk(rnd); |
51 // TODO(dsinclair): We could probably remove this. | 51 // TODO(dsinclair): We could probably remove this. |
52 case '.': | 52 case '.': |
53 return XFA_ResolveNodes_AnyChild(rnd); | 53 return ResolveAnyChild(rnd); |
54 default: | 54 default: |
55 break; | 55 break; |
56 } | 56 } |
57 if (rnd.m_uHashName == XFA_HASHCODE_This && rnd.m_nLevel == 0) { | 57 if (rnd.m_uHashName == XFA_HASHCODE_This && rnd.m_nLevel == 0) { |
58 rnd.m_Nodes.Add(rnd.m_pSC->GetThisObject()); | 58 rnd.m_Nodes.Add(rnd.m_pSC->GetThisObject()); |
59 return 1; | 59 return 1; |
60 } else if (rnd.m_CurNode->GetElementType() == XFA_Element::Xfa) { | 60 } else if (rnd.m_CurNode->GetElementType() == XFA_Element::Xfa) { |
61 CXFA_Object* pObjNode = | 61 CXFA_Object* pObjNode = |
62 rnd.m_pSC->GetDocument()->GetXFAObject(rnd.m_uHashName); | 62 rnd.m_pSC->GetDocument()->GetXFAObject(rnd.m_uHashName); |
63 if (pObjNode) { | 63 if (pObjNode) { |
64 rnd.m_Nodes.Add(pObjNode); | 64 rnd.m_Nodes.Add(pObjNode); |
65 } else if (rnd.m_uHashName == XFA_HASHCODE_Xfa) { | 65 } else if (rnd.m_uHashName == XFA_HASHCODE_Xfa) { |
66 rnd.m_Nodes.Add(rnd.m_CurNode); | 66 rnd.m_Nodes.Add(rnd.m_CurNode); |
67 } else if ((rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) && | 67 } else if ((rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) && |
68 XFA_ResolveNodes_ForAttributeRs(rnd.m_CurNode, rnd, | 68 ResolveForAttributeRs(rnd.m_CurNode, rnd, |
69 rnd.m_wsName.AsStringC())) { | 69 rnd.m_wsName.AsStringC())) { |
70 return 1; | 70 return 1; |
71 } | 71 } |
72 if (rnd.m_Nodes.GetSize() > 0) { | 72 if (rnd.m_Nodes.GetSize() > 0) { |
73 XFA_ResolveNode_FilterCondition(rnd, rnd.m_wsCondition); | 73 FilterCondition(rnd, rnd.m_wsCondition); |
74 } | 74 } |
75 return rnd.m_Nodes.GetSize(); | 75 return rnd.m_Nodes.GetSize(); |
76 } | 76 } |
77 int32_t nRet = XFA_ResolveNodes_Normal(rnd); | 77 int32_t nRet = ResolveNormal(rnd); |
78 if (nRet < 1 && rnd.m_uHashName == XFA_HASHCODE_Xfa) { | 78 if (nRet < 1 && rnd.m_uHashName == XFA_HASHCODE_Xfa) { |
79 rnd.m_Nodes.Add(rnd.m_pSC->GetDocument()->GetRoot()); | 79 rnd.m_Nodes.Add(rnd.m_pSC->GetDocument()->GetRoot()); |
80 } | 80 } |
81 return rnd.m_Nodes.GetSize(); | 81 return rnd.m_Nodes.GetSize(); |
82 } | 82 } |
83 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_AnyChild( | 83 int32_t CXFA_ResolveProcessor::ResolveAnyChild(CXFA_ResolveNodesData& rnd) { |
84 CXFA_ResolveNodesData& rnd) { | |
85 CFX_WideString wsName = rnd.m_wsName; | 84 CFX_WideString wsName = rnd.m_wsName; |
86 CFX_WideString wsCondition = rnd.m_wsCondition; | 85 CFX_WideString wsCondition = rnd.m_wsCondition; |
87 CXFA_Node* findNode = nullptr; | 86 CXFA_Node* findNode = nullptr; |
88 CXFA_NodeArray siblings; | 87 CXFA_NodeArray siblings; |
89 FX_BOOL bClassName = FALSE; | 88 FX_BOOL bClassName = FALSE; |
90 if (wsName.GetAt(0) == '#') { | 89 if (wsName.GetAt(0) == '#') { |
91 bClassName = TRUE; | 90 bClassName = TRUE; |
92 wsName = wsName.Right(wsName.GetLength() - 1); | 91 wsName = wsName.Right(wsName.GetLength() - 1); |
93 } | 92 } |
94 findNode = m_pNodeHelper->XFA_ResolveNodes_GetOneChild( | 93 findNode = m_pNodeHelper->ResolveNodes_GetOneChild( |
95 ToNode(rnd.m_CurNode), wsName.c_str(), bClassName); | 94 ToNode(rnd.m_CurNode), wsName.c_str(), bClassName); |
96 if (!findNode) { | 95 if (!findNode) { |
97 return 0; | 96 return 0; |
98 } | 97 } |
99 if (wsCondition.IsEmpty()) { | 98 if (wsCondition.IsEmpty()) { |
100 rnd.m_Nodes.Add(findNode); | 99 rnd.m_Nodes.Add(findNode); |
101 return rnd.m_Nodes.GetSize(); | 100 return rnd.m_Nodes.GetSize(); |
102 } | 101 } |
103 m_pNodeHelper->XFA_CountSiblings(findNode, XFA_LOGIC_Transparent, | 102 m_pNodeHelper->CountSiblings(findNode, XFA_LOGIC_Transparent, |
104 (CXFA_NodeArray*)&rnd.m_Nodes, bClassName); | 103 (CXFA_NodeArray*)&rnd.m_Nodes, bClassName); |
105 XFA_ResolveNode_FilterCondition(rnd, wsCondition); | 104 FilterCondition(rnd, wsCondition); |
106 return rnd.m_Nodes.GetSize(); | 105 return rnd.m_Nodes.GetSize(); |
107 } | 106 } |
108 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Dollar( | 107 int32_t CXFA_ResolveProcessor::ResolveDollar(CXFA_ResolveNodesData& rnd) { |
109 CXFA_ResolveNodesData& rnd) { | |
110 CXFA_ObjArray& nodes = rnd.m_Nodes; | 108 CXFA_ObjArray& nodes = rnd.m_Nodes; |
111 CFX_WideString wsName = rnd.m_wsName; | 109 CFX_WideString wsName = rnd.m_wsName; |
112 CFX_WideString wsCondition = rnd.m_wsCondition; | 110 CFX_WideString wsCondition = rnd.m_wsCondition; |
113 int32_t iNameLen = wsName.GetLength(); | 111 int32_t iNameLen = wsName.GetLength(); |
114 if (iNameLen == 1) { | 112 if (iNameLen == 1) { |
115 nodes.Add(rnd.m_CurNode); | 113 nodes.Add(rnd.m_CurNode); |
116 return 1; | 114 return 1; |
117 } | 115 } |
118 if (rnd.m_nLevel > 0) { | 116 if (rnd.m_nLevel > 0) { |
119 return -1; | 117 return -1; |
120 } | 118 } |
121 XFA_HashCode dwNameHash = static_cast<XFA_HashCode>(FX_HashCode_GetW( | 119 XFA_HashCode dwNameHash = static_cast<XFA_HashCode>(FX_HashCode_GetW( |
122 CFX_WideStringC(wsName.c_str() + 1, iNameLen - 1), false)); | 120 CFX_WideStringC(wsName.c_str() + 1, iNameLen - 1), false)); |
123 if (dwNameHash == XFA_HASHCODE_Xfa) { | 121 if (dwNameHash == XFA_HASHCODE_Xfa) { |
124 nodes.Add(rnd.m_pSC->GetDocument()->GetRoot()); | 122 nodes.Add(rnd.m_pSC->GetDocument()->GetRoot()); |
125 } else { | 123 } else { |
126 CXFA_Object* pObjNode = rnd.m_pSC->GetDocument()->GetXFAObject(dwNameHash); | 124 CXFA_Object* pObjNode = rnd.m_pSC->GetDocument()->GetXFAObject(dwNameHash); |
127 if (pObjNode) { | 125 if (pObjNode) { |
128 rnd.m_Nodes.Add(pObjNode); | 126 rnd.m_Nodes.Add(pObjNode); |
129 } | 127 } |
130 } | 128 } |
131 if (rnd.m_Nodes.GetSize() > 0) { | 129 if (rnd.m_Nodes.GetSize() > 0) { |
132 XFA_ResolveNode_FilterCondition(rnd, wsCondition); | 130 FilterCondition(rnd, wsCondition); |
133 } | 131 } |
134 return rnd.m_Nodes.GetSize(); | 132 return rnd.m_Nodes.GetSize(); |
135 } | 133 } |
136 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Excalmatory( | 134 int32_t CXFA_ResolveProcessor::ResolveExcalmatory(CXFA_ResolveNodesData& rnd) { |
137 CXFA_ResolveNodesData& rnd) { | |
138 if (rnd.m_nLevel > 0) { | 135 if (rnd.m_nLevel > 0) { |
139 return 0; | 136 return 0; |
140 } | 137 } |
141 CXFA_Node* datasets = | 138 CXFA_Node* datasets = |
142 ToNode(rnd.m_pSC->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets)); | 139 ToNode(rnd.m_pSC->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets)); |
143 if (!datasets) { | 140 if (!datasets) { |
144 return 0; | 141 return 0; |
145 } | 142 } |
146 CXFA_ResolveNodesData rndFind; | 143 CXFA_ResolveNodesData rndFind; |
147 rndFind.m_pSC = rnd.m_pSC; | 144 rndFind.m_pSC = rnd.m_pSC; |
148 rndFind.m_CurNode = datasets; | 145 rndFind.m_CurNode = datasets; |
149 rndFind.m_wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1); | 146 rndFind.m_wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1); |
150 rndFind.m_uHashName = static_cast<XFA_HashCode>( | 147 rndFind.m_uHashName = static_cast<XFA_HashCode>( |
151 FX_HashCode_GetW(rndFind.m_wsName.AsStringC(), false)); | 148 FX_HashCode_GetW(rndFind.m_wsName.AsStringC(), false)); |
152 rndFind.m_nLevel = rnd.m_nLevel + 1; | 149 rndFind.m_nLevel = rnd.m_nLevel + 1; |
153 rndFind.m_dwStyles = XFA_RESOLVENODE_Children; | 150 rndFind.m_dwStyles = XFA_RESOLVENODE_Children; |
154 rndFind.m_wsCondition = rnd.m_wsCondition; | 151 rndFind.m_wsCondition = rnd.m_wsCondition; |
155 XFA_ResolveNodes(rndFind); | 152 Resolve(rndFind); |
156 if (rndFind.m_Nodes.GetSize() > 0) { | 153 if (rndFind.m_Nodes.GetSize() > 0) { |
157 rnd.m_Nodes.Append(rndFind.m_Nodes); | 154 rnd.m_Nodes.Append(rndFind.m_Nodes); |
158 rndFind.m_Nodes.RemoveAll(); | 155 rndFind.m_Nodes.RemoveAll(); |
159 } | 156 } |
160 return rnd.m_Nodes.GetSize(); | 157 return rnd.m_Nodes.GetSize(); |
161 } | 158 } |
162 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_NumberSign( | 159 int32_t CXFA_ResolveProcessor::ResolveNumberSign(CXFA_ResolveNodesData& rnd) { |
163 CXFA_ResolveNodesData& rnd) { | |
164 CFX_WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1); | 160 CFX_WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1); |
165 CFX_WideString wsCondition = rnd.m_wsCondition; | 161 CFX_WideString wsCondition = rnd.m_wsCondition; |
166 CXFA_Node* curNode = ToNode(rnd.m_CurNode); | 162 CXFA_Node* curNode = ToNode(rnd.m_CurNode); |
167 if (XFA_ResolveNodes_ForAttributeRs(curNode, rnd, wsName.AsStringC())) { | 163 if (ResolveForAttributeRs(curNode, rnd, wsName.AsStringC())) { |
168 return 1; | 164 return 1; |
169 } | 165 } |
170 CXFA_ResolveNodesData rndFind; | 166 CXFA_ResolveNodesData rndFind; |
171 rndFind.m_pSC = rnd.m_pSC; | 167 rndFind.m_pSC = rnd.m_pSC; |
172 rndFind.m_nLevel = rnd.m_nLevel + 1; | 168 rndFind.m_nLevel = rnd.m_nLevel + 1; |
173 rndFind.m_dwStyles = rnd.m_dwStyles; | 169 rndFind.m_dwStyles = rnd.m_dwStyles; |
174 rndFind.m_dwStyles |= XFA_RESOLVENODE_TagName; | 170 rndFind.m_dwStyles |= XFA_RESOLVENODE_TagName; |
175 rndFind.m_dwStyles &= ~XFA_RESOLVENODE_Attributes; | 171 rndFind.m_dwStyles &= ~XFA_RESOLVENODE_Attributes; |
176 rndFind.m_wsName = wsName; | 172 rndFind.m_wsName = wsName; |
177 rndFind.m_uHashName = static_cast<XFA_HashCode>( | 173 rndFind.m_uHashName = static_cast<XFA_HashCode>( |
178 FX_HashCode_GetW(rndFind.m_wsName.AsStringC(), false)); | 174 FX_HashCode_GetW(rndFind.m_wsName.AsStringC(), false)); |
179 rndFind.m_wsCondition = wsCondition; | 175 rndFind.m_wsCondition = wsCondition; |
180 rndFind.m_CurNode = curNode; | 176 rndFind.m_CurNode = curNode; |
181 XFA_ResolveNodes_Normal(rndFind); | 177 ResolveNormal(rndFind); |
182 if (rndFind.m_Nodes.GetSize() > 0) { | 178 if (rndFind.m_Nodes.GetSize() > 0) { |
183 if (wsCondition.GetLength() == 0 && rndFind.m_Nodes.Find(curNode) >= 0) { | 179 if (wsCondition.GetLength() == 0 && rndFind.m_Nodes.Find(curNode) >= 0) { |
184 rnd.m_Nodes.Add(curNode); | 180 rnd.m_Nodes.Add(curNode); |
185 } else { | 181 } else { |
186 rnd.m_Nodes.Append(rndFind.m_Nodes); | 182 rnd.m_Nodes.Append(rndFind.m_Nodes); |
187 rndFind.m_Nodes.RemoveAll(); | 183 rndFind.m_Nodes.RemoveAll(); |
188 } | 184 } |
189 } | 185 } |
190 return rnd.m_Nodes.GetSize(); | 186 return rnd.m_Nodes.GetSize(); |
191 } | 187 } |
192 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_ForAttributeRs( | 188 int32_t CXFA_ResolveProcessor::ResolveForAttributeRs( |
193 CXFA_Object* curNode, | 189 CXFA_Object* curNode, |
194 CXFA_ResolveNodesData& rnd, | 190 CXFA_ResolveNodesData& rnd, |
195 const CFX_WideStringC& strAttr) { | 191 const CFX_WideStringC& strAttr) { |
196 const XFA_SCRIPTATTRIBUTEINFO* lpScriptAttribute = | 192 const XFA_SCRIPTATTRIBUTEINFO* lpScriptAttribute = |
197 XFA_GetScriptAttributeByName(curNode->GetElementType(), strAttr); | 193 XFA_GetScriptAttributeByName(curNode->GetElementType(), strAttr); |
198 if (lpScriptAttribute) { | 194 if (lpScriptAttribute) { |
199 rnd.m_pScriptAttribute = lpScriptAttribute; | 195 rnd.m_pScriptAttribute = lpScriptAttribute; |
200 rnd.m_Nodes.Add(curNode); | 196 rnd.m_Nodes.Add(curNode); |
201 rnd.m_dwFlag = XFA_RESOVENODE_RSTYPE_Attribute; | 197 rnd.m_dwFlag = XFA_RESOVENODE_RSTYPE_Attribute; |
202 return 1; | 198 return 1; |
203 } | 199 } |
204 return 0; | 200 return 0; |
205 } | 201 } |
206 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Normal( | 202 int32_t CXFA_ResolveProcessor::ResolveNormal(CXFA_ResolveNodesData& rnd) { |
207 CXFA_ResolveNodesData& rnd) { | |
208 if (rnd.m_nLevel > 32) { | 203 if (rnd.m_nLevel > 32) { |
209 return 0; | 204 return 0; |
210 } | 205 } |
211 if (!rnd.m_CurNode->IsNode()) { | 206 if (!rnd.m_CurNode->IsNode()) { |
212 return 0; | 207 return 0; |
213 } | 208 } |
214 CXFA_Node* curNode = ToNode(rnd.m_CurNode); | 209 CXFA_Node* curNode = ToNode(rnd.m_CurNode); |
215 CXFA_ObjArray& nodes = rnd.m_Nodes; | 210 CXFA_ObjArray& nodes = rnd.m_Nodes; |
216 int32_t nNum = nodes.GetSize(); | 211 int32_t nNum = nodes.GetSize(); |
217 uint32_t dwStyles = rnd.m_dwStyles; | 212 uint32_t dwStyles = rnd.m_dwStyles; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 } | 244 } |
250 } | 245 } |
251 pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); | 246 pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling); |
252 } | 247 } |
253 if ((dwStyles & XFA_RESOLVENODE_Properties) && pVariablesNode) { | 248 if ((dwStyles & XFA_RESOLVENODE_Properties) && pVariablesNode) { |
254 uint32_t uPropHash = pVariablesNode->GetClassHashCode(); | 249 uint32_t uPropHash = pVariablesNode->GetClassHashCode(); |
255 if (uPropHash == uNameHash) { | 250 if (uPropHash == uNameHash) { |
256 nodes.Add(pVariablesNode); | 251 nodes.Add(pVariablesNode); |
257 } else { | 252 } else { |
258 rndFind.m_CurNode = pVariablesNode; | 253 rndFind.m_CurNode = pVariablesNode; |
259 XFA_ResolveNodes_SetStylesForChild(dwStyles, rndFind); | 254 SetStylesForChild(dwStyles, rndFind); |
260 CFX_WideString wsSaveCondition = rndFind.m_wsCondition; | 255 CFX_WideString wsSaveCondition = rndFind.m_wsCondition; |
261 rndFind.m_wsCondition.clear(); | 256 rndFind.m_wsCondition.clear(); |
262 XFA_ResolveNodes_Normal(rndFind); | 257 ResolveNormal(rndFind); |
263 rndFind.m_wsCondition = wsSaveCondition; | 258 rndFind.m_wsCondition = wsSaveCondition; |
264 if (rndFind.m_Nodes.GetSize() > 0) { | 259 if (rndFind.m_Nodes.GetSize() > 0) { |
265 nodes.Append(rndFind.m_Nodes); | 260 nodes.Append(rndFind.m_Nodes); |
266 rndFind.m_Nodes.RemoveAll(); | 261 rndFind.m_Nodes.RemoveAll(); |
267 } | 262 } |
268 } | 263 } |
269 if (nodes.GetSize() > nNum) { | 264 if (nodes.GetSize() > nNum) { |
270 XFA_ResolveNode_FilterCondition(rnd, wsCondition); | 265 FilterCondition(rnd, wsCondition); |
271 if (nodes.GetSize() > 0) { | 266 if (nodes.GetSize() > 0) { |
272 return 1; | 267 return 1; |
273 } | 268 } |
274 return 0; | 269 return 0; |
275 } | 270 } |
276 } | 271 } |
277 if (dwStyles & XFA_RESOLVENODE_Children) { | 272 if (dwStyles & XFA_RESOLVENODE_Children) { |
278 FX_BOOL bSetFlag = FALSE; | 273 FX_BOOL bSetFlag = FALSE; |
279 if (pPageSetNode && (dwStyles & XFA_RESOLVENODE_Properties)) { | 274 if (pPageSetNode && (dwStyles & XFA_RESOLVENODE_Properties)) { |
280 children.Add(pPageSetNode); | 275 children.Add(pPageSetNode); |
281 } | 276 } |
282 for (int32_t i = 0; i < children.GetSize(); i++) { | 277 for (int32_t i = 0; i < children.GetSize(); i++) { |
283 CXFA_Node* child = children[i]; | 278 CXFA_Node* child = children[i]; |
284 if (dwStyles & XFA_RESOLVENODE_TagName) { | 279 if (dwStyles & XFA_RESOLVENODE_TagName) { |
285 if (child->GetClassHashCode() == uNameHash) { | 280 if (child->GetClassHashCode() == uNameHash) { |
286 nodes.Add(child); | 281 nodes.Add(child); |
287 } | 282 } |
288 } else if (child->GetNameHash() == uNameHash) { | 283 } else if (child->GetNameHash() == uNameHash) { |
289 nodes.Add(child); | 284 nodes.Add(child); |
290 } | 285 } |
291 if (m_pNodeHelper->XFA_NodeIsTransparent(child) && | 286 if (m_pNodeHelper->NodeIsTransparent(child) && |
292 child->GetElementType() != XFA_Element::PageSet) { | 287 child->GetElementType() != XFA_Element::PageSet) { |
293 if (!bSetFlag) { | 288 if (!bSetFlag) { |
294 XFA_ResolveNodes_SetStylesForChild(dwStyles, rndFind); | 289 SetStylesForChild(dwStyles, rndFind); |
295 bSetFlag = TRUE; | 290 bSetFlag = TRUE; |
296 } | 291 } |
297 rndFind.m_CurNode = child; | 292 rndFind.m_CurNode = child; |
298 CFX_WideString wsSaveCondition = rndFind.m_wsCondition; | 293 CFX_WideString wsSaveCondition = rndFind.m_wsCondition; |
299 rndFind.m_wsCondition.clear(); | 294 rndFind.m_wsCondition.clear(); |
300 XFA_ResolveNodes_Normal(rndFind); | 295 ResolveNormal(rndFind); |
301 rndFind.m_wsCondition = wsSaveCondition; | 296 rndFind.m_wsCondition = wsSaveCondition; |
302 if (rndFind.m_Nodes.GetSize() > 0) { | 297 if (rndFind.m_Nodes.GetSize() > 0) { |
303 nodes.Append(rndFind.m_Nodes); | 298 nodes.Append(rndFind.m_Nodes); |
304 rndFind.m_Nodes.RemoveAll(); | 299 rndFind.m_Nodes.RemoveAll(); |
305 } | 300 } |
306 } | 301 } |
307 } | 302 } |
308 if (nodes.GetSize() > nNum) { | 303 if (nodes.GetSize() > nNum) { |
309 if (!(dwStyles & XFA_RESOLVENODE_ALL)) { | 304 if (!(dwStyles & XFA_RESOLVENODE_ALL)) { |
310 CXFA_NodeArray upArrayNodes; | 305 CXFA_NodeArray upArrayNodes; |
311 if (m_pNodeHelper->XFA_NodeIsTransparent(ToNode(curNode))) { | 306 if (m_pNodeHelper->NodeIsTransparent(ToNode(curNode))) { |
312 m_pNodeHelper->XFA_CountSiblings( | 307 m_pNodeHelper->CountSiblings(ToNode(nodes[0]), XFA_LOGIC_Transparent, |
313 ToNode(nodes[0]), XFA_LOGIC_Transparent, &upArrayNodes, | 308 &upArrayNodes, |
314 !!(dwStyles & XFA_RESOLVENODE_TagName)); | 309 !!(dwStyles & XFA_RESOLVENODE_TagName)); |
315 } | 310 } |
316 if (upArrayNodes.GetSize() > nodes.GetSize()) { | 311 if (upArrayNodes.GetSize() > nodes.GetSize()) { |
317 upArrayNodes[0] = ToNode(nodes[0]); | 312 upArrayNodes[0] = ToNode(nodes[0]); |
318 nodes.RemoveAll(); | 313 nodes.RemoveAll(); |
319 nodes.Append((CXFA_ObjArray&)upArrayNodes); | 314 nodes.Append((CXFA_ObjArray&)upArrayNodes); |
320 upArrayNodes.RemoveAll(); | 315 upArrayNodes.RemoveAll(); |
321 } | 316 } |
322 } | 317 } |
323 XFA_ResolveNode_FilterCondition(rnd, wsCondition); | 318 FilterCondition(rnd, wsCondition); |
324 if (nodes.GetSize() > 0) { | 319 if (nodes.GetSize() > 0) { |
325 return 1; | 320 return 1; |
326 } | 321 } |
327 return 0; | 322 return 0; |
328 } | 323 } |
329 } | 324 } |
330 if (dwStyles & XFA_RESOLVENODE_Attributes) { | 325 if (dwStyles & XFA_RESOLVENODE_Attributes) { |
331 if (XFA_ResolveNodes_ForAttributeRs(curNode, rnd, wsName.AsStringC())) { | 326 if (ResolveForAttributeRs(curNode, rnd, wsName.AsStringC())) { |
332 return 1; | 327 return 1; |
333 } | 328 } |
334 } | 329 } |
335 if (dwStyles & XFA_RESOLVENODE_Properties) { | 330 if (dwStyles & XFA_RESOLVENODE_Properties) { |
336 for (int32_t i = 0; i < properties.GetSize(); i++) { | 331 for (int32_t i = 0; i < properties.GetSize(); i++) { |
337 CXFA_Node* childProperty = properties[i]; | 332 CXFA_Node* childProperty = properties[i]; |
338 if (childProperty->IsUnnamed()) { | 333 if (childProperty->IsUnnamed()) { |
339 uint32_t uPropHash = childProperty->GetClassHashCode(); | 334 uint32_t uPropHash = childProperty->GetClassHashCode(); |
340 if (uPropHash == uNameHash) { | 335 if (uPropHash == uNameHash) { |
341 nodes.Add(childProperty); | 336 nodes.Add(childProperty); |
342 } | 337 } |
343 } else if (childProperty->GetNameHash() == uNameHash && | 338 } else if (childProperty->GetNameHash() == uNameHash && |
344 childProperty->GetElementType() != XFA_Element::Extras && | 339 childProperty->GetElementType() != XFA_Element::Extras && |
345 childProperty->GetElementType() != XFA_Element::Items) { | 340 childProperty->GetElementType() != XFA_Element::Items) { |
346 nodes.Add(childProperty); | 341 nodes.Add(childProperty); |
347 } | 342 } |
348 } | 343 } |
349 if (nodes.GetSize() > nNum) { | 344 if (nodes.GetSize() > nNum) { |
350 XFA_ResolveNode_FilterCondition(rnd, wsCondition); | 345 FilterCondition(rnd, wsCondition); |
351 if (nodes.GetSize() > 0) { | 346 if (nodes.GetSize() > 0) { |
352 return 1; | 347 return 1; |
353 } | 348 } |
354 return 0; | 349 return 0; |
355 } | 350 } |
356 CXFA_Node* pProp = nullptr; | 351 CXFA_Node* pProp = nullptr; |
357 if (XFA_Element::Subform == curNode->GetElementType() && | 352 if (XFA_Element::Subform == curNode->GetElementType() && |
358 XFA_HASHCODE_Occur == uNameHash) { | 353 XFA_HASHCODE_Occur == uNameHash) { |
359 CXFA_Node* pInstanceManager = | 354 CXFA_Node* pInstanceManager = |
360 curNode->AsNode()->GetInstanceMgrOfSubform(); | 355 curNode->AsNode()->GetInstanceMgrOfSubform(); |
361 if (pInstanceManager) { | 356 if (pInstanceManager) { |
362 pProp = pInstanceManager->GetProperty(0, XFA_Element::Occur, TRUE); | 357 pProp = pInstanceManager->GetProperty(0, XFA_Element::Occur, TRUE); |
363 } | 358 } |
364 } else { | 359 } else { |
365 XFA_Element eType = XFA_GetElementTypeForName(wsName.AsStringC()); | 360 XFA_Element eType = XFA_GetElementTypeForName(wsName.AsStringC()); |
366 if (eType != XFA_Element::Unknown) { | 361 if (eType != XFA_Element::Unknown) { |
367 pProp = curNode->AsNode()->GetProperty(0, eType, | 362 pProp = curNode->AsNode()->GetProperty(0, eType, |
368 eType != XFA_Element::PageSet); | 363 eType != XFA_Element::PageSet); |
369 } | 364 } |
370 } | 365 } |
371 if (pProp) { | 366 if (pProp) { |
372 nodes.Add(pProp); | 367 nodes.Add(pProp); |
373 return nodes.GetSize(); | 368 return nodes.GetSize(); |
374 } | 369 } |
375 } | 370 } |
376 CXFA_Node* parentNode = m_pNodeHelper->XFA_ResolveNodes_GetParent( | 371 CXFA_Node* parentNode = m_pNodeHelper->ResolveNodes_GetParent( |
377 curNode->AsNode(), XFA_LOGIC_NoTransparent); | 372 curNode->AsNode(), XFA_LOGIC_NoTransparent); |
378 uint32_t uCurClassHash = curNode->GetClassHashCode(); | 373 uint32_t uCurClassHash = curNode->GetClassHashCode(); |
379 if (!parentNode) { | 374 if (!parentNode) { |
380 if (uCurClassHash == uNameHash) { | 375 if (uCurClassHash == uNameHash) { |
381 nodes.Add(curNode->AsNode()); | 376 nodes.Add(curNode->AsNode()); |
382 XFA_ResolveNode_FilterCondition(rnd, wsCondition); | 377 FilterCondition(rnd, wsCondition); |
383 if (nodes.GetSize() > 0) { | 378 if (nodes.GetSize() > 0) { |
384 return 1; | 379 return 1; |
385 } | 380 } |
386 } | 381 } |
387 return 0; | 382 return 0; |
388 } | 383 } |
389 if (dwStyles & XFA_RESOLVENODE_Siblings) { | 384 if (dwStyles & XFA_RESOLVENODE_Siblings) { |
390 CXFA_Node* child = parentNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 385 CXFA_Node* child = parentNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
391 uint32_t dwSubStyles = | 386 uint32_t dwSubStyles = |
392 XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties; | 387 XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 const XFA_PROPERTY* pPropert = XFA_GetPropertyOfElement( | 421 const XFA_PROPERTY* pPropert = XFA_GetPropertyOfElement( |
427 parentNode->GetElementType(), child->GetElementType(), | 422 parentNode->GetElementType(), child->GetElementType(), |
428 XFA_XDPPACKET_UNKNOWN); | 423 XFA_XDPPACKET_UNKNOWN); |
429 FX_BOOL bInnerSearch = FALSE; | 424 FX_BOOL bInnerSearch = FALSE; |
430 if (pPropert) { | 425 if (pPropert) { |
431 if ((child->GetElementType() == XFA_Element::Variables || | 426 if ((child->GetElementType() == XFA_Element::Variables || |
432 child->GetElementType() == XFA_Element::PageSet)) { | 427 child->GetElementType() == XFA_Element::PageSet)) { |
433 bInnerSearch = TRUE; | 428 bInnerSearch = TRUE; |
434 } | 429 } |
435 } else { | 430 } else { |
436 if (m_pNodeHelper->XFA_NodeIsTransparent(child)) { | 431 if (m_pNodeHelper->NodeIsTransparent(child)) { |
437 bInnerSearch = TRUE; | 432 bInnerSearch = TRUE; |
438 } | 433 } |
439 } | 434 } |
440 if (bInnerSearch) { | 435 if (bInnerSearch) { |
441 rndFind.m_CurNode = child; | 436 rndFind.m_CurNode = child; |
442 CFX_WideString wsOriginCondition = rndFind.m_wsCondition; | 437 CFX_WideString wsOriginCondition = rndFind.m_wsCondition; |
443 rndFind.m_wsCondition.clear(); | 438 rndFind.m_wsCondition.clear(); |
444 uint32_t dwOriginStyle = rndFind.m_dwStyles; | 439 uint32_t dwOriginStyle = rndFind.m_dwStyles; |
445 rndFind.m_dwStyles = dwOriginStyle | XFA_RESOLVENODE_ALL; | 440 rndFind.m_dwStyles = dwOriginStyle | XFA_RESOLVENODE_ALL; |
446 XFA_ResolveNodes_Normal(rndFind); | 441 ResolveNormal(rndFind); |
447 rndFind.m_dwStyles = dwOriginStyle; | 442 rndFind.m_dwStyles = dwOriginStyle; |
448 rndFind.m_wsCondition = wsOriginCondition; | 443 rndFind.m_wsCondition = wsOriginCondition; |
449 if (rndFind.m_Nodes.GetSize() > 0) { | 444 if (rndFind.m_Nodes.GetSize() > 0) { |
450 nodes.Append(rndFind.m_Nodes); | 445 nodes.Append(rndFind.m_Nodes); |
451 rndFind.m_Nodes.RemoveAll(); | 446 rndFind.m_Nodes.RemoveAll(); |
452 } | 447 } |
453 } | 448 } |
454 child = child->GetNodeItem(XFA_NODEITEM_NextSibling); | 449 child = child->GetNodeItem(XFA_NODEITEM_NextSibling); |
455 } | 450 } |
456 if (nodes.GetSize() > nNum) { | 451 if (nodes.GetSize() > nNum) { |
457 if (m_pNodeHelper->XFA_NodeIsTransparent(parentNode)) { | 452 if (m_pNodeHelper->NodeIsTransparent(parentNode)) { |
458 CXFA_NodeArray upArrayNodes; | 453 CXFA_NodeArray upArrayNodes; |
459 m_pNodeHelper->XFA_CountSiblings( | 454 m_pNodeHelper->CountSiblings(ToNode(nodes[0]), XFA_LOGIC_Transparent, |
460 ToNode(nodes[0]), XFA_LOGIC_Transparent, &upArrayNodes, | 455 &upArrayNodes, |
461 !!(dwStyles & XFA_RESOLVENODE_TagName)); | 456 !!(dwStyles & XFA_RESOLVENODE_TagName)); |
462 if (upArrayNodes.GetSize() > nodes.GetSize()) { | 457 if (upArrayNodes.GetSize() > nodes.GetSize()) { |
463 upArrayNodes[0] = ToNode(nodes[0]); | 458 upArrayNodes[0] = ToNode(nodes[0]); |
464 nodes.RemoveAll(); | 459 nodes.RemoveAll(); |
465 nodes.Append((CXFA_ObjArray&)upArrayNodes); | 460 nodes.Append((CXFA_ObjArray&)upArrayNodes); |
466 upArrayNodes.RemoveAll(); | 461 upArrayNodes.RemoveAll(); |
467 } | 462 } |
468 } | 463 } |
469 XFA_ResolveNode_FilterCondition(rnd, wsCondition); | 464 FilterCondition(rnd, wsCondition); |
470 if (nodes.GetSize() > 0) { | 465 if (nodes.GetSize() > 0) { |
471 return 1; | 466 return 1; |
472 } | 467 } |
473 return 0; | 468 return 0; |
474 } | 469 } |
475 } | 470 } |
476 if (dwStyles & XFA_RESOLVENODE_Parent) { | 471 if (dwStyles & XFA_RESOLVENODE_Parent) { |
477 uint32_t dwSubStyles = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent | | 472 uint32_t dwSubStyles = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent | |
478 XFA_RESOLVENODE_Properties; | 473 XFA_RESOLVENODE_Properties; |
479 if (dwStyles & XFA_RESOLVENODE_TagName) { | 474 if (dwStyles & XFA_RESOLVENODE_TagName) { |
480 dwSubStyles |= XFA_RESOLVENODE_TagName; | 475 dwSubStyles |= XFA_RESOLVENODE_TagName; |
481 } | 476 } |
482 if (dwStyles & XFA_RESOLVENODE_ALL) { | 477 if (dwStyles & XFA_RESOLVENODE_ALL) { |
483 dwSubStyles |= XFA_RESOLVENODE_ALL; | 478 dwSubStyles |= XFA_RESOLVENODE_ALL; |
484 } | 479 } |
485 rndFind.m_dwStyles = dwSubStyles; | 480 rndFind.m_dwStyles = dwSubStyles; |
486 rndFind.m_CurNode = parentNode; | 481 rndFind.m_CurNode = parentNode; |
487 CXFA_NodeArray& array = rnd.m_pSC->GetUpObjectArray(); | 482 CXFA_NodeArray& array = rnd.m_pSC->GetUpObjectArray(); |
488 array.Add(parentNode); | 483 array.Add(parentNode); |
489 XFA_ResolveNodes_Normal(rndFind); | 484 ResolveNormal(rndFind); |
490 if (rndFind.m_Nodes.GetSize() > 0) { | 485 if (rndFind.m_Nodes.GetSize() > 0) { |
491 nodes.Append(rndFind.m_Nodes); | 486 nodes.Append(rndFind.m_Nodes); |
492 rndFind.m_Nodes.RemoveAll(); | 487 rndFind.m_Nodes.RemoveAll(); |
493 } | 488 } |
494 if (nodes.GetSize() > nNum) { | 489 if (nodes.GetSize() > nNum) { |
495 return 1; | 490 return 1; |
496 } | 491 } |
497 } | 492 } |
498 return 0; | 493 return 0; |
499 } | 494 } |
500 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_Asterisk( | 495 int32_t CXFA_ResolveProcessor::ResolveAsterisk(CXFA_ResolveNodesData& rnd) { |
501 CXFA_ResolveNodesData& rnd) { | |
502 CXFA_Node* curNode = ToNode(rnd.m_CurNode); | 496 CXFA_Node* curNode = ToNode(rnd.m_CurNode); |
503 CXFA_ObjArray& nodes = rnd.m_Nodes; | 497 CXFA_ObjArray& nodes = rnd.m_Nodes; |
504 CXFA_NodeArray array; | 498 CXFA_NodeArray array; |
505 curNode->GetNodeList(array, | 499 curNode->GetNodeList(array, |
506 XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties); | 500 XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties); |
507 nodes.Append((CXFA_ObjArray&)array); | 501 nodes.Append((CXFA_ObjArray&)array); |
508 return nodes.GetSize(); | 502 return nodes.GetSize(); |
509 } | 503 } |
510 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_PopStack( | 504 int32_t CXFA_ResolveProcessor::ResolvePopStack(CFX_Int32Array& stack) { |
511 CFX_Int32Array& stack) { | |
512 int32_t nType = -1; | 505 int32_t nType = -1; |
513 int32_t iSize = stack.GetSize() - 1; | 506 int32_t iSize = stack.GetSize() - 1; |
514 if (iSize > -1) { | 507 if (iSize > -1) { |
515 nType = stack[iSize]; | 508 nType = stack[iSize]; |
516 stack.RemoveAt(iSize, 1); | 509 stack.RemoveAt(iSize, 1); |
517 } | 510 } |
518 return nType; | 511 return nType; |
519 } | 512 } |
520 int32_t CXFA_ResolveProcessor::XFA_ResolveNodes_GetFilter( | 513 int32_t CXFA_ResolveProcessor::GetFilter(const CFX_WideStringC& wsExpression, |
521 const CFX_WideStringC& wsExpression, | 514 int32_t nStart, |
522 int32_t nStart, | 515 CXFA_ResolveNodesData& rnd) { |
523 CXFA_ResolveNodesData& rnd) { | |
524 ASSERT(nStart > -1); | 516 ASSERT(nStart > -1); |
525 int32_t iLength = wsExpression.GetLength(); | 517 int32_t iLength = wsExpression.GetLength(); |
526 if (nStart >= iLength) { | 518 if (nStart >= iLength) { |
527 return 0; | 519 return 0; |
528 } | 520 } |
529 CFX_WideString& wsName = rnd.m_wsName; | 521 CFX_WideString& wsName = rnd.m_wsName; |
530 CFX_WideString& wsCondition = rnd.m_wsCondition; | 522 CFX_WideString& wsCondition = rnd.m_wsCondition; |
531 FX_WCHAR* pNameBuf = wsName.GetBuffer(iLength - nStart); | 523 FX_WCHAR* pNameBuf = wsName.GetBuffer(iLength - nStart); |
532 FX_WCHAR* pConditionBuf = wsCondition.GetBuffer(iLength - nStart); | 524 FX_WCHAR* pConditionBuf = wsCondition.GetBuffer(iLength - nStart); |
533 int32_t nNameCount = 0; | 525 int32_t nNameCount = 0; |
(...skipping 29 matching lines...) Expand all Loading... |
563 } | 555 } |
564 if (bIsCondition) { | 556 if (bIsCondition) { |
565 pConditionBuf[nConditionCount++] = wCur; | 557 pConditionBuf[nConditionCount++] = wCur; |
566 } else { | 558 } else { |
567 pNameBuf[nNameCount++] = wCur; | 559 pNameBuf[nNameCount++] = wCur; |
568 } | 560 } |
569 FX_BOOL bRecursive = TRUE; | 561 FX_BOOL bRecursive = TRUE; |
570 switch (nType) { | 562 switch (nType) { |
571 case 0: | 563 case 0: |
572 if (wCur == ']') { | 564 if (wCur == ']') { |
573 nType = XFA_ResolveNodes_PopStack(stack); | 565 nType = ResolvePopStack(stack); |
574 bRecursive = FALSE; | 566 bRecursive = FALSE; |
575 } | 567 } |
576 break; | 568 break; |
577 case 1: | 569 case 1: |
578 if (wCur == ')') { | 570 if (wCur == ')') { |
579 nType = XFA_ResolveNodes_PopStack(stack); | 571 nType = ResolvePopStack(stack); |
580 bRecursive = FALSE; | 572 bRecursive = FALSE; |
581 } | 573 } |
582 break; | 574 break; |
583 case 2: | 575 case 2: |
584 if (wCur == '"') { | 576 if (wCur == '"') { |
585 nType = XFA_ResolveNodes_PopStack(stack); | 577 nType = ResolvePopStack(stack); |
586 bRecursive = FALSE; | 578 bRecursive = FALSE; |
587 } | 579 } |
588 break; | 580 break; |
589 } | 581 } |
590 if (bRecursive) { | 582 if (bRecursive) { |
591 switch (wCur) { | 583 switch (wCur) { |
592 case '[': | 584 case '[': |
593 stack.Add(nType); | 585 stack.Add(nType); |
594 nType = 0; | 586 nType = 0; |
595 break; | 587 break; |
(...skipping 15 matching lines...) Expand all Loading... |
611 wsName.ReleaseBuffer(nNameCount); | 603 wsName.ReleaseBuffer(nNameCount); |
612 wsName.TrimLeft(); | 604 wsName.TrimLeft(); |
613 wsName.TrimRight(); | 605 wsName.TrimRight(); |
614 wsCondition.ReleaseBuffer(nConditionCount); | 606 wsCondition.ReleaseBuffer(nConditionCount); |
615 wsCondition.TrimLeft(); | 607 wsCondition.TrimLeft(); |
616 wsCondition.TrimRight(); | 608 wsCondition.TrimRight(); |
617 rnd.m_uHashName = | 609 rnd.m_uHashName = |
618 static_cast<XFA_HashCode>(FX_HashCode_GetW(wsName.AsStringC(), false)); | 610 static_cast<XFA_HashCode>(FX_HashCode_GetW(wsName.AsStringC(), false)); |
619 return nStart; | 611 return nStart; |
620 } | 612 } |
621 void CXFA_ResolveProcessor::XFA_ResolveNode_ConditionArray( | 613 void CXFA_ResolveProcessor::ConditionArray(int32_t iCurIndex, |
622 int32_t iCurIndex, | 614 CFX_WideString wsCondition, |
623 CFX_WideString wsCondition, | 615 int32_t iFoundCount, |
624 int32_t iFoundCount, | 616 CXFA_ResolveNodesData& rnd) { |
625 CXFA_ResolveNodesData& rnd) { | |
626 CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes; | 617 CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes; |
627 int32_t iLen = wsCondition.GetLength(); | 618 int32_t iLen = wsCondition.GetLength(); |
628 FX_BOOL bRelative = FALSE; | 619 FX_BOOL bRelative = FALSE; |
629 FX_BOOL bAll = FALSE; | 620 FX_BOOL bAll = FALSE; |
630 int32_t i = 1; | 621 int32_t i = 1; |
631 for (; i < iLen; ++i) { | 622 for (; i < iLen; ++i) { |
632 FX_WCHAR ch = wsCondition[i]; | 623 FX_WCHAR ch = wsCondition[i]; |
633 if (ch == ' ') { | 624 if (ch == ' ') { |
634 continue; | 625 continue; |
635 } | 626 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurNode); | 669 m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurNode); |
679 m_pNodeHelper->m_iCreateCount = iIndex - iFoundCount + 1; | 670 m_pNodeHelper->m_iCreateCount = iIndex - iFoundCount + 1; |
680 } | 671 } |
681 findNodes.RemoveAll(); | 672 findNodes.RemoveAll(); |
682 } else { | 673 } else { |
683 CXFA_Node* ret = findNodes[iIndex]; | 674 CXFA_Node* ret = findNodes[iIndex]; |
684 findNodes.RemoveAll(); | 675 findNodes.RemoveAll(); |
685 findNodes.Add(ret); | 676 findNodes.Add(ret); |
686 } | 677 } |
687 } | 678 } |
688 void CXFA_ResolveProcessor::XFA_ResolveNode_DoPredicateFilter( | 679 void CXFA_ResolveProcessor::DoPredicateFilter(int32_t iCurIndex, |
689 int32_t iCurIndex, | 680 CFX_WideString wsCondition, |
690 CFX_WideString wsCondition, | 681 int32_t iFoundCount, |
691 int32_t iFoundCount, | 682 CXFA_ResolveNodesData& rnd) { |
692 CXFA_ResolveNodesData& rnd) { | |
693 CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes; | 683 CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes; |
694 ASSERT(iFoundCount == findNodes.GetSize()); | 684 ASSERT(iFoundCount == findNodes.GetSize()); |
695 CFX_WideString wsExpression; | 685 CFX_WideString wsExpression; |
696 XFA_SCRIPTLANGTYPE eLangType = XFA_SCRIPTLANGTYPE_Unkown; | 686 XFA_SCRIPTLANGTYPE eLangType = XFA_SCRIPTLANGTYPE_Unkown; |
697 if (wsCondition.Left(2) == FX_WSTRC(L".[") && | 687 if (wsCondition.Left(2) == FX_WSTRC(L".[") && |
698 wsCondition.Right(1) == FX_WSTRC(L"]")) { | 688 wsCondition.Right(1) == FX_WSTRC(L"]")) { |
699 eLangType = XFA_SCRIPTLANGTYPE_Formcalc; | 689 eLangType = XFA_SCRIPTLANGTYPE_Formcalc; |
700 } else if (wsCondition.Left(2) == FX_WSTRC(L".(") && | 690 } else if (wsCondition.Left(2) == FX_WSTRC(L".(") && |
701 wsCondition.Right(1) == FX_WSTRC(L")")) { | 691 wsCondition.Right(1) == FX_WSTRC(L")")) { |
702 eLangType = XFA_SCRIPTLANGTYPE_Javascript; | 692 eLangType = XFA_SCRIPTLANGTYPE_Javascript; |
703 } else { | 693 } else { |
704 return; | 694 return; |
705 } | 695 } |
706 | 696 |
707 CXFA_ScriptContext* pContext = rnd.m_pSC; | 697 CXFA_ScriptContext* pContext = rnd.m_pSC; |
708 wsExpression = wsCondition.Mid(2, wsCondition.GetLength() - 3); | 698 wsExpression = wsCondition.Mid(2, wsCondition.GetLength() - 3); |
709 for (int32_t i = iFoundCount - 1; i >= 0; i--) { | 699 for (int32_t i = iFoundCount - 1; i >= 0; i--) { |
710 CXFA_Object* node = findNodes[i]; | 700 CXFA_Object* node = findNodes[i]; |
711 FX_BOOL bRet = FALSE; | 701 FX_BOOL bRet = FALSE; |
712 std::unique_ptr<CFXJSE_Value> pRetValue( | 702 std::unique_ptr<CFXJSE_Value> pRetValue( |
713 new CFXJSE_Value(rnd.m_pSC->GetRuntime())); | 703 new CFXJSE_Value(rnd.m_pSC->GetRuntime())); |
714 bRet = pContext->RunScript(eLangType, wsExpression.AsStringC(), | 704 bRet = pContext->RunScript(eLangType, wsExpression.AsStringC(), |
715 pRetValue.get(), node); | 705 pRetValue.get(), node); |
716 if (!bRet || !pRetValue->ToBoolean()) | 706 if (!bRet || !pRetValue->ToBoolean()) |
717 findNodes.RemoveAt(i); | 707 findNodes.RemoveAt(i); |
718 } | 708 } |
719 } | 709 } |
720 | 710 |
721 void CXFA_ResolveProcessor::XFA_ResolveNode_FilterCondition( | 711 void CXFA_ResolveProcessor::FilterCondition(CXFA_ResolveNodesData& rnd, |
722 CXFA_ResolveNodesData& rnd, | 712 CFX_WideString wsCondition) { |
723 CFX_WideString wsCondition) { | |
724 CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes; | 713 CXFA_NodeArray& findNodes = (CXFA_NodeArray&)rnd.m_Nodes; |
725 int32_t iCurrIndex = 0; | 714 int32_t iCurrIndex = 0; |
726 const CXFA_NodeArray& array = rnd.m_pSC->GetUpObjectArray(); | 715 const CXFA_NodeArray& array = rnd.m_pSC->GetUpObjectArray(); |
727 int32_t iSize = array.GetSize(); | 716 int32_t iSize = array.GetSize(); |
728 if (iSize) { | 717 if (iSize) { |
729 CXFA_Node* curNode = array[iSize - 1]; | 718 CXFA_Node* curNode = array[iSize - 1]; |
730 FX_BOOL bIsProperty = m_pNodeHelper->XFA_NodeIsProperty(curNode); | 719 FX_BOOL bIsProperty = m_pNodeHelper->NodeIsProperty(curNode); |
731 if (curNode->IsUnnamed() || | 720 if (curNode->IsUnnamed() || |
732 (bIsProperty && curNode->GetElementType() != XFA_Element::PageSet)) { | 721 (bIsProperty && curNode->GetElementType() != XFA_Element::PageSet)) { |
733 iCurrIndex = m_pNodeHelper->XFA_GetIndex(curNode, XFA_LOGIC_Transparent, | 722 iCurrIndex = m_pNodeHelper->GetIndex(curNode, XFA_LOGIC_Transparent, |
734 bIsProperty, TRUE); | 723 bIsProperty, TRUE); |
735 } else { | 724 } else { |
736 iCurrIndex = m_pNodeHelper->XFA_GetIndex(curNode, XFA_LOGIC_Transparent, | 725 iCurrIndex = m_pNodeHelper->GetIndex(curNode, XFA_LOGIC_Transparent, |
737 bIsProperty, FALSE); | 726 bIsProperty, FALSE); |
738 } | 727 } |
739 } | 728 } |
740 int32_t iFoundCount = findNodes.GetSize(); | 729 int32_t iFoundCount = findNodes.GetSize(); |
741 wsCondition.TrimLeft(); | 730 wsCondition.TrimLeft(); |
742 wsCondition.TrimRight(); | 731 wsCondition.TrimRight(); |
743 int32_t iLen = wsCondition.GetLength(); | 732 int32_t iLen = wsCondition.GetLength(); |
744 if (!iLen) { | 733 if (!iLen) { |
745 if (rnd.m_dwStyles & XFA_RESOLVENODE_ALL) { | 734 if (rnd.m_dwStyles & XFA_RESOLVENODE_ALL) { |
746 return; | 735 return; |
747 } | 736 } |
(...skipping 10 matching lines...) Expand all Loading... |
758 } else { | 747 } else { |
759 CXFA_Node* ret = findNodes[iCurrIndex]; | 748 CXFA_Node* ret = findNodes[iCurrIndex]; |
760 findNodes.RemoveAll(); | 749 findNodes.RemoveAll(); |
761 findNodes.Add(ret); | 750 findNodes.Add(ret); |
762 return; | 751 return; |
763 } | 752 } |
764 } | 753 } |
765 FX_WCHAR wTypeChar = wsCondition[0]; | 754 FX_WCHAR wTypeChar = wsCondition[0]; |
766 switch (wTypeChar) { | 755 switch (wTypeChar) { |
767 case '[': | 756 case '[': |
768 XFA_ResolveNode_ConditionArray(iCurrIndex, wsCondition, iFoundCount, rnd); | 757 ConditionArray(iCurrIndex, wsCondition, iFoundCount, rnd); |
769 return; | 758 return; |
770 case '(': | 759 case '(': |
771 return; | 760 return; |
772 case '"': | 761 case '"': |
773 return; | 762 return; |
774 case '.': | 763 case '.': |
775 if (iLen > 1 && (wsCondition[1] == '[' || wsCondition[1] == '(')) { | 764 if (iLen > 1 && (wsCondition[1] == '[' || wsCondition[1] == '(')) { |
776 XFA_ResolveNode_DoPredicateFilter(iCurrIndex, wsCondition, iFoundCount, | 765 DoPredicateFilter(iCurrIndex, wsCondition, iFoundCount, rnd); |
777 rnd); | |
778 } | 766 } |
779 default: | 767 default: |
780 return; | 768 return; |
781 } | 769 } |
782 } | 770 } |
783 void CXFA_ResolveProcessor::XFA_ResolveNodes_SetStylesForChild( | 771 void CXFA_ResolveProcessor::SetStylesForChild(uint32_t dwParentStyles, |
784 uint32_t dwParentStyles, | 772 CXFA_ResolveNodesData& rnd) { |
785 CXFA_ResolveNodesData& rnd) { | |
786 uint32_t dwSubStyles = XFA_RESOLVENODE_Children; | 773 uint32_t dwSubStyles = XFA_RESOLVENODE_Children; |
787 if (dwParentStyles & XFA_RESOLVENODE_TagName) { | 774 if (dwParentStyles & XFA_RESOLVENODE_TagName) { |
788 dwSubStyles |= XFA_RESOLVENODE_TagName; | 775 dwSubStyles |= XFA_RESOLVENODE_TagName; |
789 } | 776 } |
790 dwSubStyles &= ~XFA_RESOLVENODE_Parent; | 777 dwSubStyles &= ~XFA_RESOLVENODE_Parent; |
791 dwSubStyles &= ~XFA_RESOLVENODE_Siblings; | 778 dwSubStyles &= ~XFA_RESOLVENODE_Siblings; |
792 dwSubStyles &= ~XFA_RESOLVENODE_Properties; | 779 dwSubStyles &= ~XFA_RESOLVENODE_Properties; |
793 dwSubStyles |= XFA_RESOLVENODE_ALL; | 780 dwSubStyles |= XFA_RESOLVENODE_ALL; |
794 rnd.m_dwStyles = dwSubStyles; | 781 rnd.m_dwStyles = dwSubStyles; |
795 } | 782 } |
796 int32_t CXFA_ResolveProcessor::XFA_ResolveNode_SetResultCreateNode( | 783 int32_t CXFA_ResolveProcessor::SetResultCreateNode( |
797 XFA_RESOLVENODE_RS& resolveNodeRS, | 784 XFA_RESOLVENODE_RS& resolveNodeRS, |
798 CFX_WideString& wsLastCondition) { | 785 CFX_WideString& wsLastCondition) { |
799 if (m_pNodeHelper->m_pCreateParent) { | 786 if (m_pNodeHelper->m_pCreateParent) { |
800 resolveNodeRS.nodes.Add(m_pNodeHelper->m_pCreateParent); | 787 resolveNodeRS.nodes.Add(m_pNodeHelper->m_pCreateParent); |
801 } else { | 788 } else { |
802 m_pNodeHelper->XFA_CreateNode_ForCondition(wsLastCondition); | 789 m_pNodeHelper->CreateNode_ForCondition(wsLastCondition); |
803 } | 790 } |
804 resolveNodeRS.dwFlags = m_pNodeHelper->m_iCreateFlag; | 791 resolveNodeRS.dwFlags = m_pNodeHelper->m_iCreateFlag; |
805 if (resolveNodeRS.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) { | 792 if (resolveNodeRS.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeOne) { |
806 if (m_pNodeHelper->m_iCurAllStart != -1) { | 793 if (m_pNodeHelper->m_iCurAllStart != -1) { |
807 resolveNodeRS.dwFlags = XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll; | 794 resolveNodeRS.dwFlags = XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll; |
808 } | 795 } |
809 } | 796 } |
810 return resolveNodeRS.nodes.GetSize(); | 797 return resolveNodeRS.nodes.GetSize(); |
811 } | 798 } |
812 void CXFA_ResolveProcessor::XFA_ResolveNode_SetIndexDataBind( | 799 void CXFA_ResolveProcessor::SetIndexDataBind(CFX_WideString& wsNextCondition, |
813 CFX_WideString& wsNextCondition, | 800 int32_t& iIndex, |
814 int32_t& iIndex, | 801 int32_t iCount) { |
815 int32_t iCount) { | 802 if (m_pNodeHelper->CreateNode_ForCondition(wsNextCondition)) { |
816 if (m_pNodeHelper->XFA_CreateNode_ForCondition(wsNextCondition)) { | |
817 if (m_pNodeHelper->m_eLastCreateType == XFA_Element::DataGroup) { | 803 if (m_pNodeHelper->m_eLastCreateType == XFA_Element::DataGroup) { |
818 iIndex = 0; | 804 iIndex = 0; |
819 } else { | 805 } else { |
820 iIndex = iCount - 1; | 806 iIndex = iCount - 1; |
821 } | 807 } |
822 } else { | 808 } else { |
823 iIndex = iCount - 1; | 809 iIndex = iCount - 1; |
824 } | 810 } |
825 } | 811 } |
826 | 812 |
827 CXFA_ResolveNodesData::CXFA_ResolveNodesData(CXFA_ScriptContext* pSC) | 813 CXFA_ResolveNodesData::CXFA_ResolveNodesData(CXFA_ScriptContext* pSC) |
828 : m_pSC(pSC), | 814 : m_pSC(pSC), |
829 m_CurNode(nullptr), | 815 m_CurNode(nullptr), |
830 m_wsName(), | 816 m_wsName(), |
831 m_uHashName(XFA_HASHCODE_None), | 817 m_uHashName(XFA_HASHCODE_None), |
832 m_wsCondition(), | 818 m_wsCondition(), |
833 m_nLevel(0), | 819 m_nLevel(0), |
834 m_Nodes(), | 820 m_Nodes(), |
835 m_dwStyles(XFA_RESOLVENODE_Children), | 821 m_dwStyles(XFA_RESOLVENODE_Children), |
836 m_pScriptAttribute(nullptr), | 822 m_pScriptAttribute(nullptr), |
837 m_dwFlag(XFA_RESOVENODE_RSTYPE_Nodes) {} | 823 m_dwFlag(XFA_RESOVENODE_RSTYPE_Nodes) {} |
838 | 824 |
839 CXFA_ResolveNodesData::~CXFA_ResolveNodesData() { | 825 CXFA_ResolveNodesData::~CXFA_ResolveNodesData() { |
840 m_Nodes.RemoveAll(); | 826 m_Nodes.RemoveAll(); |
841 } | 827 } |
OLD | NEW |