1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfdoc/fpdf_doc.h" 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "doc_utils.h" 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "third_party/base/stl_util.h" 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst int nMaxRecursion = 32; 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CFieldNameExtractor { 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann explicit CFieldNameExtractor(const CFX_WideString& full_name) { 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pStart = full_name.c_str(); 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pEnd = m_pStart + full_name.GetLength(); 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCur = m_pStart; 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void GetNext(const FX_WCHAR*& pSubName, FX_STRSIZE& size) { 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pSubName = m_pCur; 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (m_pCur < m_pEnd && m_pCur[0] != L'.') { 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCur++; 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size = (FX_STRSIZE)(m_pCur - pSubName); 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m_pCur < m_pEnd && m_pCur[0] == L'.') { 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pCur++; 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann protected: 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* m_pStart; 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* m_pEnd; 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* m_pCur; 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CFieldTree { 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann struct _Node { 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node* parent; 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ArrayTemplate<_Node*> children; 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString short_name; 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* field_ptr; 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int CountFields(int nLevel = 0) { 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nLevel > nMaxRecursion) { 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (field_ptr) { 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int count = 0; 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < children.GetSize(); i++) { 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann count += children.GetAt(i)->CountFields(nLevel + 1); 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return count; 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* GetField(int* fields_to_go) { 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (field_ptr) { 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (*fields_to_go == 0) { 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return field_ptr; 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann --*fields_to_go; 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < children.GetSize(); i++) { 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_FormField* pField = children.GetAt(i)->GetField(fields_to_go)) 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pField; 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* GetField(int index) { 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int fields_to_go = index; 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetField(&fields_to_go); 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann }; 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFieldTree(); 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ~CFieldTree(); 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void SetField(const CFX_WideString& full_name, CPDF_FormField* field_ptr); 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* GetField(const CFX_WideString& full_name); 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* RemoveField(const CFX_WideString& full_name); 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void RemoveAll(); 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node* FindNode(const CFX_WideString& full_name); 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node* AddChild(_Node* pParent, 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_WideString& short_name, 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* field_ptr); 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void RemoveNode(_Node* pNode, int nLevel = 0); 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node* _Lookup(_Node* pParent, const CFX_WideString& short_name); 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node m_Root; 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}; 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFieldTree::CFieldTree() { 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Root.parent = NULL; 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_Root.field_ptr = NULL; 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFieldTree::~CFieldTree() { 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann RemoveAll(); 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFieldTree::_Node* CFieldTree::AddChild(_Node* pParent, 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_WideString& short_name, 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* field_ptr) { 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pParent) { 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node* pNode = new _Node; 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNode->parent = pParent; 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNode->short_name = short_name; 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNode->field_ptr = field_ptr; 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pParent->children.Add(pNode); 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pNode; 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFieldTree::RemoveNode(_Node* pNode, int nLevel) { 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pNode) { 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nLevel <= nMaxRecursion) { 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < pNode->children.GetSize(); i++) { 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann RemoveNode(pNode->children[i], nLevel + 1); 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete pNode; 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFieldTree::_Node* CFieldTree::_Lookup(_Node* pParent, 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_WideString& short_name) { 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pParent) { 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < pParent->children.GetSize(); i++) { 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node* pNode = pParent->children[i]; 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pNode->short_name.GetLength() == short_name.GetLength() && 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcmp(pNode->short_name.c_str(), short_name.c_str(), 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann short_name.GetLength() * sizeof(FX_WCHAR)) == 0) { 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pNode; 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFieldTree::RemoveAll() { 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < m_Root.children.GetSize(); i++) { 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann RemoveNode(m_Root.children[i]); 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFieldTree::SetField(const CFX_WideString& full_name, 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* field_ptr) { 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (full_name == L"") { 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFieldNameExtractor name_extractor(full_name); 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* pName; 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_STRSIZE nLength; 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann name_extractor.GetNext(pName, nLength); 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node *pNode = &m_Root, *pLast = NULL; 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (nLength > 0) { 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pLast = pNode; 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString name = CFX_WideString(pName, nLength); 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNode = _Lookup(pLast, name); 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pNode) { 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNode = AddChild(pLast, name, NULL); 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov name_extractor.GetNext(pName, nLength); 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pNode != &m_Root) { 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNode->field_ptr = field_ptr; 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) { 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (full_name == L"") { 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFieldNameExtractor name_extractor(full_name); 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* pName; 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_STRSIZE nLength; 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann name_extractor.GetNext(pName, nLength); 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node *pNode = &m_Root, *pLast = NULL; 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (nLength > 0 && pNode) { 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pLast = pNode; 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString name = CFX_WideString(pName, nLength); 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNode = _Lookup(pLast, name); 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov name_extractor.GetNext(pName, nLength); 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pNode ? pNode->field_ptr : NULL; 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormField* CFieldTree::RemoveField(const CFX_WideString& full_name) { 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (full_name == L"") { 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFieldNameExtractor name_extractor(full_name); 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* pName; 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_STRSIZE nLength; 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann name_extractor.GetNext(pName, nLength); 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node *pNode = &m_Root, *pLast = NULL; 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (nLength > 0 && pNode) { 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pLast = pNode; 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString name = CFX_WideString(pName, nLength); 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNode = _Lookup(pLast, name); 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann name_extractor.GetNext(pName, nLength); 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pNode && pNode != &m_Root) { 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < pLast->children.GetSize(); i++) { 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pNode == pLast->children[i]) { 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pLast->children.RemoveAt(i); 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = pNode->field_ptr; 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann RemoveNode(pNode); 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pField; 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFieldTree::_Node* CFieldTree::FindNode(const CFX_WideString& full_name) { 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (full_name == L"") { 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFieldNameExtractor name_extractor(full_name); 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* pName; 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_STRSIZE nLength; 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann name_extractor.GetNext(pName, nLength); 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _Node *pNode = &m_Root, *pLast = NULL; 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (nLength > 0 && pNode) { 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pLast = pNode; 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString name = CFX_WideString(pName, nLength); 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pNode = _Lookup(pLast, name); 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov name_extractor.GetNext(pName, nLength); 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pNode; 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP) 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann : CFX_PrivateData(), 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pDocument(pDocument), 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bGenerateAP(bGenerateAP), 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormDict(nullptr), 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFieldTree(new CFieldTree), 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormNotify(nullptr), 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bUpdated(FALSE) { 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pRoot) 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormDict = pRoot->GetDict("AcroForm"); 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pFormDict) 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pFields = m_pFormDict->GetArray("Fields"); 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFields) 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int count = pFields->GetCount(); 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < count; i++) { 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LoadField(pFields->GetDict(i)); 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_InterForm::~CPDF_InterForm() { 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (auto it : m_ControlMap) 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete it.second; 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nCount = m_pFieldTree->m_Root.CountFields(); 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < nCount; ++i) { 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann delete m_pFieldTree->m_Root.GetField(i); 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::m_bUpdateAP = TRUE; 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::UpdatingAPEnabled() { 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_bUpdateAP; 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP) { 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bUpdateAP = bUpdateAP; 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_InterForm::GenerateNewResourceName( 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* pResDict, 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_CHAR* csType, 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iMinLen, 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_CHAR* csPrefix) { 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csStr = csPrefix; 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csBType = csType; 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csStr.IsEmpty()) { 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csBType == "ExtGState") { 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csStr = "GS"; 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (csBType == "ColorSpace") { 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csStr = "CS"; 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (csBType == "Font") { 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csStr = "ZiTi"; 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } else { 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csStr = "Res"; 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csTmp = csStr; 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iCount = csStr.GetLength(); 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int m = 0; 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iMinLen > 0) { 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csTmp = ""; 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (m < iMinLen && m < iCount) { 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csTmp += csStr[m++]; 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (m < iMinLen) { 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csTmp += '0' + m % 10; 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m++; 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m = iCount; 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pResDict) { 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return csTmp; 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pResDict->GetDict(csType); 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) { 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return csTmp; 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int num = 0; 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString bsNum; 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (TRUE) { 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict->KeyExist(csTmp + bsNum)) { 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return csTmp + bsNum; 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (m < iCount) { 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csTmp += csStr[m++]; 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bsNum.Format("%d", num++); 318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m++; 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return csTmp; 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtypedef struct _PDF_FONTDATA { 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bFind; 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LOGFONTA lf; 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} PDF_FONTDATA, FAR* LPDF_FONTDATA; 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int CALLBACK EnumFontFamExProc(ENUMLOGFONTEXA* lpelfe, 329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann NEWTEXTMETRICEX* lpntme, 330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann DWORD FontType, 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LPARAM lParam) { 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@')) { 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 1; 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam; 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA)); 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pData->bFind = TRUE; 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic FX_BOOL RetrieveSpecificFont(LOGFONTA& lf) { 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann PDF_FONTDATA fd; 342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memset(&fd, 0, sizeof(PDF_FONTDATA)); 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann HDC hDC = ::GetDC(NULL); 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 0); 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ::ReleaseDC(NULL, hDC); 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (fd.bFind) { 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(&lf, &fd.lf, sizeof(LOGFONTA)); 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return fd.bFind; 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic FX_BOOL RetrieveSpecificFont(uint8_t charSet, 353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t pitchAndFamily, 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LPCSTR pcsFontName, 355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LOGFONTA& lf) { 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memset(&lf, 0, sizeof(LOGFONTA)); 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann lf.lfCharSet = charSet; 358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann lf.lfPitchAndFamily = pitchAndFamily; 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pcsFontName) { 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann strcpy(lf.lfFaceName, pcsFontName); 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return RetrieveSpecificFont(lf); 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_XFA 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic FX_BOOL RetrieveStockFont(int iFontObject, 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t charSet, 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LOGFONTA& lf) { 368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann HFONT hFont = (HFONT)::GetStockObject(iFontObject); 369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (hFont != NULL) { 370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov memset(&lf, 0, sizeof(LOGFONTA)); 371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf); 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) { 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return RetrieveSpecificFont(lf); 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // PDF_ENABLE_XFA 379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::AddStandardFont(CPDF_Document* pDocument, 382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csFontName) { 383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDocument || csFontName.IsEmpty()) 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csFontName == "ZapfDingbats") 387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDocument->AddStandardFont(csFontName.c_str(), nullptr); 388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI); 390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDocument->AddStandardFont(csFontName.c_str(), &encoding); 391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_InterForm::GetNativeFont(uint8_t charSet, void* pLogFont) { 394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csFontName; 395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LOGFONTA lf; 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRet; 398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (charSet == ANSI_CHARSET) { 399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csFontName = "Helvetica"; 400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return csFontName; 401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bRet = FALSE; 403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (charSet == SHIFTJIS_CHARSET) { 404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, 405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "MS Mincho", lf); 406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (charSet == GB2312_CHARSET) { 407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSun", 408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann lf); 409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (charSet == CHINESEBIG5_CHARSET) { 410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingLiU", 411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann lf); 412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bRet) { 414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, 415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "Arial Unicode MS", lf); 416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bRet) { 418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, 419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "Microsoft Sans Serif", lf); 420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!bRet) { 422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf); 423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bRet) { 425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pLogFont) { 426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann memcpy(pLogFont, &lf, sizeof(LOGFONTA)); 427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csFontName = lf.lfFaceName; 429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return csFontName; 430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return csFontName; 433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_InterForm::GetNativeFont(void* pLogFont) { 435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t charSet = GetNativeCharSet(); 437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetNativeFont(charSet, pLogFont); 438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CFX_ByteString(); 440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannuint8_t CPDF_InterForm::GetNativeCharSet() { 443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t charSet = ANSI_CHARSET; 445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann UINT iCodePage = ::GetACP(); 446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (iCodePage) { 447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 932: 448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = SHIFTJIS_CHARSET; 449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 936: 451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = GB2312_CHARSET; 452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 950: 454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = CHINESEBIG5_CHARSET; 455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1252: 457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = ANSI_CHARSET; 458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 874: 460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = THAI_CHARSET; 461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 949: 463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = HANGUL_CHARSET; 464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1200: 466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = ANSI_CHARSET; 467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1250: 469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = EASTEUROPE_CHARSET; 470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1251: 472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = RUSSIAN_CHARSET; 473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1253: 475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = GREEK_CHARSET; 476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1254: 478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = TURKISH_CHARSET; 479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1255: 481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = HEBREW_CHARSET; 482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1256: 484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = ARABIC_CHARSET; 485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1257: 487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = BALTIC_CHARSET; 488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1258: 490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = VIETNAMESE_CHARSET; 491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case 1361: 493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann charSet = JOHAB_CHARSET; 494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return charSet; 497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#else 498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::AddNativeFont(uint8_t charSet, 503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDocument) { 504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDocument) 505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LOGFONTA lf; 509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csFontName = GetNativeFont(charSet, &lf); 510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!csFontName.IsEmpty()) { 511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csFontName == "Helvetica") 512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AddStandardFont(pDocument, csFontName); 513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDocument->AddWindowsFont(&lf, FALSE, TRUE); 514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::AddNativeFont(CPDF_Document* pDocument) { 520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDocument ? AddNativeFont(GetNativeCharSet(), pDocument) : nullptr; 521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::ValidateFieldName( 524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString& csNewFieldName, 525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iType, 526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_FormField* pExcludedField, 527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_FormControl* pExcludedControl) { 528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csNewFieldName.IsEmpty()) { 529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iPos = 0; 532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iLength = csNewFieldName.GetLength(); 533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString csSub; 534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (TRUE) { 535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (iPos < iLength && 536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) { 537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iPos++; 538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iPos < iLength && !csSub.IsEmpty()) { 540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csSub += L'.'; 541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (iPos < iLength && csNewFieldName[iPos] != L'.') { 543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csSub += csNewFieldName[iPos++]; 544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = csSub.GetLength() - 1; i > -1; i--) { 546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csSub[i] == L' ' || csSub[i] == L'.') { 547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csSub.SetAt(i, L'\0'); 548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields(); 553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD m = 0; m < dwCount; m++) { 554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m); 555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pField) { 556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pField == pExcludedField) { 559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pExcludedControl) { 560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pField->CountControls() < 2) { 561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString csFullName = pField->GetFullName(); 568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iRet = CompareFieldName(csSub, csFullName); 569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet == 1) { 570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pField->GetFieldType() != iType) { 571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (iRet == 2 && csSub == csNewFieldName) { 574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csFullName[iPos] == L'.') { 575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (iRet == 3 && csSub == csNewFieldName) { 578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csNewFieldName[csFullName.GetLength()] == L'.') { 579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iPos >= iLength) { 584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csSub.IsEmpty()) { 588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csNewFieldName = csSub; 591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, 594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iType) { 595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ValidateFieldName(csNewFieldName, iType, NULL, NULL); 596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField, 598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString& csNewFieldName) { 599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pField && !csNewFieldName.IsEmpty() && 600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ValidateFieldName(csNewFieldName, 601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((CPDF_FormField*)pField)->GetFieldType(), pField, 602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann NULL); 603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl, 605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString& csNewFieldName) { 606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pControl || csNewFieldName.IsEmpty()) { 607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField(); 610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, 611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pControl); 612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, 614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_ByteString& name2) { 615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_CHAR* ptr1 = name1; 616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_CHAR* ptr2 = name2; 617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (name1.GetLength() == name2.GetLength()) { 618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return name1 == name2 ? 1 : 0; 619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int i = 0; 621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (ptr1[i] == ptr2[i]) { 622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i++; 623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i == name1.GetLength()) { 625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 2; 626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i == name2.GetLength()) { 628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 3; 629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, 633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_WideString& name2) { 634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* ptr1 = name1.c_str(); 635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* ptr2 = name2.c_str(); 636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (name1.GetLength() == name2.GetLength()) { 637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return name1 == name2 ? 1 : 0; 638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int i = 0; 640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (ptr1[i] == ptr2[i]) { 641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann i++; 642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i == name1.GetLength()) { 644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 2; 645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i == name2.GetLength()) { 647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 3; 648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_InterForm::CountFields(const CFX_WideString& csFieldName) { 652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csFieldName.IsEmpty()) { 653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (FX_DWORD)m_pFieldTree->m_Root.CountFields(); 654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFieldTree::_Node* pNode = m_pFieldTree->FindNode(csFieldName); 656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pNode ? pNode->CountFields() : 0; 657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index, 659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_WideString& csFieldName) { 660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csFieldName == L"") { 661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pFieldTree->m_Root.GetField(index); 662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFieldTree::_Node* pNode = m_pFieldTree->FindNode(csFieldName); 664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pNode ? pNode->GetField(index) : nullptr; 665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames) { 667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann allFieldNames.RemoveAll(); 668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nCount = m_pFieldTree->m_Root.CountFields(); 669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < nCount; i++) { 670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pField) { 672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString full_name = GetFullName(pField->GetFieldDict()); 673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann allFieldNames.Add(full_name); 674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormField* CPDF_InterForm::GetFieldByDict( 679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pFieldDict) const { 680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFieldDict) { 681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString csWName = GetFullName(pFieldDict); 684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pFieldTree->GetField(csWName); 685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, 688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT pdf_x, 689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT pdf_y, 690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int* z_order) const { 691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots"); 692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pAnnotList) 693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = pAnnotList->GetCount(); i > 0; --i) { 696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD annot_index = i - 1; 697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pAnnot = pAnnotList->GetDict(annot_index); 698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pAnnot) 699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const auto it = m_ControlMap.find(pAnnot); 702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it == m_ControlMap.end()) 703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormControl* pControl = it->second; 706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_FloatRect rect = pControl->GetRect(); 707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!rect.Contains(pdf_x, pdf_y)) 708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (z_order) 711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *z_order = annot_index; 712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return pControl; 713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormControl* CPDF_InterForm::GetControlByDict( 718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CPDF_Dictionary* pWidgetDict) const { 719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const auto it = m_ControlMap.find(pWidgetDict); 720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return it != m_ControlMap.end() ? it->second : nullptr; 721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::NeedConstructAP() { 724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pFormDict && m_pFormDict->GetBoolean("NeedAppearances"); 725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP) { 727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pFormDict) { 728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann InitInterFormDict(m_pFormDict, m_pDocument); 729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP); 731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bGenerateAP = bNeedAP; 732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_InterForm::CountFieldsInCalculationOrder() { 734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pFormDict) { 735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = m_pFormDict->GetArray("CO"); 738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pArray ? pArray->GetCount() : 0; 739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index) { 741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pFormDict || index < 0) { 742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = m_pFormDict->GetArray("CO"); 745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray) { 746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_Dictionary* pElement = 749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ToDictionary(pArray->GetElementValue(index))) { 750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetFieldByDict(pElement); 751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField) { 755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pFormDict || !pField) { 756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return -1; 757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pArray = m_pFormDict->GetArray("CO"); 759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray) { 760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { 763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pElement = pArray->GetElementValue(i); 764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pElement == pField->m_pDict) { 765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return i; 766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_InterForm::CountFormFonts() { 771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CountInterFormFonts(m_pFormDict); 772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index, 774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString& csNameTag) { 775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag); 776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag) { 778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag); 779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, 781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString& csNameTag) { 782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag); 783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::GetNativeFormFont(uint8_t charSet, 785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString& csNameTag) { 786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag); 787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag) { 789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag); 790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont, 792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString& csNameTag) { 793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FindInterFormFont(m_pFormDict, pFont, csNameTag); 794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName, 796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Font*& pFont, 797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString& csNameTag) { 798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont, 799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csNameTag); 800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::AddFormFont(const CPDF_Font* pFont, 802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString& csNameTag) { 803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag); 804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bUpdated = TRUE; 805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::AddNativeFormFont(uint8_t charSet, 807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString& csNameTag) { 808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bUpdated = TRUE; 809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag); 810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag) { 812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bUpdated = TRUE; 813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag); 814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont) { 816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bUpdated = TRUE; 817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann RemoveInterFormFont(m_pFormDict, pFont); 818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag) { 820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bUpdated = TRUE; 821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann RemoveInterFormFont(m_pFormDict, csNameTag); 822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance() { 824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csDA; 825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!m_pFormDict) { 826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return csDA; 827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csDA = m_pFormDict->GetString("DA"); 829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return csDA; 830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Font* CPDF_InterForm::GetDefaultFormFont() { 832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return GetDefaultInterFormFont(m_pFormDict, m_pDocument); 833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_InterForm::GetFormAlignment() { 835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pFormDict ? m_pFormDict->GetInteger("Q", 0) : 0; 836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool CPDF_InterForm::ResetForm(const std::vector<CPDF_FormField*>& fields, 839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool bIncludeOrExclude, 840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool bNotify) { 841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0) 842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return false; 843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nCount = m_pFieldTree->m_Root.CountFields(); 845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < nCount; ++i) { 846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pField) 848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField)) 851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pField->ResetField(bNotify); 852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bNotify && m_pFormNotify) 854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormNotify->AfterFormReset(this); 855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return true; 856e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool CPDF_InterForm::ResetForm(bool bNotify) { 859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0) 860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return false; 861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nCount = m_pFieldTree->m_Root.CountFields(); 863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < nCount; ++i) { 864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pField) 866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pField->ResetField(bNotify); 869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bNotify && m_pFormNotify) 871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormNotify->AfterFormReset(this); 872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return true; 873e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel) { 876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nLevel > nMaxRecursion) { 877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFieldDict) { 880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwParentObjNum = pFieldDict->GetObjNum(); 883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pKids = pFieldDict->GetArray("Kids"); 884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKids) { 885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AddTerminalField(pFieldDict); 886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pFirstKid = pKids->GetDict(0); 889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFirstKid) { 890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) { 893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { 894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pChildDict = pKids->GetDict(i); 895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pChildDict) { 896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pChildDict->GetObjNum() != dwParentObjNum) { 897ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LoadField(pChildDict, nLevel + 1); 898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AddTerminalField(pFieldDict); 903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::HasXFAForm() const { 906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return m_pFormDict && m_pFormDict->GetArray("XFA"); 907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::FixPageFields(const CPDF_Page* pPage) { 909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pPageDict = pPage->m_pFormDict; 910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pPageDict) { 911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pAnnots = pPageDict->GetArray("Annots"); 914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pAnnots) { 915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iAnnotCount = pAnnots->GetCount(); 918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < iAnnotCount; i++) { 919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pAnnot = pAnnots->GetDict(i); 920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pAnnot && pAnnot->GetString("Subtype") == "Widget") { 921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann LoadField(pAnnot); 922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) { 926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFieldDict->KeyExist("T")) { 927ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = pFieldDict; 930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString csWName = GetFullName(pFieldDict); 931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csWName.IsEmpty()) { 932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return NULL; 933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = NULL; 935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pField = m_pFieldTree->GetField(csWName); 936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pField) { 937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pParent = pFieldDict; 938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFieldDict->KeyExist("T") && 939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFieldDict->GetString("Subtype") == "Widget") { 940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pParent = pFieldDict->GetDict("Parent"); 941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pParent) { 942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pParent = pFieldDict; 943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pParent && pParent != pFieldDict && !pParent->KeyExist("FT")) { 946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFieldDict->KeyExist("FT")) { 947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pFTValue = pFieldDict->GetElementValue("FT"); 948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFTValue) { 949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pParent->SetAt("FT", pFTValue->Clone()); 950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFieldDict->KeyExist("Ff")) { 953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pFfValue = pFieldDict->GetElementValue("Ff"); 954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFfValue) { 955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pParent->SetAt("Ff", pFfValue->Clone()); 956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pField = new CPDF_FormField(this, pParent); 960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pTObj = pDict->GetElement("T"); 961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (ToReference(pTObj)) { 962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pClone = pTObj->Clone(TRUE); 963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pClone) 964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAt("T", pClone); 965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else 966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pDict->SetAtName("T", ""); 967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFieldTree->SetField(csWName, pField); 969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pKids = pFieldDict->GetArray("Kids"); 971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKids) { 972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pFieldDict->GetString("Subtype") == "Widget") { 973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AddControl(pField, pFieldDict); 974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { 977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pKid = pKids->GetDict(i); 978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKid) { 979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pKid->GetString("Subtype") != "Widget") { 982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann AddControl(pField, pKid); 985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pField; 988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField, 990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pWidgetDict) { 991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const auto it = m_ControlMap.find(pWidgetDict); 992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (it != m_ControlMap.end()) 993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return it->second; 994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormControl* pControl = 996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann new CPDF_FormControl((CPDF_FormField*)pField, pWidgetDict); 997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_ControlMap[pWidgetDict] = pControl; 998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ((CPDF_FormField*)pField)->m_ControlList.Add(pControl); 999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pControl; 1000e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormField* CPDF_InterForm::CheckRequiredFields( 1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const std::vector<CPDF_FormField*>* fields, 1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool bIncludeOrExclude) const { 1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nCount = m_pFieldTree->m_Root.CountFields(); 1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < nCount; ++i) { 1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pField) 1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iType = pField->GetType(); 1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iType == CPDF_FormField::PushButton || 1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) { 1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwFlags = pField->GetFieldFlags(); 1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // TODO(thestig): Look up these magic numbers and add constants for them. 1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwFlags & 0x04) 1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool bFind = true; 1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (fields) 1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bFind = pdfium::ContainsValue(*fields, pField); 1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bIncludeOrExclude == bFind) { 1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pFieldDict = pField->m_pDict; 1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) { 1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pField; 1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1029e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 1032e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path, 1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool bSimpleFileSpec) const { 1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::vector<CPDF_FormField*> fields; 1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nCount = m_pFieldTree->m_Root.CountFields(); 1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < nCount; ++i) 1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fields.push_back(m_pFieldTree->m_Root.GetField(i)); 1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ExportToFDF(pdf_path, fields, true, bSimpleFileSpec); 1041e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFDF_Document* CPDF_InterForm::ExportToFDF( 1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_WideStringC& pdf_path, 1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const std::vector<CPDF_FormField*>& fields, 1046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool bIncludeOrExclude, 1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool bSimpleFileSpec) const { 1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFDF_Document* pDoc = CFDF_Document::CreateNewDoc(); 1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) { 1050e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return NULL; 1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF"); 1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pdf_path.IsEmpty()) { 1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bSimpleFileSpec) { 1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path); 1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMainDict->SetAtString("F", CFX_ByteString::FromUnicode(wsFilePath)); 1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMainDict->SetAtString("UF", PDF_EncodeText(wsFilePath)); 1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FileSpec filespec; 1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann filespec.SetFileName(pdf_path); 1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMainDict->SetAt("F", static_cast<CPDF_Object*>(filespec)); 1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pFields = new CPDF_Array; 1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pMainDict->SetAt("Fields", pFields); 1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nCount = m_pFieldTree->m_Root.CountFields(); 1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int i = 0; i < nCount; i++) { 1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i); 1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pField || pField->GetType() == CPDF_FormField::PushButton) { 1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwFlags = pField->GetFieldFlags(); 1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dwFlags & 0x04) 1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField)) { 1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) 1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString fullname = GetFullName(pField->GetFieldDict()); 1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pFieldDict = new CPDF_Dictionary; 1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFieldDict->SetAt("T", new CPDF_String(fullname)); 1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pField->GetType() == CPDF_FormField::CheckBox || 1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pField->GetType() == CPDF_FormField::RadioButton) { 1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString csExport = pField->GetCheckValue(FALSE); 1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csBExport = PDF_EncodeText(csExport); 1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt"); 1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pOpt) 1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFieldDict->SetAtString("V", csBExport); 1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else 1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFieldDict->SetAtName("V", csBExport); 1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V"); 1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pV) 1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFieldDict->SetAt("V", pV->Clone(TRUE)); 1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFields->Add(pFieldDict); 1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return pDoc; 1101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovconst struct _SupportFieldEncoding { 1103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_CHAR* m_name; 1104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t m_codePage; 1105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} g_fieldEncoding[] = { 1106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"BigFive", 950}, 1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"GBK", 936}, 1108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"Shift-JIS", 932}, 1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann {"UHC", 949}, 1110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary* pFieldDict, 1112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString& csValue, 1113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString& bsEncoding) { 1114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csBValue = pFieldDict->GetString("V"); 1115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]); 1116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t i = 0; 1117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (; i < iCount; ++i) 1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bsEncoding == g_fieldEncoding[i].m_name) { 1119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 1120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (i < iCount) { 1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_CharMap* pCharMap = 1123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage); 1124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pCharMap); 1125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csValue.ConvertFrom(csBValue, pCharMap); 1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString csTemp = csBValue.Left(2); 1129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") { 1130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csValue = PDF_DecodeText(csBValue); 1131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann csValue = CFX_WideString::FromLocal(csBValue); 1133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, 1136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_WideString& parent_name, 1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bNotify, 1138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int nLevel) { 1139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString name; 1140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!parent_name.IsEmpty()) { 1141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann name = parent_name + L"."; 1142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann name += pFieldDict->GetUnicodeText("T"); 1144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pKids = pFieldDict->GetArray("Kids"); 1145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pKids) { 1146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { 1147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pKid = pKids->GetDict(i); 1148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pKid) { 1149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (nLevel <= nMaxRecursion) { 1152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDF_ImportField(pKid, name, bNotify, nLevel + 1); 1153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFieldDict->KeyExist("V")) { 1158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField* pField = m_pFieldTree->GetField(name); 1161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pField) { 1162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString csWValue; 1165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding); 1166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iType = pField->GetFieldType(); 1167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bNotify && m_pFormNotify) { 1168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iRet = 0; 1169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iType == FIELDTYPE_LISTBOX) { 1170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue); 1171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { 1172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iRet = m_pFormNotify->BeforeValueChange(pField, csWValue); 1173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet < 0) { 1175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return; 1176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteArray statusArray; 1179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) { 1180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SaveCheckedFieldStatus(pField, statusArray); 1181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pField->SetValue(csWValue); 1183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_FormField::Type eType = pField->GetType(); 1184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && 1185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFieldDict->KeyExist("Opt")) { 1186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pField->m_pDict->SetAt("Opt", 1187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pFieldDict->GetElementValue("Opt")->Clone(TRUE)); 1188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bNotify && m_pFormNotify) { 1190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) { 1191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormNotify->AfterCheckedStatusChange(pField, statusArray); 1192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (iType == FIELDTYPE_LISTBOX) { 1193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormNotify->AfterSelectionChange(pField); 1194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { 1195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormNotify->AfterValueChange(pField); 1196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (CPDF_InterForm::m_bUpdateAP) { 1199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pField->UpdateAP(NULL); 1200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, 1203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bNotify) { 1204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFDF) { 1205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF"); 1208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pMainDict) { 1209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Array* pFields = pMainDict->GetArray("Fields"); 1212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pFields) { 1213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_bsEncoding = pMainDict->GetString("Encoding"); 1216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bNotify && m_pFormNotify) { 1217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int iRet = m_pFormNotify->BeforeFormImportData(this); 1218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iRet < 0) { 1219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 1220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (FX_DWORD i = 0; i < pFields->GetCount(); i++) { 1223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pField = pFields->GetDict(i); 1224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pField) { 1225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 1226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FDF_ImportField(pField, L"", bNotify); 1228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (bNotify && m_pFormNotify) { 1230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormNotify->AfterFormImportData(this); 1231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 1232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 1233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 1234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) { 1235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann m_pFormNotify = (CPDF_FormNotify*)pNotify; 1236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 1237