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_FXFA_PARSER_XFA_OBJECT_H_ 8 #define XFA_FXFA_PARSER_XFA_OBJECT_H_ 9 10 #include <map> 11 #include <unordered_set> 12 13 #include "fxjs/cfxjse_arguments.h" 14 #include "xfa/fde/xml/fde_xml.h" 15 #include "xfa/fxfa/parser/xfa_utils.h" 16 17 class CXFA_Document; 18 class CXFA_Node; 19 class CXFA_NodeList; 20 21 enum class XFA_ObjectType { 22 Object, 23 List, 24 NodeList, 25 Node, 26 NodeC, 27 NodeV, 28 ModelNode, 29 TextNode, 30 ContainerNode, 31 ContentNode, 32 VariablesThis 33 }; 34 35 enum XFA_NodeFlag { 36 XFA_NodeFlag_None = 0, 37 XFA_NodeFlag_Initialized = 1 << 0, 38 XFA_NodeFlag_HasRemovedChildren = 1 << 1, 39 XFA_NodeFlag_NeedsInitApp = 1 << 2, 40 XFA_NodeFlag_BindFormItems = 1 << 3, 41 XFA_NodeFlag_UserInteractive = 1 << 4, 42 XFA_NodeFlag_SkipDataBinding = 1 << 5, 43 XFA_NodeFlag_OwnXMLNode = 1 << 6, 44 XFA_NodeFlag_UnusedNode = 1 << 7, 45 XFA_NodeFlag_LayoutGeneratedNode = 1 << 8 46 }; 47 48 class CXFA_Object : public CFXJSE_HostObject { 49 public: 50 CXFA_Object(CXFA_Document* pDocument, 51 XFA_ObjectType objectType, 52 XFA_Element eType, 53 const CFX_WideStringC& elementName); 54 ~CXFA_Object() override; 55 56 CXFA_Document* GetDocument() const { return m_pDocument; } 57 XFA_ObjectType GetObjectType() const { return m_objectType; } 58 59 bool IsNode() const { 60 return m_objectType == XFA_ObjectType::Node || 61 m_objectType == XFA_ObjectType::NodeC || 62 m_objectType == XFA_ObjectType::NodeV || 63 m_objectType == XFA_ObjectType::ModelNode || 64 m_objectType == XFA_ObjectType::TextNode || 65 m_objectType == XFA_ObjectType::ContainerNode || 66 m_objectType == XFA_ObjectType::ContentNode || 67 m_objectType == XFA_ObjectType::VariablesThis; 68 } 69 bool IsNodeList() const { return m_objectType == XFA_ObjectType::NodeList; } 70 bool IsContentNode() const { 71 return m_objectType == XFA_ObjectType::ContentNode; 72 } 73 bool IsContainerNode() const { 74 return m_objectType == XFA_ObjectType::ContainerNode; 75 } 76 bool IsModelNode() const { return m_objectType == XFA_ObjectType::ModelNode; } 77 bool IsNodeV() const { return m_objectType == XFA_ObjectType::NodeV; } 78 bool IsVariablesThis() const { 79 return m_objectType == XFA_ObjectType::VariablesThis; 80 } 81 82 CXFA_Node* AsNode(); 83 CXFA_NodeList* AsNodeList(); 84 85 const CXFA_Node* AsNode() const; 86 const CXFA_NodeList* AsNodeList() const; 87 88 XFA_Element GetElementType() const; 89 CFX_WideStringC GetClassName() const; 90 uint32_t GetClassHashCode() const; 91 void Script_ObjectClass_ClassName(CFXJSE_Value* pValue, 92 bool bSetting, 93 XFA_ATTRIBUTE eAttribute); 94 95 void ThrowInvalidPropertyException() const; 96 void ThrowArgumentMismatchException() const; 97 void ThrowIndexOutOfBoundsException() const; 98 void ThrowParamCountMismatchException(const CFX_WideString& method) const; 99 100 protected: 101 void ThrowException(const FX_WCHAR* str, ...) const; 102 103 CXFA_Document* const m_pDocument; 104 const XFA_ObjectType m_objectType; 105 const XFA_Element m_elementType; 106 107 const uint32_t m_elementNameHash; 108 const CFX_WideStringC m_elementName; 109 }; 110 using CXFA_ObjArray = CFX_ArrayTemplate<CXFA_Object*>; 111 112 #define XFA_NODEFILTER_Children 0x01 113 #define XFA_NODEFILTER_Properties 0x02 114 #define XFA_NODEFILTER_OneOfProperty 0x04 115 #define XFA_CLONEFLAG_Content 0x01 116 enum XFA_NODEITEM { 117 XFA_NODEITEM_Parent, 118 XFA_NODEITEM_FirstChild, 119 XFA_NODEITEM_NextSibling, 120 XFA_NODEITEM_PrevSibling, 121 }; 122 enum XFA_SOM_MESSAGETYPE { 123 XFA_SOM_ValidationMessage, 124 XFA_SOM_FormatMessage, 125 XFA_SOM_MandatoryMessage 126 }; 127 128 using CXFA_NodeArray = CFX_ArrayTemplate<CXFA_Node*>; 129 using CXFA_NodeStack = CFX_StackTemplate<CXFA_Node*>; 130 using CXFA_NodeSet = std::unordered_set<CXFA_Node*>; 131 132 typedef void (*PD_CALLBACK_FREEDATA)(void* pData); 133 typedef void (*PD_CALLBACK_DUPLICATEDATA)(void*& pData); 134 135 struct XFA_MAPDATABLOCKCALLBACKINFO { 136 PD_CALLBACK_FREEDATA pFree; 137 PD_CALLBACK_DUPLICATEDATA pCopy; 138 }; 139 140 struct XFA_MAPDATABLOCK { 141 uint8_t* GetData() const { return (uint8_t*)this + sizeof(XFA_MAPDATABLOCK); } 142 XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo; 143 int32_t iBytes; 144 }; 145 146 struct XFA_MAPMODULEDATA { 147 XFA_MAPMODULEDATA(); 148 ~XFA_MAPMODULEDATA(); 149 150 std::map<void*, void*> m_ValueMap; 151 std::map<void*, XFA_MAPDATABLOCK*> m_BufferMap; 152 }; 153 154 #define XFA_CalcRefCount (void*)(uintptr_t) FXBSTR_ID('X', 'F', 'A', 'R') 155 #define XFA_CalcData (void*)(uintptr_t) FXBSTR_ID('X', 'F', 'A', 'C') 156 #define XFA_LAYOUTITEMKEY (void*)(uintptr_t) FXBSTR_ID('L', 'Y', 'I', 'M') 157 158 class CXFA_Node : public CXFA_Object { 159 public: 160 uint32_t GetPacketID() const { return m_ePacket; } 161 162 void SetFlag(uint32_t dwFlag, bool bNotify); 163 void ClearFlag(uint32_t dwFlag); 164 165 bool IsInitialized() const { return HasFlag(XFA_NodeFlag_Initialized); } 166 bool IsOwnXMLNode() const { return HasFlag(XFA_NodeFlag_OwnXMLNode); } 167 bool IsUserInteractive() const { 168 return HasFlag(XFA_NodeFlag_UserInteractive); 169 } 170 bool IsUnusedNode() const { return HasFlag(XFA_NodeFlag_UnusedNode); } 171 bool IsLayoutGeneratedNode() const { 172 return HasFlag(XFA_NodeFlag_LayoutGeneratedNode); 173 } 174 bool BindsFormItems() const { return HasFlag(XFA_NodeFlag_BindFormItems); } 175 bool HasRemovedChildren() const { 176 return HasFlag(XFA_NodeFlag_HasRemovedChildren); 177 } 178 bool NeedsInitApp() const { return HasFlag(XFA_NodeFlag_NeedsInitApp); } 179 180 bool IsAttributeInXML(); 181 bool IsFormContainer() const { 182 return m_ePacket == XFA_XDPPACKET_Form && IsContainerNode(); 183 } 184 void SetXMLMappingNode(CFDE_XMLNode* pXMLNode) { m_pXMLNode = pXMLNode; } 185 CFDE_XMLNode* GetXMLMappingNode() const { return m_pXMLNode; } 186 CFDE_XMLNode* CreateXMLMappingNode(); 187 bool IsNeedSavingXMLNode(); 188 uint32_t GetNameHash() const { return m_dwNameHash; } 189 bool IsUnnamed() const { return m_dwNameHash == 0; } 190 CXFA_Node* GetModelNode(); 191 void UpdateNameHash(); 192 bool HasAttribute(XFA_ATTRIBUTE eAttr, bool bCanInherit = false); 193 bool SetAttribute(XFA_ATTRIBUTE eAttr, 194 const CFX_WideStringC& wsValue, 195 bool bNotify = false); 196 bool GetAttribute(XFA_ATTRIBUTE eAttr, 197 CFX_WideString& wsValue, 198 bool bUseDefault = true); 199 bool SetAttribute(const CFX_WideStringC& wsAttr, 200 const CFX_WideStringC& wsValue, 201 bool bNotify = false); 202 bool GetAttribute(const CFX_WideStringC& wsAttr, 203 CFX_WideString& wsValue, 204 bool bUseDefault = true); 205 bool RemoveAttribute(const CFX_WideStringC& wsAttr); 206 bool SetContent(const CFX_WideString& wsContent, 207 const CFX_WideString& wsXMLValue, 208 bool bNotify = false, 209 bool bScriptModify = false, 210 bool bSyncData = true); 211 bool TryContent(CFX_WideString& wsContent, 212 bool bScriptModify = false, 213 bool bProto = true); 214 CFX_WideString GetContent(); 215 216 bool TryNamespace(CFX_WideString& wsNamespace); 217 218 bool SetBoolean(XFA_ATTRIBUTE eAttr, bool bValue, bool bNotify = false) { 219 return SetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, (void*)(uintptr_t)bValue, 220 bNotify); 221 } 222 bool TryBoolean(XFA_ATTRIBUTE eAttr, bool& bValue, bool bUseDefault = true); 223 bool GetBoolean(XFA_ATTRIBUTE eAttr) { 224 bool bValue; 225 return TryBoolean(eAttr, bValue, true) ? bValue : false; 226 } 227 bool SetInteger(XFA_ATTRIBUTE eAttr, int32_t iValue, bool bNotify = false) { 228 return SetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, (void*)(uintptr_t)iValue, 229 bNotify); 230 } 231 bool TryInteger(XFA_ATTRIBUTE eAttr, 232 int32_t& iValue, 233 bool bUseDefault = true); 234 int32_t GetInteger(XFA_ATTRIBUTE eAttr) { 235 int32_t iValue; 236 return TryInteger(eAttr, iValue, true) ? iValue : 0; 237 } 238 bool SetEnum(XFA_ATTRIBUTE eAttr, 239 XFA_ATTRIBUTEENUM eValue, 240 bool bNotify = false) { 241 return SetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, (void*)(uintptr_t)eValue, 242 bNotify); 243 } 244 bool TryEnum(XFA_ATTRIBUTE eAttr, 245 XFA_ATTRIBUTEENUM& eValue, 246 bool bUseDefault = true); 247 XFA_ATTRIBUTEENUM GetEnum(XFA_ATTRIBUTE eAttr) { 248 XFA_ATTRIBUTEENUM eValue; 249 return TryEnum(eAttr, eValue, true) ? eValue : XFA_ATTRIBUTEENUM_Unknown; 250 } 251 bool SetCData(XFA_ATTRIBUTE eAttr, 252 const CFX_WideString& wsValue, 253 bool bNotify = false, 254 bool bScriptModify = false); 255 bool SetAttributeValue(const CFX_WideString& wsValue, 256 const CFX_WideString& wsXMLValue, 257 bool bNotify = false, 258 bool bScriptModify = false); 259 bool TryCData(XFA_ATTRIBUTE eAttr, 260 CFX_WideString& wsValue, 261 bool bUseDefault = true, 262 bool bProto = true); 263 bool TryCData(XFA_ATTRIBUTE eAttr, 264 CFX_WideStringC& wsValue, 265 bool bUseDefault = true, 266 bool bProto = true); 267 CFX_WideStringC GetCData(XFA_ATTRIBUTE eAttr) { 268 CFX_WideStringC wsValue; 269 return TryCData(eAttr, wsValue) ? wsValue : CFX_WideStringC(); 270 } 271 bool SetMeasure(XFA_ATTRIBUTE eAttr, 272 CXFA_Measurement mValue, 273 bool bNotify = false); 274 bool TryMeasure(XFA_ATTRIBUTE eAttr, 275 CXFA_Measurement& mValue, 276 bool bUseDefault = true) const; 277 CXFA_Measurement GetMeasure(XFA_ATTRIBUTE eAttr) const; 278 bool SetObject(XFA_ATTRIBUTE eAttr, 279 void* pData, 280 XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = nullptr); 281 bool TryObject(XFA_ATTRIBUTE eAttr, void*& pData); 282 void* GetObject(XFA_ATTRIBUTE eAttr) { 283 void* pData; 284 return TryObject(eAttr, pData) ? pData : nullptr; 285 } 286 bool SetUserData(void* pKey, 287 void* pData, 288 XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = nullptr); 289 bool TryUserData(void* pKey, void*& pData, bool bProtoAlso = false); 290 void* GetUserData(void* pKey, bool bProtoAlso = false) { 291 void* pData; 292 return TryUserData(pKey, pData, bProtoAlso) ? pData : nullptr; 293 } 294 CXFA_Node* GetProperty(int32_t index, 295 XFA_Element eType, 296 bool bCreateProperty = true); 297 int32_t CountChildren(XFA_Element eType, bool bOnlyChild = false); 298 CXFA_Node* GetChild(int32_t index, 299 XFA_Element eType, 300 bool bOnlyChild = false); 301 int32_t InsertChild(int32_t index, CXFA_Node* pNode); 302 bool InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode = nullptr); 303 bool RemoveChild(CXFA_Node* pNode, bool bNotify = true); 304 CXFA_Node* Clone(bool bRecursive); 305 CXFA_Node* GetNodeItem(XFA_NODEITEM eItem) const; 306 CXFA_Node* GetNodeItem(XFA_NODEITEM eItem, XFA_ObjectType eType) const; 307 int32_t GetNodeList(CXFA_NodeArray& nodes, 308 uint32_t dwTypeFilter = XFA_NODEFILTER_Children | 309 XFA_NODEFILTER_Properties, 310 XFA_Element eTypeFilter = XFA_Element::Unknown, 311 int32_t iLevel = 1); 312 CXFA_Node* CreateSamePacketNode(XFA_Element eType, 313 uint32_t dwFlags = XFA_NodeFlag_Initialized); 314 CXFA_Node* CloneTemplateToForm(bool bRecursive); 315 CXFA_Node* GetTemplateNode() const; 316 void SetTemplateNode(CXFA_Node* pTemplateNode); 317 CXFA_Node* GetDataDescriptionNode(); 318 void SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode); 319 CXFA_Node* GetBindData(); 320 int32_t GetBindItems(CXFA_NodeArray& formItems); 321 int32_t AddBindItem(CXFA_Node* pFormNode); 322 int32_t RemoveBindItem(CXFA_Node* pFormNode); 323 bool HasBindItem(); 324 CXFA_WidgetData* GetWidgetData(); 325 CXFA_WidgetData* GetContainerWidgetData(); 326 bool GetLocaleName(CFX_WideString& wsLocaleName); 327 XFA_ATTRIBUTEENUM GetIntact(); 328 CXFA_Node* GetFirstChildByName(const CFX_WideStringC& wsNodeName) const; 329 CXFA_Node* GetFirstChildByName(uint32_t dwNodeNameHash) const; 330 CXFA_Node* GetFirstChildByClass(XFA_Element eType) const; 331 CXFA_Node* GetNextSameNameSibling(uint32_t dwNodeNameHash) const; 332 CXFA_Node* GetNextSameNameSibling(const CFX_WideStringC& wsNodeName) const; 333 CXFA_Node* GetNextSameClassSibling(XFA_Element eType) const; 334 int32_t GetNodeSameNameIndex() const; 335 int32_t GetNodeSameClassIndex() const; 336 void GetSOMExpression(CFX_WideString& wsSOMExpression); 337 CXFA_Node* GetInstanceMgrOfSubform(); 338 339 CXFA_Node* GetOccurNode(); 340 void Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments); 341 void Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments); 342 void Script_Som_ResolveNodeList(CFXJSE_Value* pValue, 343 CFX_WideString wsExpression, 344 uint32_t dwFlag, 345 CXFA_Node* refNode = nullptr); 346 void Script_TreeClass_All(CFXJSE_Value* pValue, 347 bool bSetting, 348 XFA_ATTRIBUTE eAttribute); 349 void Script_TreeClass_Nodes(CFXJSE_Value* pValue, 350 bool bSetting, 351 XFA_ATTRIBUTE eAttribute); 352 void Script_TreeClass_ClassAll(CFXJSE_Value* pValue, 353 bool bSetting, 354 XFA_ATTRIBUTE eAttribute); 355 void Script_TreeClass_Parent(CFXJSE_Value* pValue, 356 bool bSetting, 357 XFA_ATTRIBUTE eAttribute); 358 void Script_TreeClass_Index(CFXJSE_Value* pValue, 359 bool bSetting, 360 XFA_ATTRIBUTE eAttribute); 361 void Script_TreeClass_ClassIndex(CFXJSE_Value* pValue, 362 bool bSetting, 363 XFA_ATTRIBUTE eAttribute); 364 void Script_TreeClass_SomExpression(CFXJSE_Value* pValue, 365 bool bSetting, 366 XFA_ATTRIBUTE eAttribute); 367 void Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments); 368 void Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments); 369 void Script_NodeClass_Clone(CFXJSE_Arguments* pArguments); 370 void Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments); 371 void Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments); 372 void Script_NodeClass_IsPropertySpecified(CFXJSE_Arguments* pArguments); 373 void Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments); 374 void Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments); 375 void Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments); 376 void Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments); 377 void Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments); 378 void Script_NodeClass_Ns(CFXJSE_Value* pValue, 379 bool bSetting, 380 XFA_ATTRIBUTE eAttribute); 381 void Script_NodeClass_Model(CFXJSE_Value* pValue, 382 bool bSetting, 383 XFA_ATTRIBUTE eAttribute); 384 void Script_NodeClass_IsContainer(CFXJSE_Value* pValue, 385 bool bSetting, 386 XFA_ATTRIBUTE eAttribute); 387 void Script_NodeClass_IsNull(CFXJSE_Value* pValue, 388 bool bSetting, 389 XFA_ATTRIBUTE eAttribute); 390 void Script_NodeClass_OneOfChild(CFXJSE_Value* pValue, 391 bool bSetting, 392 XFA_ATTRIBUTE eAttribute); 393 void Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments); 394 void Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments); 395 void Script_ModelClass_ClearErrorList(CFXJSE_Arguments* pArguments); 396 void Script_ModelClass_CreateNode(CFXJSE_Arguments* pArguments); 397 void Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments); 398 void Script_ModelClass_Context(CFXJSE_Value* pValue, 399 bool bSetting, 400 XFA_ATTRIBUTE eAttribute); 401 void Script_ModelClass_AliasNode(CFXJSE_Value* pValue, 402 bool bSetting, 403 XFA_ATTRIBUTE eAttribute); 404 void Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments); 405 void Script_Delta_Restore(CFXJSE_Arguments* pArguments); 406 void Script_Delta_CurrentValue(CFXJSE_Value* pValue, 407 bool bSetting, 408 XFA_ATTRIBUTE eAttribute); 409 void Script_Delta_SavedValue(CFXJSE_Value* pValue, 410 bool bSetting, 411 XFA_ATTRIBUTE eAttribute); 412 void Script_Delta_Target(CFXJSE_Value* pValue, 413 bool bSetting, 414 XFA_ATTRIBUTE eAttribute); 415 void Script_Attribute_SendAttributeChangeMessage(XFA_ATTRIBUTE eAttribute, 416 bool bScriptModify); 417 void Script_Attribute_Integer(CFXJSE_Value* pValue, 418 bool bSetting, 419 XFA_ATTRIBUTE eAttribute); 420 void Script_Attribute_IntegerRead(CFXJSE_Value* pValue, 421 bool bSetting, 422 XFA_ATTRIBUTE eAttribute); 423 void Script_Attribute_BOOL(CFXJSE_Value* pValue, 424 bool bSetting, 425 XFA_ATTRIBUTE eAttribute); 426 void Script_Attribute_BOOLRead(CFXJSE_Value* pValue, 427 bool bSetting, 428 XFA_ATTRIBUTE eAttribute); 429 void Script_Attribute_String(CFXJSE_Value* pValue, 430 bool bSetting, 431 XFA_ATTRIBUTE eAttribute); 432 void Script_Attribute_StringRead(CFXJSE_Value* pValue, 433 bool bSetting, 434 XFA_ATTRIBUTE eAttribute); 435 void Script_Som_ValidationMessage(CFXJSE_Value* pValue, 436 bool bSetting, 437 XFA_ATTRIBUTE eAttribute); 438 void Script_Field_Length(CFXJSE_Value* pValue, 439 bool bSetting, 440 XFA_ATTRIBUTE eAttribute); 441 void Script_Som_DefaultValue(CFXJSE_Value* pValue, 442 bool bSetting, 443 XFA_ATTRIBUTE eAttribute); 444 void Script_Som_DefaultValue_Read(CFXJSE_Value* pValue, 445 bool bSetting, 446 XFA_ATTRIBUTE eAttribute); 447 void Script_Boolean_Value(CFXJSE_Value* pValue, 448 bool bSetting, 449 XFA_ATTRIBUTE eAttribute); 450 void Script_Som_Message(CFXJSE_Value* pValue, 451 bool bSetting, 452 XFA_SOM_MESSAGETYPE iMessageType); 453 void Script_Som_BorderColor(CFXJSE_Value* pValue, 454 bool bSetting, 455 XFA_ATTRIBUTE eAttribute); 456 void Script_Som_BorderWidth(CFXJSE_Value* pValue, 457 bool bSetting, 458 XFA_ATTRIBUTE eAttribute); 459 void Script_Som_FillColor(CFXJSE_Value* pValue, 460 bool bSetting, 461 XFA_ATTRIBUTE eAttribute); 462 void Script_Som_DataNode(CFXJSE_Value* pValue, 463 bool bSetting, 464 XFA_ATTRIBUTE eAttribute); 465 void Script_Som_FontColor(CFXJSE_Value* pValue, 466 bool bSetting, 467 XFA_ATTRIBUTE eAttribute); 468 void Script_Som_Mandatory(CFXJSE_Value* pValue, 469 bool bSetting, 470 XFA_ATTRIBUTE eAttribute); 471 void Script_Som_MandatoryMessage(CFXJSE_Value* pValue, 472 bool bSetting, 473 XFA_ATTRIBUTE eAttribute); 474 void Script_Som_InstanceIndex(CFXJSE_Value* pValue, 475 bool bSetting, 476 XFA_ATTRIBUTE eAttribute); 477 void Script_Draw_DefaultValue(CFXJSE_Value* pValue, 478 bool bSetting, 479 XFA_ATTRIBUTE eAttribute); 480 void Script_Field_DefaultValue(CFXJSE_Value* pValue, 481 bool bSetting, 482 XFA_ATTRIBUTE eAttribute); 483 void Script_Field_EditValue(CFXJSE_Value* pValue, 484 bool bSetting, 485 XFA_ATTRIBUTE eAttribute); 486 void Script_Field_FormatMessage(CFXJSE_Value* pValue, 487 bool bSetting, 488 XFA_ATTRIBUTE eAttribute); 489 void Script_Field_FormattedValue(CFXJSE_Value* pValue, 490 bool bSetting, 491 XFA_ATTRIBUTE eAttribute); 492 void Script_Field_ParentSubform(CFXJSE_Value* pValue, 493 bool bSetting, 494 XFA_ATTRIBUTE eAttribute); 495 void Script_Field_SelectedIndex(CFXJSE_Value* pValue, 496 bool bSetting, 497 XFA_ATTRIBUTE eAttribute); 498 void Script_Field_ClearItems(CFXJSE_Arguments* pArguments); 499 void Script_Field_ExecEvent(CFXJSE_Arguments* pArguments); 500 void Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments); 501 void Script_Field_DeleteItem(CFXJSE_Arguments* pArguments); 502 void Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments); 503 void Script_Field_BoundItem(CFXJSE_Arguments* pArguments); 504 void Script_Field_GetItemState(CFXJSE_Arguments* pArguments); 505 void Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments); 506 void Script_Field_SetItems(CFXJSE_Arguments* pArguments); 507 void Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments); 508 void Script_Field_SetItemState(CFXJSE_Arguments* pArguments); 509 void Script_Field_AddItem(CFXJSE_Arguments* pArguments); 510 void Script_Field_ExecValidate(CFXJSE_Arguments* pArguments); 511 void Script_ExclGroup_DefaultAndRawValue(CFXJSE_Value* pValue, 512 bool bSetting, 513 XFA_ATTRIBUTE eAttribute); 514 void Script_ExclGroup_ErrorText(CFXJSE_Value* pValue, 515 bool bSetting, 516 XFA_ATTRIBUTE eAttribute); 517 void Script_ExclGroup_Transient(CFXJSE_Value* pValue, 518 bool bSetting, 519 XFA_ATTRIBUTE eAttribute); 520 void Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments); 521 void Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments); 522 void Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments); 523 void Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments); 524 void Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments); 525 void Script_Subform_InstanceManager(CFXJSE_Value* pValue, 526 bool bSetting, 527 XFA_ATTRIBUTE eAttribute); 528 void Script_Subform_Locale(CFXJSE_Value* pValue, 529 bool bSetting, 530 XFA_ATTRIBUTE eAttribute); 531 void Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments); 532 void Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments); 533 void Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments); 534 void Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments); 535 void Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments); 536 537 int32_t Subform_and_SubformSet_InstanceIndex(); 538 void Script_Template_FormNodes(CFXJSE_Arguments* pArguments); 539 void Script_Template_Remerge(CFXJSE_Arguments* pArguments); 540 void Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments); 541 void Script_Template_CreateNode(CFXJSE_Arguments* pArguments); 542 void Script_Template_Recalculate(CFXJSE_Arguments* pArguments); 543 void Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments); 544 void Script_Template_ExecValidate(CFXJSE_Arguments* pArguments); 545 void Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments); 546 void Script_InstanceManager_Count(CFXJSE_Value* pValue, 547 bool bSetting, 548 XFA_ATTRIBUTE eAttribute); 549 void Script_InstanceManager_Max(CFXJSE_Value* pValue, 550 bool bSetting, 551 XFA_ATTRIBUTE eAttribute); 552 void Script_InstanceManager_Min(CFXJSE_Value* pValue, 553 bool bSetting, 554 XFA_ATTRIBUTE eAttribute); 555 void Script_InstanceManager_MoveInstance(CFXJSE_Arguments* pArguments); 556 void Script_InstanceManager_RemoveInstance(CFXJSE_Arguments* pArguments); 557 void Script_InstanceManager_SetInstances(CFXJSE_Arguments* pArguments); 558 void Script_InstanceManager_AddInstance(CFXJSE_Arguments* pArguments); 559 void Script_InstanceManager_InsertInstance(CFXJSE_Arguments* pArguments); 560 int32_t InstanceManager_SetInstances(int32_t iCount); 561 int32_t InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom); 562 void Script_Occur_Max(CFXJSE_Value* pValue, 563 bool bSetting, 564 XFA_ATTRIBUTE eAttribute); 565 void Script_Occur_Min(CFXJSE_Value* pValue, 566 bool bSetting, 567 XFA_ATTRIBUTE eAttribute); 568 void Script_Desc_Metadata(CFXJSE_Arguments* pArguments); 569 void Script_Form_FormNodes(CFXJSE_Arguments* pArguments); 570 void Script_Form_Remerge(CFXJSE_Arguments* pArguments); 571 void Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments); 572 void Script_Form_Recalculate(CFXJSE_Arguments* pArguments); 573 void Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments); 574 void Script_Form_ExecValidate(CFXJSE_Arguments* pArguments); 575 void Script_Form_Checksum(CFXJSE_Value* pValue, 576 bool bSetting, 577 XFA_ATTRIBUTE eAttribute); 578 void Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments); 579 void Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments); 580 void Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments); 581 void Script_Packet_Content(CFXJSE_Value* pValue, 582 bool bSetting, 583 XFA_ATTRIBUTE eAttribute); 584 void Script_Source_Next(CFXJSE_Arguments* pArguments); 585 void Script_Source_CancelBatch(CFXJSE_Arguments* pArguments); 586 void Script_Source_First(CFXJSE_Arguments* pArguments); 587 void Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments); 588 void Script_Source_Previous(CFXJSE_Arguments* pArguments); 589 void Script_Source_IsBOF(CFXJSE_Arguments* pArguments); 590 void Script_Source_IsEOF(CFXJSE_Arguments* pArguments); 591 void Script_Source_Cancel(CFXJSE_Arguments* pArguments); 592 void Script_Source_Update(CFXJSE_Arguments* pArguments); 593 void Script_Source_Open(CFXJSE_Arguments* pArguments); 594 void Script_Source_Delete(CFXJSE_Arguments* pArguments); 595 void Script_Source_AddNew(CFXJSE_Arguments* pArguments); 596 void Script_Source_Requery(CFXJSE_Arguments* pArguments); 597 void Script_Source_Resync(CFXJSE_Arguments* pArguments); 598 void Script_Source_Close(CFXJSE_Arguments* pArguments); 599 void Script_Source_Last(CFXJSE_Arguments* pArguments); 600 void Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments); 601 void Script_Source_Db(CFXJSE_Value* pValue, 602 bool bSetting, 603 XFA_ATTRIBUTE eAttribute); 604 void Script_Xfa_This(CFXJSE_Value* pValue, 605 bool bSetting, 606 XFA_ATTRIBUTE eAttribute); 607 void Script_Handler_Version(CFXJSE_Value* pValue, 608 bool bSetting, 609 XFA_ATTRIBUTE eAttribute); 610 void Script_SubmitFormat_Mode(CFXJSE_Value* pValue, 611 bool bSetting, 612 XFA_ATTRIBUTE eAttribute); 613 void Script_Extras_Type(CFXJSE_Value* pValue, 614 bool bSetting, 615 XFA_ATTRIBUTE eAttribute); 616 void Script_Encrypt_Format(CFXJSE_Value* pValue, 617 bool bSetting, 618 XFA_ATTRIBUTE eAttribute); 619 void Script_Script_Stateless(CFXJSE_Value* pValue, 620 bool bSetting, 621 XFA_ATTRIBUTE eAttribute); 622 623 protected: 624 friend class CXFA_Document; 625 626 CXFA_Node(CXFA_Document* pDoc, 627 uint16_t ePacket, 628 XFA_ObjectType oType, 629 XFA_Element eType, 630 const CFX_WideStringC& elementName); 631 ~CXFA_Node() override; 632 633 bool HasFlag(XFA_NodeFlag dwFlag) const; 634 CXFA_Node* Deprecated_GetPrevSibling(); 635 bool SetValue(XFA_ATTRIBUTE eAttr, 636 XFA_ATTRIBUTETYPE eType, 637 void* pValue, 638 bool bNotify); 639 bool GetValue(XFA_ATTRIBUTE eAttr, 640 XFA_ATTRIBUTETYPE eType, 641 bool bUseDefault, 642 void*& pValue); 643 void OnRemoved(bool bNotify); 644 void OnChanging(XFA_ATTRIBUTE eAttr, bool bNotify); 645 void OnChanged(XFA_ATTRIBUTE eAttr, bool bNotify, bool bScriptModify); 646 int32_t execSingleEventByName(const CFX_WideStringC& wsEventName, 647 XFA_Element eType); 648 bool SetScriptContent(const CFX_WideString& wsContent, 649 const CFX_WideString& wsXMLValue, 650 bool bNotify = true, 651 bool bScriptModify = false, 652 bool bSyncData = true); 653 CFX_WideString GetScriptContent(bool bScriptModify = false); 654 XFA_MAPMODULEDATA* CreateMapModuleData(); 655 XFA_MAPMODULEDATA* GetMapModuleData() const; 656 void SetMapModuleValue(void* pKey, void* pValue); 657 bool GetMapModuleValue(void* pKey, void*& pValue); 658 void SetMapModuleString(void* pKey, const CFX_WideStringC& wsValue); 659 bool GetMapModuleString(void* pKey, CFX_WideStringC& wsValue); 660 void SetMapModuleBuffer( 661 void* pKey, 662 void* pValue, 663 int32_t iBytes, 664 XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo = nullptr); 665 bool GetMapModuleBuffer(void* pKey, 666 void*& pValue, 667 int32_t& iBytes, 668 bool bProtoAlso = true) const; 669 bool HasMapModuleKey(void* pKey, bool bProtoAlso = false); 670 void RemoveMapModuleKey(void* pKey = nullptr); 671 void MergeAllData(void* pDstModule); 672 void MoveBufferMapData(CXFA_Node* pDstModule, void* pKey); 673 void MoveBufferMapData(CXFA_Node* pSrcModule, 674 CXFA_Node* pDstModule, 675 void* pKey, 676 bool bRecursive = false); 677 678 CXFA_Node* m_pNext; 679 CXFA_Node* m_pChild; 680 CXFA_Node* m_pLastChild; 681 CXFA_Node* m_pParent; 682 CFDE_XMLNode* m_pXMLNode; 683 uint16_t m_ePacket; 684 uint16_t m_uNodeFlags; 685 uint32_t m_dwNameHash; 686 CXFA_Node* m_pAuxNode; 687 XFA_MAPMODULEDATA* m_pMapModuleData; 688 689 private: 690 void ThrowMissingPropertyException(const CFX_WideString& obj, 691 const CFX_WideString& prop) const; 692 void ThrowTooManyOccurancesException(const CFX_WideString& obj) const; 693 }; 694 695 class CXFA_ThisProxy : public CXFA_Object { 696 public: 697 CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Node* pScriptNode); 698 ~CXFA_ThisProxy() override; 699 700 CXFA_Node* GetThisNode() const; 701 CXFA_Node* GetScriptNode() const; 702 703 private: 704 CXFA_Node* m_pThisNode; 705 CXFA_Node* m_pScriptNode; 706 }; 707 708 class CXFA_NodeList : public CXFA_Object { 709 public: 710 explicit CXFA_NodeList(CXFA_Document* pDocument); 711 ~CXFA_NodeList() override; 712 713 CXFA_Node* NamedItem(const CFX_WideStringC& wsName); 714 virtual int32_t GetLength() = 0; 715 virtual bool Append(CXFA_Node* pNode) = 0; 716 virtual bool Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) = 0; 717 virtual bool Remove(CXFA_Node* pNode) = 0; 718 virtual CXFA_Node* Item(int32_t iIndex) = 0; 719 720 void Script_ListClass_Append(CFXJSE_Arguments* pArguments); 721 void Script_ListClass_Insert(CFXJSE_Arguments* pArguments); 722 void Script_ListClass_Remove(CFXJSE_Arguments* pArguments); 723 void Script_ListClass_Item(CFXJSE_Arguments* pArguments); 724 725 void Script_TreelistClass_NamedItem(CFXJSE_Arguments* pArguments); 726 void Script_ListClass_Length(CFXJSE_Value* pValue, 727 bool bSetting, 728 XFA_ATTRIBUTE eAttribute); 729 }; 730 731 class CXFA_ArrayNodeList : public CXFA_NodeList { 732 public: 733 explicit CXFA_ArrayNodeList(CXFA_Document* pDocument); 734 ~CXFA_ArrayNodeList() override; 735 736 // From CXFA_NodeList. 737 int32_t GetLength() override; 738 bool Append(CXFA_Node* pNode) override; 739 bool Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) override; 740 bool Remove(CXFA_Node* pNode) override; 741 CXFA_Node* Item(int32_t iIndex) override; 742 743 void SetArrayNodeList(const CXFA_NodeArray& srcArray); 744 745 protected: 746 CXFA_NodeArray m_array; 747 }; 748 749 class CXFA_AttachNodeList : public CXFA_NodeList { 750 public: 751 CXFA_AttachNodeList(CXFA_Document* pDocument, CXFA_Node* pAttachNode); 752 753 // From CXFA_NodeList. 754 int32_t GetLength() override; 755 bool Append(CXFA_Node* pNode) override; 756 bool Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) override; 757 bool Remove(CXFA_Node* pNode) override; 758 CXFA_Node* Item(int32_t iIndex) override; 759 760 protected: 761 CXFA_Node* m_pAttachNode; 762 }; 763 class CXFA_TraverseStrategy_XFAContainerNode { 764 public: 765 static CXFA_Node* GetFirstChild(CXFA_Node* pTemplateNode, 766 void* pUserData = nullptr) { 767 return pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild, 768 XFA_ObjectType::ContainerNode); 769 } 770 static CXFA_Node* GetNextSibling(CXFA_Node* pTemplateNode, 771 void* pUserData = nullptr) { 772 return pTemplateNode->GetNodeItem(XFA_NODEITEM_NextSibling, 773 XFA_ObjectType::ContainerNode); 774 } 775 static CXFA_Node* GetParent(CXFA_Node* pTemplateNode, 776 void* pUserData = nullptr) { 777 return pTemplateNode->GetNodeItem(XFA_NODEITEM_Parent, 778 XFA_ObjectType::ContainerNode); 779 } 780 }; 781 typedef CXFA_NodeIteratorTemplate<CXFA_Node, 782 CXFA_TraverseStrategy_XFAContainerNode> 783 CXFA_ContainerIterator; 784 class CXFA_TraverseStrategy_XFANode { 785 public: 786 static inline CXFA_Node* GetFirstChild(CXFA_Node* pTemplateNode) { 787 return pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); 788 } 789 static inline CXFA_Node* GetNextSibling(CXFA_Node* pTemplateNode) { 790 return pTemplateNode->GetNodeItem(XFA_NODEITEM_NextSibling); 791 } 792 static inline CXFA_Node* GetParent(CXFA_Node* pTemplateNode) { 793 return pTemplateNode->GetNodeItem(XFA_NODEITEM_Parent); 794 } 795 }; 796 typedef CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> 797 CXFA_NodeIterator; 798 799 inline CXFA_Node* CXFA_Object::AsNode() { 800 return IsNode() ? static_cast<CXFA_Node*>(this) : nullptr; 801 } 802 803 inline CXFA_NodeList* CXFA_Object::AsNodeList() { 804 return IsNodeList() ? static_cast<CXFA_NodeList*>(this) : nullptr; 805 } 806 807 inline const CXFA_Node* CXFA_Object::AsNode() const { 808 return IsNode() ? static_cast<const CXFA_Node*>(this) : nullptr; 809 } 810 811 inline const CXFA_NodeList* CXFA_Object::AsNodeList() const { 812 return IsNodeList() ? static_cast<const CXFA_NodeList*>(this) : nullptr; 813 } 814 815 inline CXFA_Node* ToNode(CXFA_Object* pObj) { 816 return pObj ? pObj->AsNode() : nullptr; 817 } 818 819 inline const CXFA_Node* ToNode(const CXFA_Object* pObj) { 820 return pObj ? pObj->AsNode() : nullptr; 821 } 822 823 #endif // XFA_FXFA_PARSER_XFA_OBJECT_H_ 824