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