14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FPDFDOC_CPDF_INTERFORM_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FPDFDOC_CPDF_INTERFORM_H_
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <map>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/fpdf_parser_decode.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_defaultappearance.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_string.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_system.h"
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/unowned_ptr.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFieldTree;
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFDF_Document;
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_Document;
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_Dictionary;
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_Font;
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_FormControl;
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_FormField;
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_Object;
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_Page;
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass IPDF_FormNotify;
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict,
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  CPDF_Document* pDocument,
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  ByteString* csNameTag);
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_InterForm {
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  explicit CPDF_InterForm(CPDF_Document* pDocument);
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CPDF_InterForm();
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static void SetUpdateAP(bool bUpdateAP);
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static bool IsUpdateAPEnabled();
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  static ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict,
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                            const char* csType,
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                            int iMinLen,
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                            const char* csPrefix);
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static CPDF_Font* AddStandardFont(CPDF_Document* pDocument,
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                    ByteString csFontName);
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  static ByteString GetNativeFont(uint8_t iCharSet, void* pLogFont);
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static uint8_t GetNativeCharSet();
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static CPDF_Font* AddNativeFont(uint8_t iCharSet, CPDF_Document* pDocument);
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static CPDF_Font* AddNativeFont(CPDF_Document* pDocument);
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  size_t CountFields(const WideString& csFieldName) const;
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPDF_FormField* GetField(uint32_t index, const WideString& csFieldName) const;
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const;
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage,
5833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                      const CFX_PointF& point,
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      int* z_order) const;
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_FormControl* GetControlByDict(const CPDF_Dictionary* pWidgetDict) const;
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool NeedConstructAP() const;
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int CountFieldsInCalculationOrder();
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_FormField* GetFieldInCalculationOrder(int index);
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int FindFieldInCalculationOrder(const CPDF_FormField* pField);
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPDF_Font* GetFormFont(ByteString csNameTag) const;
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_DefaultAppearance GetDefaultAppearance() const;
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetFormAlignment() const;
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  bool CheckRequiredFields(const std::vector<CPDF_FormField*>* fields,
7233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                           bool bIncludeOrExclude) const;
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::unique_ptr<CFDF_Document> ExportToFDF(const WideString& pdf_path,
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             bool bSimpleFileSpec) const;
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFDF_Document> ExportToFDF(
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      const WideString& pdf_path,
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      const std::vector<CPDF_FormField*>& fields,
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bool bIncludeOrExclude,
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bool bSimpleFileSpec) const;
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ResetForm(const std::vector<CPDF_FormField*>& fields,
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 bool bIncludeOrExclude,
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 bool bNotify);
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ResetForm(bool bNotify);
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetFormNotify(IPDF_FormNotify* pNotify);
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool HasXFAForm() const;
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void FixPageFields(const CPDF_Page* pPage);
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  IPDF_FormNotify* GetFormNotify() const { return m_pFormNotify.Get(); }
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPDF_Document* GetDocument() const { return m_pDocument.Get(); }
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPDF_Dictionary* GetFormDict() const { return m_pFormDict.Get(); }
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann private:
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void LoadField(CPDF_Dictionary* pFieldDict, int nLevel);
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void AddTerminalField(CPDF_Dictionary* pFieldDict);
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_FormControl* AddControl(CPDF_FormField* pField,
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               CPDF_Dictionary* pWidgetDict);
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void FDF_ImportField(CPDF_Dictionary* pField,
102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                       const WideString& parent_name,
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       bool bNotify = false,
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       int nLevel = 0);
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  static bool s_bUpdateAP;
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UnownedPtr<CPDF_Document> const m_pDocument;
109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UnownedPtr<CPDF_Dictionary> m_pFormDict;
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::map<const CPDF_Dictionary*, std::unique_ptr<CPDF_FormControl>>
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_ControlMap;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFieldTree> m_pFieldTree;
113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ByteString m_bsEncoding;
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UnownedPtr<IPDF_FormNotify> m_pFormNotify;
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // CORE_FPDFDOC_CPDF_INTERFORM_H_
118