1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/fpdfdoc/fpdf_doc.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/fxcrt/fx_xml.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString	GetFullName(CPDF_Dictionary* pFieldDict);
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD		CountInterFormFonts(CPDF_Dictionary* pFormDict);
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font*		GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL			NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL			NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid			UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst int nMaxRecursion = 32;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass _CFieldNameExtractor : public CFX_Object
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _CFieldNameExtractor(const CFX_WideString& full_name)
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pStart = full_name;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pEnd = m_pStart + full_name.GetLength();
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pCur = m_pStart;
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void GetNext(FX_LPCWSTR &pSubName, FX_STRSIZE& size)
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pSubName = m_pCur;
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (m_pCur < m_pEnd && m_pCur[0] != L'.') {
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pCur++;
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        size = (FX_STRSIZE)(m_pCur - pSubName);
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pCur < m_pEnd && m_pCur[0] == L'.') {
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pCur++;
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR m_pStart;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR m_pEnd;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR m_pCur;
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFieldTree : public CFX_Object
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    struct _Node : public CFX_Object {
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        _Node *parent;
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_PtrArray children;
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_WideString short_name;
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField *field_ptr;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int CountFields(int nLevel = 0)
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (nLevel > nMaxRecursion) {
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return 0;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (field_ptr) {
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return 1;
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int count = 0;
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            for (int i = 0; i < children.GetSize(); i ++) {
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                count += ((_Node *)children.GetAt(i))->CountFields(nLevel + 1);
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return count;
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField* GetField(int* fields_to_go)
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (field_ptr) {
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (*fields_to_go == 0) {
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return field_ptr;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                --*fields_to_go;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            for (int i = 0; i < children.GetSize(); i++) {
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                _Node *pNode = (_Node *)children.GetAt(i);
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_FormField* pField = pNode->GetField(fields_to_go);
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pField) {
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return pField;
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField* GetField(int index)
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int fields_to_go = index;
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return GetField(&fields_to_go);
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    };
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFieldTree();
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~CFieldTree();
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr);
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormField *GetField(const CFX_WideString &full_name);
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormField *RemoveField(const CFX_WideString &full_name);
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void RemoveAll();
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _Node *FindNode(const CFX_WideString &full_name);
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _Node * AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr);
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void RemoveNode(_Node *pNode, int nLevel = 0);
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _Node *_Lookup(_Node *pParent, const CFX_WideString &short_name);
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _Node m_Root;
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::CFieldTree()
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Root.parent = NULL;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Root.field_ptr = NULL;
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::~CFieldTree()
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    RemoveAll();
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::_Node *CFieldTree::AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr)
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pParent == NULL) {
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _Node *pNode = FX_NEW _Node;
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pNode == NULL) {
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pNode->parent = pParent;
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pNode->short_name = short_name;
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pNode->field_ptr = field_ptr;
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pParent->children.Add(pNode);
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pNode;
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFieldTree::RemoveNode(_Node *pNode, int nLevel)
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pNode == NULL) {
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ;
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (nLevel > nMaxRecursion) {
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pNode;
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray& ptr_array = pNode->children;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < ptr_array.GetSize(); i ++) {
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        _Node *pChild = (_Node *)ptr_array[i];
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        RemoveNode(pChild, nLevel + 1);
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    delete pNode;
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::_Node *CFieldTree::_Lookup(_Node *pParent, const CFX_WideString &short_name)
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pParent == NULL) {
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray& ptr_array = pParent->children;
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < ptr_array.GetSize(); i ++) {
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        _Node *pNode = (_Node *)ptr_array[i];
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pNode->short_name.GetLength() == short_name.GetLength() &&
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FXSYS_memcmp32((FX_LPCWSTR)pNode->short_name, (FX_LPCWSTR)short_name, short_name.GetLength()*sizeof(FX_WCHAR)) == 0) {
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pNode;
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFieldTree::RemoveAll()
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray& ptr_array = m_Root.children;
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < ptr_array.GetSize(); i ++) {
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        _Node *pNode = (_Node *)ptr_array[i];
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        RemoveNode(pNode);
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFieldTree::SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr)
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (full_name == L"") {
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _CFieldNameExtractor name_extractor(full_name);
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR pName;
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE nLength;
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    name_extractor.GetNext(pName, nLength);
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _Node *pNode = &m_Root, *pLast = NULL;
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (nLength > 0) {
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pLast = pNode;
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_WideString name = CFX_WideString(pName, nLength);
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pNode = _Lookup(pLast, name);
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pNode == NULL) {
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pNode = AddChild(pLast, name, NULL);
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        name_extractor.GetNext(pName, nLength);
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pNode != &m_Root) {
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pNode->field_ptr = field_ptr;
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField *CFieldTree::GetField(const CFX_WideString &full_name)
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (full_name == L"") {
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _CFieldNameExtractor name_extractor(full_name);
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR pName;
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE nLength;
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    name_extractor.GetNext(pName, nLength);
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _Node *pNode = &m_Root, *pLast = NULL;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (nLength > 0 && pNode) {
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pLast = pNode;
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_WideString name = CFX_WideString(pName, nLength);
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pNode = _Lookup(pLast, name);
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        name_extractor.GetNext(pName, nLength);
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pNode ? pNode->field_ptr : NULL;
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField *CFieldTree::RemoveField(const CFX_WideString & full_name)
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (full_name == L"") {
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _CFieldNameExtractor name_extractor(full_name);
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR pName;
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE nLength;
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    name_extractor.GetNext(pName, nLength);
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _Node *pNode = &m_Root, *pLast = NULL;
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (nLength > 0 && pNode) {
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pLast = pNode;
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_WideString name = CFX_WideString(pName, nLength);
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pNode = _Lookup(pLast, name);
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        name_extractor.GetNext(pName, nLength);
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pNode && pNode != &m_Root) {
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_PtrArray& ptr_array = pLast->children;
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (int i = 0; i < ptr_array.GetSize(); i ++) {
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pNode == (_Node *)ptr_array[i]) {
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                ptr_array.RemoveAt(i);
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField *pField = pNode->field_ptr;
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        RemoveNode(pNode);
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pField;
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFieldTree::_Node *CFieldTree::FindNode(const CFX_WideString& full_name)
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (full_name == L"") {
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _CFieldNameExtractor name_extractor(full_name);
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR pName;
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_STRSIZE nLength;
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    name_extractor.GetNext(pName, nLength);
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    _Node *pNode = &m_Root, *pLast = NULL;
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (nLength > 0 && pNode) {
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pLast = pNode;
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_WideString name = CFX_WideString(pName, nLength);
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pNode = _Lookup(pLast, name);
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        name_extractor.GetNext(pName, nLength);
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pNode;
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP) : CFX_PrivateData()
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDocument = pDocument;
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bGenerateAP = bGenerateAP;
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFormNotify = NULL;
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bUpdated = FALSE;
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFieldTree = FX_NEW CFieldTree;
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFormDict = pRoot->GetDict("AcroForm");
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL) {
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFields == NULL) {
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count = pFields->GetCount();
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < count; i ++) {
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        LoadField(pFields->GetDict(i));
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_InterForm::~CPDF_InterForm()
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = m_ControlMap.GetStartPosition();
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID key, value;
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_ControlMap.GetNextAssoc(pos, key, value);
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete (CPDF_FormControl*)value;
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFieldTree != NULL) {
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int nCount = m_pFieldTree->m_Root.CountFields();
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (int i = 0; i < nCount; i++) {
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete pField;
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete m_pFieldTree;
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPDF_InterForm::m_bUpdateAP = TRUE;
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::UpdatingAPEnabled()
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_bUpdateAP;
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP)
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bUpdateAP = bUpdateAP;
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_InterForm::GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen, FX_LPCSTR csPrefix)
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csStr = csPrefix;
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csBType = csType;
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csStr.IsEmpty()) {
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (csBType == "ExtGState") {
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csStr = "GS";
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (csBType == "ColorSpace") {
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csStr = "CS";
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (csBType == "Font") {
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csStr = "ZiTi";
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csStr = "Res";
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csTmp = csStr;
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int iCount = csStr.GetLength();
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int m = 0;
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (iMinLen > 0) {
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csTmp = "";
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (m < iMinLen && m < iCount) {
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csTmp += csStr[m ++];
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (m < iMinLen) {
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csTmp += '0' + m % 10;
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m ++;
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m = iCount;
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pResDict == NULL) {
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csTmp;
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDict = pResDict->GetDict(csType);
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDict == NULL) {
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csTmp;
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int num = 0;
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString bsNum;
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (TRUE) {
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pDict->KeyExist(csTmp + bsNum)) {
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return csTmp + bsNum;
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m < iCount) {
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csTmp += csStr[m ++];
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bsNum.Format("%d", num++);
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m ++;
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return csTmp;
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct _PDF_FONTDATA {
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL		bFind;
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LOGFONTA	lf;
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} PDF_FONTDATA, FAR* LPDF_FONTDATA;
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic int CALLBACK EnumFontFamExProc(	ENUMLOGFONTEXA *lpelfe,
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        NEWTEXTMETRICEX *lpntme,
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        DWORD FontType,
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        LPARAM lParam
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                     )
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) {
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 1;
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam;
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA));
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pData->bFind = TRUE;
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL RetrieveSpecificFont(LOGFONTA& lf)
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PDF_FONTDATA fd;
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    memset(&fd, 0, sizeof(PDF_FONTDATA));
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HDC hDC = ::GetDC(NULL);
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 0);
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ::ReleaseDC(NULL, hDC);
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (fd.bFind) {
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        memcpy(&lf, &fd.lf, sizeof(LOGFONTA));
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return fd.bFind;
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL RetrieveSpecificFont(FX_BYTE charSet, FX_BYTE pitchAndFamily, LPCSTR pcsFontName, LOGFONTA& lf)
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    memset(&lf, 0, sizeof(LOGFONTA));
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    lf.lfCharSet = charSet;
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    lf.lfPitchAndFamily = pitchAndFamily;
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pcsFontName != NULL) {
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        strcpy(lf.lfFaceName, pcsFontName);
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return RetrieveSpecificFont(lf);
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic FX_BOOL RetrieveStockFont(int iFontObject, FX_BYTE charSet, LOGFONTA& lf)
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HFONT hFont = (HFONT)::GetStockObject(iFontObject);
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (hFont != NULL) {
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        memset(&lf, 0, sizeof(LOGFONTA));
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf);
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) {
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return RetrieveSpecificFont(lf);
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddSystemDefaultFont(const CPDF_Document* pDocument)
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDocument == NULL) {
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Font* pFont = NULL;
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LOGFONTA lf;
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bRet;
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bRet = RetrieveStockFont(DEFAULT_GUI_FONT, 255, lf);
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bRet) {
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bRet = RetrieveStockFont(SYSTEM_FONT, 255, lf);
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bRet) {
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pFont;
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet)
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDocument == NULL || csFontName.IsEmpty()) {
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (iCharSet == 1) {
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iCharSet = GetNativeCharSet();
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HFONT hFont = ::CreateFontA(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, (FX_LPCSTR)csFontName);
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (hFont != NULL) {
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        LOGFONTA lf;
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        memset(&lf, 0, sizeof(LOGFONTA));
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ::GetObjectA(hFont, sizeof(LOGFONTA), &lf);
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ::DeleteObject(hFont);
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (strlen(lf.lfFaceName) > 0) {
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet)
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDocument == NULL || csFontName.IsEmpty()) {
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (iCharSet == 1) {
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iCharSet = GetNativeCharSet();
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    HFONT hFont = ::CreateFontW(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontName);
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (hFont != NULL) {
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        LOGFONTA lf;
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        memset(&lf, 0, sizeof(LOGFONTA));
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ::GetObject(hFont, sizeof(LOGFONTA), &lf);
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ::DeleteObject(hFont);
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (strlen(lf.lfFaceName) > 0) {
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName)
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDocument == NULL || csFontName.IsEmpty()) {
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Font* pFont = NULL;
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csFontName == "ZapfDingbats") {
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, NULL);
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI);
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, &encoding);
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pFont;
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_InterForm::GetNativeFont(FX_BYTE charSet, FX_LPVOID pLogFont)
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csFontName;
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LOGFONTA lf;
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BOOL bRet;
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (charSet == ANSI_CHARSET) {
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFontName = "Helvetica";
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csFontName;
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bRet = FALSE;
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (charSet == SHIFTJIS_CHARSET) {
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MS Mincho", lf);
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (charSet == GB2312_CHARSET) {
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSun", lf);
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (charSet == CHINESEBIG5_CHARSET) {
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingLiU", lf);
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bRet) {
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Arial Unicode MS", lf);
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bRet) {
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Microsoft Sans Serif", lf);
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bRet) {
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf);
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bRet) {
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pLogFont != NULL) {
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            memcpy(pLogFont, &lf, sizeof(LOGFONTA));
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csFontName = lf.lfFaceName;
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csFontName;
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return csFontName;
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_InterForm::GetNativeFont(FX_LPVOID pLogFont)
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE charSet = GetNativeCharSet();
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetNativeFont(charSet, pLogFont);
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString();
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BYTE CPDF_InterForm::GetNativeCharSet()
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE charSet = ANSI_CHARSET;
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    UINT iCodePage = ::GetACP();
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (iCodePage) {
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 932:
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = SHIFTJIS_CHARSET;
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 936:
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = GB2312_CHARSET;
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 950:
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = CHINESEBIG5_CHARSET;
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1252:
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = ANSI_CHARSET;
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 874:
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = THAI_CHARSET;
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 949:
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = HANGUL_CHARSET;
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1200:
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = ANSI_CHARSET;
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1250:
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = EASTEUROPE_CHARSET;
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1251:
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = RUSSIAN_CHARSET;
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1253:
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = GREEK_CHARSET;
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1254:
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = TURKISH_CHARSET;
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1255:
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = HEBREW_CHARSET;
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1256:
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = ARABIC_CHARSET;
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1257:
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = BALTIC_CHARSET;
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1258:
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = VIETNAMESE_CHARSET;
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case 1361:
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            charSet = JOHAB_CHARSET;
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return charSet;
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddNativeFont(FX_BYTE charSet, const CPDF_Document* pDocument)
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDocument == NULL) {
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Font* pFont = NULL;
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LOGFONTA lf;
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csFontName = GetNativeFont(charSet, &lf);
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!csFontName.IsEmpty()) {
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (csFontName == "Helvetica") {
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pFont = AddStandardFont(pDocument, csFontName);
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pFont;
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddNativeFont(const CPDF_Document* pDocument)
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDocument == NULL) {
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Font* pFont = NULL;
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_BYTE charSet = GetNativeCharSet();
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pFont = AddNativeFont(charSet, pDocument);
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pFont;
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl)
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csNewFieldName.IsEmpty()) {
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int iPos = 0;
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int iLength = csNewFieldName.GetLength();
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString csSub;
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (TRUE) {
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (iPos < iLength && (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) {
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            iPos ++;
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iPos < iLength && !csSub.IsEmpty()) {
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csSub += L'.';
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (iPos < iLength && csNewFieldName[iPos] != L'.') {
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            csSub += csNewFieldName[iPos ++];
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (int i = csSub.GetLength() - 1; i > -1; i --) {
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (csSub[i] == L' ' || csSub[i] == L'.') {
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                csSub.SetAt(i, L'\0');
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields();
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (FX_DWORD m = 0; m < dwCount; m ++) {
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m);
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pField == NULL) {
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pField == pExcludedField) {
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pExcludedControl != NULL) {
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    if (pField->CountControls() < 2) {
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        continue;
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    }
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_WideString csFullName = pField->GetFullName();
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int iRet = CompareFieldName(csSub, csFullName);
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (iRet == 1) {
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pField->GetFieldType() != iType) {
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else if (iRet == 2 && csSub == csNewFieldName) {
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (csFullName[iPos] == L'.') {
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else if (iRet == 3 && csSub == csNewFieldName) {
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (csNewFieldName[csFullName.GetLength()] == L'.') {
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FALSE;
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iPos >= iLength) {
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csSub.IsEmpty()) {
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    csNewFieldName = csSub;
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType)
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ValidateFieldName(csNewFieldName, iType, NULL, NULL);
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName)
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pField == NULL || csNewFieldName.IsEmpty()) {
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ValidateFieldName(csNewFieldName, ((CPDF_FormField*)pField)->GetFieldType(), pField, NULL);
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName)
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pControl == NULL || csNewFieldName.IsEmpty()) {
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField();
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pControl);
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2)
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCSTR ptr1 = name1, ptr2 = name2;
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (name1.GetLength() != name2.GetLength()) {
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int i = 0;
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (ptr1[i] == ptr2[i]) {
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            i ++;
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (i == name1.GetLength()) {
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 2;
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (i == name2.GetLength()) {
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 3;
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return name1 == name2 ? 1 : 0;
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2)
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCWSTR ptr1 = name1, ptr2 = name2;
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (name1.GetLength() != name2.GetLength()) {
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int i = 0;
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (ptr1[i] == ptr2[i]) {
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            i ++;
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (i == name1.GetLength()) {
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 2;
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (i == name2.GetLength()) {
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 3;
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return name1 == name2 ? 1 : 0;
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName)
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csFieldName.IsEmpty()) {
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_DWORD)m_pFieldTree->m_Root.CountFields();
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pNode == NULL) {
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pNode->CountFields();
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index, const CFX_WideString &csFieldName)
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csFieldName == L"") {
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pFieldTree->m_Root.GetField(index);
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pNode == NULL) {
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pNode->GetField(index);
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames)
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    allFieldNames.RemoveAll();
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int nCount = m_pFieldTree->m_Root.CountFields();
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < nCount; i ++) {
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pField) {
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_WideString full_name = GetFullName(pField->GetFieldDict());
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            allFieldNames.Add(full_name);
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::IsValidFormField(const void* pField)
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pField == NULL) {
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int nCount = m_pFieldTree->m_Root.CountFields();
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < nCount; i++) {
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField *pFormField = m_pFieldTree->m_Root.GetField(i);
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pField == pFormField) {
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::GetFieldByDict(CPDF_Dictionary* pFieldDict) const
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFieldDict == NULL) {
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString csWName = GetFullName(pFieldDict);
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pFieldTree->GetField(csWName);
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_InterForm::CountControls(CFX_WideString csFieldName)
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csFieldName.IsEmpty()) {
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_DWORD)m_ControlMap.GetCount();
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pField == NULL) {
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pField->m_ControlList.GetSize();
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::GetControl(FX_DWORD index, CFX_WideString csFieldName)
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pField == NULL) {
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (index < (FX_DWORD)pField->m_ControlList.GetSize()) {
830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (CPDF_FormControl *)pField->m_ControlList.GetAt(index);
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::IsValidFormControl(const void* pControl)
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pControl == NULL) {
837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = m_ControlMap.GetStartPosition();
840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pWidgetDict = NULL;
842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        void* pFormControl = NULL;
843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, pFormControl);
844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pControl == pFormControl) {
845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::CountPageControls(CPDF_Page* pPage) const
851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pAnnotList == NULL) {
854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count = 0;
857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pAnnot == NULL) {
860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormControl* pControl;
863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        count ++;
867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return count;
869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
870ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::GetPageControl(CPDF_Page* pPage, int index) const
871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pAnnotList == NULL) {
874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int count = 0;
877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pAnnot == NULL) {
880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormControl* pControl;
883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (index == count) {
887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pControl;
888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        count ++;
890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
893ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const
894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pAnnotList == NULL) {
897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_DWORD i = pAnnotList->GetCount(); i > 0; i --) {
900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i - 1);
901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pAnnot == NULL) {
902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormControl* pControl;
905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_FloatRect rect = pControl->GetRect();
909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (rect.Contains(pdf_x, pdf_y)) {
910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return pControl;
911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
915ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict) const
916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormControl* pControl = NULL;
918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ControlMap.Lookup(pWidgetDict, (FX_LPVOID&)pControl);
919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pControl;
920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
921ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName) const
922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL) {
924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pArray == NULL) {
928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csFieldName.IsEmpty()) {
931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pArray->GetCount();
932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iLength = csFieldName.GetLength();
934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iPos = 0;
935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pDict = NULL;
936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (pArray != NULL) {
937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_WideString csSub;
938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (iPos < iLength && csFieldName[iPos] == L'.') {
939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                iPos ++;
940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            while (iPos < iLength && csFieldName[iPos] != L'.') {
942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                csSub += csFieldName[iPos ++];
943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int iCount = pArray->GetCount();
945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL bFind = FALSE;
946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            for (int i = 0; i < iCount; i ++) {
947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict = pArray->GetDict(i);
948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pDict == NULL) {
949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CFX_WideString csT = pDict->GetUnicodeText("T");
952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (csT == csSub) {
953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    bFind = TRUE;
954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!bFind) {
958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return 0;
959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (iPos >= iLength) {
961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pArray = pDict->GetArray("Kids");
964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDict == NULL) {
966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0;
967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pArray = pDict->GetArray("Kids");
969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pArray == NULL) {
970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return 1;
971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pArray->GetCount();
973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
977ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName) const
978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL) {
980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pArray == NULL) {
984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csFieldName.IsEmpty()) {
987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pArray->GetDict(index);
988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iLength = csFieldName.GetLength();
990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iPos = 0;
991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pDict = NULL;
992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (pArray != NULL) {
993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_WideString csSub;
994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (iPos < iLength && csFieldName[iPos] == L'.') {
995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                iPos ++;
996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            while (iPos < iLength && csFieldName[iPos] != L'.') {
998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                csSub += csFieldName[iPos ++];
999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            int iCount = pArray->GetCount();
1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_BOOL bFind = FALSE;
1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            for (int i = 0; i < iCount; i ++) {
1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict = pArray->GetDict(i);
1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pDict == NULL) {
1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    continue;
1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CFX_WideString csT = pDict->GetUnicodeText("T");
1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (csT == csSub) {
1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    bFind = TRUE;
1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!bFind) {
1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (iPos >= iLength) {
1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pArray = pDict->GetArray("Kids");
1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pDict == NULL) {
1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pArray = pDict->GetArray("Kids");
1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pArray == NULL) {
1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pDict;
1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pArray->GetDict(index);
1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::NeedConstructAP()
1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL) {
1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pFormDict->GetBoolean("NeedAppearances");
1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP)
1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL) {
1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        InitInterFormDict(m_pFormDict, m_pDocument);
1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP);
1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bGenerateAP = bNeedAP;
1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::CountFieldsInCalculationOrder()
1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL) {
1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = m_pFormDict->GetArray("CO");
1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pArray == NULL) {
1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pArray->GetCount();
1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index)
1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL || index < 0) {
1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = m_pFormDict->GetArray("CO");
1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pArray == NULL) {
1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pElement = pArray->GetElementValue(index);
1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) {
1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return GetFieldByDict((CPDF_Dictionary*)pElement);
1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField)
1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL || pField == NULL) {
1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return -1;
1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = m_pFormDict->GetArray("CO");
1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pArray == NULL) {
1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return -1;
1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pElement = pArray->GetElementValue(i);
1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pElement == pField->m_pDict) {
1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return i;
1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return -1;
1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_InterForm::CountFormFonts()
1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CountInterFormFonts(m_pFormDict);
1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag)
1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag);
1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag)
1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag);
1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag)
1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag);
1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)
1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag)
1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)
1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FindInterFormFont(m_pFormDict, pFont, csNameTag);
1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont, csNameTag);
1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)
1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag);
1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bUpdated = TRUE;
1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)
1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bUpdated = TRUE;
1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag)
1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bUpdated = TRUE;
1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont)
1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bUpdated = TRUE;
1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    RemoveInterFormFont(m_pFormDict, pFont);
1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag)
1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bUpdated = TRUE;
1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    RemoveInterFormFont(m_pFormDict, csNameTag);
1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance()
1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csDA;
1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL) {
1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return csDA;
1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    csDA = m_pFormDict->GetString("DA");
1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return csDA;
1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Font* CPDF_InterForm::GetDefaultFormFont()
1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetDefaultInterFormFont(m_pFormDict, m_pDocument);
1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::GetFormAlignment()
1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL) {
1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pFormDict->GetInteger("Q", 0);
1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bNotify)
1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bNotify && m_pFormNotify != NULL) {
1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iRet = m_pFormNotify->BeforeFormReset(this);
1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iRet < 0) {
1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int nCount = m_pFieldTree->m_Root.CountFields();
1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < nCount; i++) {
1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pField == NULL) {
1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bFind = FALSE;
1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iCount = fields.GetSize();
1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (int i = 0; i < iCount; i ++) {
1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pField == (CPDF_FormField*)fields[i]) {
1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                bFind = TRUE;
1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                break;
1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pField->ResetField(bNotify);
1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bNotify && m_pFormNotify != NULL) {
1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pFormNotify->AfterFormReset(this);
1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify)
1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bNotify && m_pFormNotify != NULL) {
1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iRet = m_pFormNotify->BeforeFormReset(this);
1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iRet < 0) {
1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int nCount = m_pFieldTree->m_Root.CountFields();
1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < nCount; i++) {
1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pField == NULL) {
1211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pField->ResetField(bNotify);
1214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bNotify && m_pFormNotify != NULL) {
1216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pFormNotify->AfterFormReset(this);
1217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::ReloadForm()
1221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = m_ControlMap.GetStartPosition();
1223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
1224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pWidgetDict;
1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormControl* pControl;
1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, (FX_LPVOID&)pControl);
1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pControl;
1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ControlMap.RemoveAll();
1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int nCount = m_pFieldTree->m_Root.CountFields();
1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int k = 0; k < nCount; k ++) {
1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(k);
1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pField;
1234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFieldTree->RemoveAll();
1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pFormDict == NULL) {
1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
1240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFields == NULL) {
1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int iCount = pFields->GetCount();
1244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < iCount; i ++) {
1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        LoadField(pFields->GetDict(i));
1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel)
1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (nLevel > nMaxRecursion) {
1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFieldDict == NULL) {
1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwParentObjNum = pFieldDict->GetObjNum();
1257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pKids = pFieldDict->GetArray("Kids");
1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pKids) {
1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        AddTerminalField(pFieldDict);
1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pFirstKid = pKids->GetDict(0);
1263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFirstKid == NULL) {
1264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) {
1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Dictionary * pChildDict = pKids->GetDict(i);
1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pChildDict) {
1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pChildDict->GetObjNum() != dwParentObjNum) {
1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    LoadField(pChildDict, nLevel + 1);
1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        AddTerminalField(pFieldDict);
1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::HasXFAForm() const
1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pFormDict && m_pFormDict->GetArray(FX_BSTRC("XFA")) != NULL;
1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::FixPageFields(const CPDF_Page* pPage)
1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(pPage != NULL);
1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pPageDict == NULL) {
1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pAnnots = pPageDict->GetArray(FX_BSTRC("Annots"));
1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pAnnots == NULL) {
1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int iAnnotCount = pAnnots->GetCount();
1295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < iAnnotCount; i++) {
1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pAnnot = pAnnots->GetDict(i);
1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pAnnot != NULL && pAnnot->GetString(FX_BSTRC("Subtype")) == "Widget") {
1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            LoadField(pAnnot);
1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::AddTerminalField(const CPDF_Dictionary* pFieldDict)
1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pFieldDict->KeyExist(FX_BSTRC("T"))) {
1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict;
1308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString csWName = GetFullName(pDict);
1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csWName.IsEmpty()) {
1310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormField* pField = NULL;
1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pField = m_pFieldTree->GetField(csWName);
1314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pField == NULL) {
1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary *pParent = (CPDF_Dictionary*)pFieldDict;
1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pFieldDict->KeyExist(FX_BSTR("T")) &&
1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pFieldDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) {
1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pParent = pFieldDict->GetDict(FX_BSTRC("Parent"));
1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (!pParent) {
1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pParent = (CPDF_Dictionary*)pFieldDict;
1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pParent && pParent != pFieldDict && !pParent->KeyExist(FX_BSTRC("FT"))) {
1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pFieldDict->KeyExist(FX_BSTRC("FT"))) {
1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object *pFTValue = pFieldDict->GetElementValue(FX_BSTRC("FT"));
1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pFTValue) {
1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pParent->SetAt(FX_BSTRC("FT"), pFTValue->Clone());
1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pFieldDict->KeyExist(FX_BSTRC("Ff"))) {
1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object *pFfValue = pFieldDict->GetElementValue(FX_BSTRC("Ff"));
1332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pFfValue) {
1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pParent->SetAt(FX_BSTRC("Ff"), pFfValue->Clone());
1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pField = FX_NEW CPDF_FormField(this, pParent);
1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* pTObj = pDict->GetElement("T");
1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pTObj && pTObj->GetType() == PDFOBJ_REFERENCE) {
1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Object* pClone = pTObj->Clone(TRUE);
1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pClone) {
1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict->SetAt("T", pClone);
1343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pDict->SetAtName("T", "");
1345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pFieldTree->SetField(csWName, pField);
1348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pKids = pFieldDict->GetArray("Kids");
1350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pKids == NULL) {
1351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pFieldDict->GetString("Subtype") == "Widget") {
1352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            AddControl(pField, pFieldDict);
1353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
1355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
1356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Dictionary* pKid = pKids->GetDict(i);
1357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pKid == NULL) {
1358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
1359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pKid->GetString("Subtype") != "Widget") {
1361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
1362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            AddControl(pField, pKid);
1364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pField;
1367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1368ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict)
1369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    void *rValue = NULL;
1371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_ControlMap.Lookup((CPDF_Dictionary*)pWidgetDict, rValue)) {
1372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (CPDF_FormControl*)rValue;
1373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormControl* pControl = FX_NEW CPDF_FormControl((CPDF_FormField*)pField, (CPDF_Dictionary*)pWidgetDict);
1375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pControl == NULL) {
1376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_ControlMap.SetAt((CPDF_Dictionary*)pWidgetDict, pControl);
1379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ((CPDF_FormField*)pField)->m_ControlList.Add(pControl);
1380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pControl;
1381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1382ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_FormField* CPDF_InterForm::CheckRequiredFields(const CFX_PtrArray *fields, FX_BOOL bIncludeOrExclude) const
1383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int nCount = m_pFieldTree->m_Root.CountFields();
1385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < nCount; i++) {
1386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pField == NULL) {
1388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_INT32 iType = pField->GetType();
1391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iType == CPDF_FormField::PushButton || iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) {
1392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwFlags = pField->GetFieldFlags();
1395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwFlags & 0x04) {
1396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bFind = TRUE;
1399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (fields != NULL) {
1400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            bFind = fields->Find(pField, 0) >= 0;
1401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
1403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Dictionary *pFieldDict = pField->m_pDict;
1404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) {
1405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pField;
1406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
1410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1411ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec) const
1412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_PtrArray fields;
1414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int nCount = m_pFieldTree->m_Root.CountFields();
1415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < nCount; i ++) {
1416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        fields.Add(pField);
1418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec);
1420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1421ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath);
1422ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bSimpleFileSpec) const
1423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();
1425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDoc == NULL) {
1426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF");
1429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pdf_path.IsEmpty()) {
1430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bSimpleFileSpec) {
1431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path);
1432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pMainDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsFilePath));
1433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath));
1434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else {
1435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_FileSpec filespec;
1436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            filespec.SetFileName(pdf_path);
1437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pMainDict->SetAt("F", (CPDF_Object*)filespec);
1438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pFields = CPDF_Array::Create();
1441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFields == NULL) {
1442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pMainDict->SetAt("Fields", pFields);
1445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int nCount = m_pFieldTree->m_Root.CountFields();
1446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < nCount; i ++) {
1447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
1448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) {
1449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwFlags = pField->GetFieldFlags();
1452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (dwFlags & 0x04) {
1453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bFind = fields.Find(pField, 0) >= 0;
1456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
1457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) {
1458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
1459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CFX_WideString fullname = GetFullName(pField->GetFieldDict());
1461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();
1462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pFieldDict == NULL) {
1463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
1464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_String* pString = CPDF_String::Create(fullname);
1466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pString == NULL) {
1467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pFieldDict->Release();
1468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
1469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pFieldDict->SetAt("T", pString);
1471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pField->GetType() == CPDF_FormField::CheckBox || pField->GetType() == CPDF_FormField::RadioButton) {
1472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CFX_WideString csExport = pField->GetCheckValue(FALSE);
1473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CFX_ByteString csBExport = PDF_EncodeText(csExport);
1474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt");
1475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pOpt == NULL) {
1476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pFieldDict->SetAtName("V", csBExport);
1477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
1478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pFieldDict->SetAtString("V", csBExport);
1479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
1481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");
1482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pV != NULL) {
1483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pFieldDict->SetAt("V", pV->Clone(TRUE));
1484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
1485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pFields->Add(pFieldDict);
1487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pDoc;
1490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconst struct _SupportFieldEncoding {
1492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPCSTR m_name;
1493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 m_codePage;
1494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} g_fieldEncoding[] = {
1495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    "BigFive", 950,
1496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    "GBK", 936,
1497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    "Shift-JIS", 932,
1498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    "UHC", 949,
1499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
1500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary *pFieldDict, CFX_WideString &csValue, CFX_ByteString &bsEncoding)
1501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(pFieldDict != NULL);
1503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csBValue = pFieldDict->GetString("V");
1504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]);
1505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_INT32 i = 0;
1506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (; i < iCount; ++i)
1507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (bsEncoding == g_fieldEncoding[i].m_name) {
1508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
1509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (i < iCount) {
1511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_CharMap *pCharMap = CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage);
1512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FXSYS_assert(pCharMap != NULL);
1513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csValue.ConvertFrom(csBValue, pCharMap);
1514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteString csTemp = csBValue.Left(2);
1517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") {
1518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csValue = PDF_DecodeText(csBValue);
1519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
1520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        csValue = CFX_WideString::FromLocal(csBValue);
1521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, const CFX_WideString& parent_name, FX_BOOL bNotify, int nLevel)
1524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString name;
1526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!parent_name.IsEmpty()) {
1527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        name = parent_name + L".";
1528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    name += pFieldDict->GetUnicodeText("T");
1530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pKids = pFieldDict->GetArray("Kids");
1531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pKids) {
1532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
1533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Dictionary* pKid = pKids->GetDict(i);
1534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pKid == NULL) {
1535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
1536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (nLevel <= nMaxRecursion) {
1538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FDF_ImportField(pKid, name, bNotify, nLevel + 1);
1539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pFieldDict->KeyExist("V")) {
1544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormField* pField = m_pFieldTree->GetField(name);
1547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pField == NULL) {
1548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_WideString csWValue;
1551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding);
1552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int iType = pField->GetFieldType();
1553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bNotify && m_pFormNotify != NULL) {
1554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iRet = 0;
1555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iType == FIELDTYPE_LISTBOX) {
1556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue);
1557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
1558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            iRet = m_pFormNotify->BeforeValueChange(pField, csWValue);
1559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iRet < 0) {
1561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_ByteArray statusArray;
1565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
1566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SaveCheckedFieldStatus(pField, statusArray);
1567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pField->SetValue(csWValue);
1569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_FormField::Type eType = pField->GetType();
1570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && pFieldDict->KeyExist("Opt")) {
1571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pField->m_pDict->SetAt("Opt", pFieldDict->GetElementValue("Opt")->Clone(TRUE));
1572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bNotify && m_pFormNotify != NULL) {
1574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
1575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pFormNotify->AfterCheckedStatusChange(pField, statusArray);
1576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (iType == FIELDTYPE_LISTBOX) {
1577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pFormNotify->AfterSelectionChange(pField);
1578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
1579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pFormNotify->AfterValueChange(pField);
1580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (CPDF_InterForm::m_bUpdateAP) {
1583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pField->UpdateAP(NULL);
1584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1586ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, FX_BOOL bNotify)
1587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFDF == NULL) {
1589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
1592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pMainDict == NULL) {
1593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pFields = pMainDict->GetArray("Fields");
1596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pFields == NULL) {
1597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bsEncoding = pMainDict->GetString(FX_BSTRC("Encoding"));
1600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bNotify && m_pFormNotify != NULL) {
1601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        int iRet = m_pFormNotify->BeforeFormImportData(this);
1602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iRet < 0) {
1603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (FX_DWORD i = 0; i < pFields->GetCount(); i ++) {
1607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pField = pFields->GetDict(i);
1608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pField == NULL) {
1609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FDF_ImportField(pField, L"", bNotify);
1612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bNotify && m_pFormNotify != NULL) {
1614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pFormNotify->AfterFormImportData(this);
1615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify)
1619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFormNotify = (CPDF_FormNotify*)pNotify;
1621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_InterForm::GetPageWithWidget(int iCurPage, FX_BOOL bNext)
1623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (iCurPage < 0) {
1625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return -1;
1626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int iPageCount = m_pDocument->GetPageCount();
1628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (iCurPage >= iPageCount) {
1629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return -1;
1630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int iNewPage = iCurPage;
1632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    do {
1633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        iNewPage += bNext ? 1 : -1;
1634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iNewPage >= iPageCount) {
1635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            iNewPage = 0;
1636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iNewPage < 0) {
1638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            iNewPage = iPageCount - 1;
1639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (iNewPage == iCurPage) {
1641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
1642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iNewPage);
1644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pPageDict == NULL) {
1645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Array* pAnnots = pPageDict->GetArray("Annots");
1648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pAnnots == NULL) {
1649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            continue;
1650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwCount = pAnnots->GetCount();
1652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        for (FX_DWORD i = 0; i < dwCount; i ++) {
1653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_Object* pAnnotDict = pAnnots->GetElementValue(i);
1654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (pAnnotDict == NULL) {
1655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                continue;
1656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            CPDF_FormControl* pControl = NULL;
1658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) {
1659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return iNewPage;
1660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } while (TRUE);
1663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return -1;
1664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1665