1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_
8 #define CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_
9 
10 #include <map>
11 #include <memory>
12 #include <vector>
13 
14 #include "core/include/fpdfapi/fpdf_parser.h"
15 #include "core/include/fpdfapi/fpdf_render.h"
16 
17 class CFieldTree;
18 class CPDF_AAction;
19 class CPDF_Action;
20 class CPDF_ActionFields;
21 class CPDF_Annot;
22 class CPDF_AnnotList;
23 class CPDF_ApSettings;
24 class CPDF_Bookmark;
25 class CPDF_BookmarkTree;
26 class CPDF_DefaultAppearance;
27 class CPDF_Dest;
28 class CPDF_DocJSActions;
29 class CPDF_FileSpec;
30 class CPDF_FormControl;
31 class CPDF_FormField;
32 class CPDF_FormNotify;
33 class CPDF_IconFit;
34 class CPDF_InterForm;
35 class CPDF_Link;
36 class CPDF_Metadata;
37 class CPDF_NumberTree;
38 class CPDF_OCContext;
39 class CPDF_Page;
40 class CPDF_RenderOptions;
41 class CPDF_TextObject;
42 class CPDF_ViewerPreferences;
43 class CXML_Element;
44 
45 class CPDF_NameTree {
46  public:
CPDF_NameTree(CPDF_Dictionary * pRoot)47   explicit CPDF_NameTree(CPDF_Dictionary* pRoot) { m_pRoot = pRoot; }
48 
49   CPDF_NameTree(CPDF_Document* pDoc, const CFX_ByteStringC& category);
50 
51   CPDF_Object* LookupValue(int nIndex, CFX_ByteString& csName) const;
52 
53   CPDF_Object* LookupValue(const CFX_ByteString& csName) const;
54 
55   CPDF_Array* LookupNamedDest(CPDF_Document* pDoc,
56                               const CFX_ByteStringC& sName);
57 
58   int GetIndex(const CFX_ByteString& csName) const;
59 
60   int GetCount() const;
61 
GetRoot()62   CPDF_Dictionary* GetRoot() const { return m_pRoot; }
63 
64  protected:
65   CPDF_Dictionary* m_pRoot;
66 };
67 class CPDF_BookmarkTree {
68  public:
CPDF_BookmarkTree(CPDF_Document * pDoc)69   explicit CPDF_BookmarkTree(CPDF_Document* pDoc) : m_pDocument(pDoc) {}
70 
71   CPDF_Bookmark GetFirstChild(const CPDF_Bookmark& parent) const;
72 
73   CPDF_Bookmark GetNextSibling(const CPDF_Bookmark& bookmark) const;
74 
GetDocument()75   CPDF_Document* GetDocument() const { return m_pDocument; }
76 
77  protected:
78   CPDF_Document* m_pDocument;
79 };
80 #define PDFBOOKMARK_ITALIC 1
81 #define PDFBOOKMARK_BOLD 2
82 class CPDF_Bookmark {
83  public:
CPDF_Bookmark()84   CPDF_Bookmark() : m_pDict(NULL) {}
85 
CPDF_Bookmark(CPDF_Dictionary * pDict)86   explicit CPDF_Bookmark(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
87 
GetDict()88   CPDF_Dictionary* GetDict() const { return m_pDict; }
89 
90   operator bool() const { return m_pDict != NULL; }
91 
92   FX_DWORD GetColorRef() const;
93 
94   FX_DWORD GetFontStyle() const;
95 
96   CFX_WideString GetTitle() const;
97 
98   CPDF_Dest GetDest(CPDF_Document* pDocument) const;
99 
100   CPDF_Action GetAction() const;
101 
102   CPDF_Dictionary* m_pDict;
103 };
104 #define PDFZOOM_XYZ 1
105 #define PDFZOOM_FITPAGE 2
106 #define PDFZOOM_FITHORZ 3
107 #define PDFZOOM_FITVERT 4
108 #define PDFZOOM_FITRECT 5
109 #define PDFZOOM_FITBBOX 6
110 #define PDFZOOM_FITBHORZ 7
111 #define PDFZOOM_FITBVERT 8
112 class CPDF_Dest {
113  public:
CPDF_Dest()114   CPDF_Dest() : m_pObj(nullptr) {}
CPDF_Dest(CPDF_Object * pObj)115   explicit CPDF_Dest(CPDF_Object* pObj) : m_pObj(pObj) {}
116 
117   operator bool() const { return m_pObj != NULL; }
GetObject()118   CPDF_Object* GetObject() const { return m_pObj; }
119 
120   CFX_ByteString GetRemoteName();
121   int GetPageIndex(CPDF_Document* pDoc);
122   FX_DWORD GetPageObjNum();
123   int GetZoomMode();
124   FX_FLOAT GetParam(int index);
125 
126  protected:
127   CPDF_Object* m_pObj;
128 };
129 class CPDF_OCContext : public IPDF_OCContext {
130  public:
131   enum UsageType { View = 0, Design, Print, Export };
132 
133   explicit CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType = View);
134   ~CPDF_OCContext() override;
135 
GetDocument()136   CPDF_Document* GetDocument() const { return m_pDocument; }
137 
GetUsageType()138   UsageType GetUsageType() const { return m_eUsageType; }
139 
140   FX_BOOL CheckOCGVisible(const CPDF_Dictionary* pOCGDict) override;
141 
142   void ResetOCContext();
143 
144  protected:
145   FX_BOOL LoadOCGStateFromConfig(const CFX_ByteStringC& csConfig,
146                                  const CPDF_Dictionary* pOCGDict,
147                                  FX_BOOL& bValidConfig) const;
148 
149   FX_BOOL LoadOCGState(const CPDF_Dictionary* pOCGDict) const;
150 
151   FX_BOOL GetOCGVisible(const CPDF_Dictionary* pOCGDict);
152 
153   FX_BOOL GetOCGVE(CPDF_Array* pExpression,
154                    FX_BOOL bFromConfig,
155                    int nLevel = 0);
156 
157   FX_BOOL LoadOCMDState(const CPDF_Dictionary* pOCMDDict, FX_BOOL bFromConfig);
158 
159   CPDF_Document* m_pDocument;
160 
161   UsageType m_eUsageType;
162 
163   std::map<const CPDF_Dictionary*, FX_BOOL> m_OCGStates;
164 };
165 
166 class CPDF_ActionFields {
167  public:
168   // TODO(thestig): Examine why this cannot be explicit.
CPDF_ActionFields(const CPDF_Action * pAction)169   CPDF_ActionFields(const CPDF_Action* pAction) {
170     m_pAction = (CPDF_Action*)pAction;
171   }
172 
173   // TODO(thestig): Replace this.
174   operator CPDF_Action*() const { return m_pAction; }
175 
176   FX_DWORD GetFieldsCount() const;
177 
178   std::vector<CPDF_Object*> GetAllFields() const;
179 
180   CPDF_Object* GetField(FX_DWORD iIndex) const;
181 
182   CPDF_Action* m_pAction;
183 };
184 
185 #define PDFNAMED_NEXTPAGE 1
186 #define PDFNAMED_PREVPAGE 2
187 #define PDFNAMED_FIRSTPAGE 3
188 #define PDFNAMED_LASTPAGE 4
189 #define PDFJS_MAXLENGTH 64
190 class CPDF_Action {
191  public:
192   enum ActionType {
193     Unknown = 0,
194     GoTo,
195     GoToR,
196     GoToE,
197     Launch,
198     Thread,
199     URI,
200     Sound,
201     Movie,
202     Hide,
203     Named,
204     SubmitForm,
205     ResetForm,
206     ImportData,
207     JavaScript,
208     SetOCGState,
209     Rendition,
210     Trans,
211     GoTo3DView
212   };
213 
CPDF_Action()214   CPDF_Action() : m_pDict(nullptr) {}
CPDF_Action(CPDF_Dictionary * pDict)215   explicit CPDF_Action(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
216 
217   operator bool() const { return m_pDict != NULL; }
218 
GetDict()219   CPDF_Dictionary* GetDict() const { return m_pDict; }
220 
GetTypeName()221   CFX_ByteString GetTypeName() const { return m_pDict->GetString("S"); }
222 
223   ActionType GetType() const;
224 
225   CPDF_Dest GetDest(CPDF_Document* pDoc) const;
226 
227   CFX_WideString GetFilePath() const;
228 
GetNewWindow()229   FX_BOOL GetNewWindow() const { return m_pDict->GetBoolean("NewWindow"); }
230 
231   CFX_ByteString GetURI(CPDF_Document* pDoc) const;
232 
GetMouseMap()233   FX_BOOL GetMouseMap() const { return m_pDict->GetBoolean("IsMap"); }
234 
GetWidgets()235   CPDF_ActionFields GetWidgets() const { return this; }
236 
GetHideStatus()237   FX_BOOL GetHideStatus() const { return m_pDict->GetBoolean("H", TRUE); }
238 
GetNamedAction()239   CFX_ByteString GetNamedAction() const { return m_pDict->GetString("N"); }
240 
GetFlags()241   FX_DWORD GetFlags() const { return m_pDict->GetInteger("Flags"); }
242 
243   CFX_WideString GetJavaScript() const;
244 
245   CPDF_Dictionary* GetAnnot() const;
246 
247   int32_t GetOperationType() const;
248 
GetSoundStream()249   CPDF_Stream* GetSoundStream() const { return m_pDict->GetStream("Sound"); }
250 
GetVolume()251   FX_FLOAT GetVolume() const { return m_pDict->GetNumber("Volume"); }
252 
IsSynchronous()253   FX_BOOL IsSynchronous() const { return m_pDict->GetBoolean("Synchronous"); }
254 
IsRepeat()255   FX_BOOL IsRepeat() const { return m_pDict->GetBoolean("Repeat"); }
256 
IsMixPlay()257   FX_BOOL IsMixPlay() const { return m_pDict->GetBoolean("Mix"); }
258 
259   FX_DWORD GetSubActionsCount() const;
260 
261   CPDF_Action GetSubAction(FX_DWORD iIndex) const;
262 
263  protected:
264   CPDF_Dictionary* m_pDict;
265 };
266 class CPDF_AAction {
267  public:
268   // TODO(thestig): Examine why this cannot be explicit.
269   CPDF_AAction(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
270 
271   operator CPDF_Dictionary*() const { return m_pDict; }
272 
273   enum AActionType {
274     CursorEnter = 0,
275     CursorExit,
276     ButtonDown,
277     ButtonUp,
278     GetFocus,
279     LoseFocus,
280     PageOpen,
281     PageClose,
282     PageVisible,
283     PageInvisible,
284     OpenPage,
285     ClosePage,
286     KeyStroke,
287     Format,
288     Validate,
289     Calculate,
290     CloseDocument,
291     SaveDocument,
292     DocumentSaved,
293     PrintDocument,
294     DocumentPrinted
295   };
296 
297   FX_BOOL ActionExist(AActionType eType) const;
298 
299   CPDF_Action GetAction(AActionType eType) const;
300 
301   CPDF_Dictionary* m_pDict;
302 };
303 class CPDF_DocJSActions {
304  public:
305   explicit CPDF_DocJSActions(CPDF_Document* pDoc);
306 
307   int CountJSActions() const;
308 
309   CPDF_Action GetJSAction(int index, CFX_ByteString& csName) const;
310 
311   CPDF_Action GetJSAction(const CFX_ByteString& csName) const;
312 
313   int FindJSAction(const CFX_ByteString& csName) const;
314 
GetDocument()315   CPDF_Document* GetDocument() const { return m_pDocument; }
316 
317  protected:
318   CPDF_Document* const m_pDocument;
319 };
320 class CPDF_FileSpec {
321  public:
322   CPDF_FileSpec();
323 
CPDF_FileSpec(CPDF_Object * pObj)324   explicit CPDF_FileSpec(CPDF_Object* pObj) { m_pObj = pObj; }
325 
326   operator CPDF_Object*() const { return m_pObj; }
327 
328   FX_BOOL IsURL() const;
329 
330   FX_BOOL GetFileName(CFX_WideString& wsFileName) const;
331 
332   CPDF_Stream* GetFileStream() const;
333 
334   void SetFileName(const CFX_WideStringC& wsFileName, FX_BOOL bURL = FALSE);
335 
336  protected:
337   CPDF_Object* m_pObj;
338 };
339 
340 class CPDF_LinkList {
341  public:
342   CPDF_LinkList();
343   ~CPDF_LinkList();
344 
345   CPDF_Link GetLinkAtPoint(CPDF_Page* pPage,
346                            FX_FLOAT pdf_x,
347                            FX_FLOAT pdf_y,
348                            int* z_order);
349 
350  private:
351   const std::vector<CPDF_Dictionary*>* GetPageLinks(CPDF_Page* pPage);
352 
353   void LoadPageLinks(CPDF_Page* pPage, std::vector<CPDF_Dictionary*>* pList);
354 
355   std::map<FX_DWORD, std::vector<CPDF_Dictionary*>> m_PageMap;
356 };
357 
358 class CPDF_Link {
359  public:
CPDF_Link()360   CPDF_Link() : m_pDict(nullptr) {}
CPDF_Link(CPDF_Dictionary * pDict)361   explicit CPDF_Link(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
362 
GetDict()363   CPDF_Dictionary* GetDict() const { return m_pDict; }
364 
365   CFX_FloatRect GetRect();
366   CPDF_Dest GetDest(CPDF_Document* pDoc);
367   CPDF_Action GetAction();
368 
369  protected:
370   CPDF_Dictionary* m_pDict;
371 };
372 
373 #define ANNOTFLAG_INVISIBLE 0x0001
374 #define ANNOTFLAG_HIDDEN 0x0002
375 #define ANNOTFLAG_PRINT 0x0004
376 #define ANNOTFLAG_NOZOOM 0x0008
377 #define ANNOTFLAG_NOROTATE 0x0010
378 #define ANNOTFLAG_NOVIEW 0x0020
379 #define ANNOTFLAG_READONLY 0x0040
380 #define ANNOTFLAG_LOCKED 0x0080
381 #define ANNOTFLAG_TOGGLENOVIEW 0x0100
382 
383 class CPDF_Annot : public CFX_PrivateData {
384  public:
385   enum AppearanceMode { Normal, Rollover, Down };
386 
387   CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList);
388   ~CPDF_Annot();
389 
390   CFX_ByteString GetSubType() const;
391 
392   FX_DWORD GetFlags() const;
393 
394   void GetRect(CFX_FloatRect& rect) const;
395 
GetAnnotDict()396   const CPDF_Dictionary* GetAnnotDict() const { return m_pAnnotDict; }
GetAnnotDict()397   CPDF_Dictionary* GetAnnotDict() { return m_pAnnotDict; }
398 
399   FX_BOOL DrawAppearance(CPDF_Page* pPage,
400                          CFX_RenderDevice* pDevice,
401                          const CFX_Matrix* pUser2Device,
402                          AppearanceMode mode,
403                          const CPDF_RenderOptions* pOptions);
404 
405   FX_BOOL DrawInContext(const CPDF_Page* pPage,
406                         CPDF_RenderContext* pContext,
407                         const CFX_Matrix* pUser2Device,
408                         AppearanceMode mode);
409 
410   void ClearCachedAP();
411 
412   void DrawBorder(CFX_RenderDevice* pDevice,
413                   const CFX_Matrix* pUser2Device,
414                   const CPDF_RenderOptions* pOptions);
415 
416   CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
417 
418  private:
419   CPDF_Dictionary* const m_pAnnotDict;
420   CPDF_AnnotList* const m_pList;
421   const CFX_ByteString m_sSubtype;
422   std::map<CPDF_Stream*, CPDF_Form*> m_APMap;
423 };
424 
425 class CPDF_AnnotList {
426  public:
427   explicit CPDF_AnnotList(CPDF_Page* pPage);
428   ~CPDF_AnnotList();
429 
DisplayAnnots(CPDF_Page * pPage,CPDF_RenderContext * pContext,FX_BOOL bPrinting,CFX_Matrix * pMatrix,FX_BOOL bShowWidget,CPDF_RenderOptions * pOptions)430   void DisplayAnnots(CPDF_Page* pPage,
431                      CPDF_RenderContext* pContext,
432                      FX_BOOL bPrinting,
433                      CFX_Matrix* pMatrix,
434                      FX_BOOL bShowWidget,
435                      CPDF_RenderOptions* pOptions) {
436     DisplayAnnots(pPage, nullptr, pContext, bPrinting, pMatrix,
437                   bShowWidget ? 3 : 1, pOptions, nullptr);
438   }
439   void DisplayAnnots(CPDF_Page* pPage,
440                      CFX_RenderDevice* pDevice,
441                      CPDF_RenderContext* pContext,
442                      FX_BOOL bPrinting,
443                      CFX_Matrix* pMatrix,
444                      FX_DWORD dwAnnotFlags,
445                      CPDF_RenderOptions* pOptions,
446                      FX_RECT* pClipRect);
Count()447   size_t Count() const { return m_AnnotList.size(); }
GetAt(size_t index)448   CPDF_Annot* GetAt(size_t index) const { return m_AnnotList[index]; }
All()449   const std::vector<CPDF_Annot*>& All() const { return m_AnnotList; }
GetDocument()450   CPDF_Document* GetDocument() const { return m_pDocument; }
451 
452  protected:
453   void DisplayPass(CPDF_Page* pPage,
454                    CFX_RenderDevice* pDevice,
455                    CPDF_RenderContext* pContext,
456                    FX_BOOL bPrinting,
457                    CFX_Matrix* pMatrix,
458                    FX_BOOL bWidget,
459                    CPDF_RenderOptions* pOptions,
460                    FX_RECT* clip_rect);
461 
462   CPDF_Document* const m_pDocument;
463   std::vector<CPDF_Annot*> m_AnnotList;
464 };
465 
466 #define COLORTYPE_TRANSPARENT 0
467 #define COLORTYPE_GRAY 1
468 #define COLORTYPE_RGB 2
469 #define COLORTYPE_CMYK 3
470 class CPDF_DefaultAppearance {
471  public:
472   // TODO(thestig): Examine why this cannot be explicit.
473   CPDF_DefaultAppearance(const CFX_ByteString& csDA = "") { m_csDA = csDA; }
474 
CPDF_DefaultAppearance(const CPDF_DefaultAppearance & cDA)475   CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA) {
476     m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
477   }
478 
CFX_ByteString()479   operator CFX_ByteString() const { return m_csDA; }
480 
481   const CPDF_DefaultAppearance& operator=(const CFX_ByteString& csDA) {
482     m_csDA = csDA;
483     return *this;
484   }
485 
486   const CPDF_DefaultAppearance& operator=(const CPDF_DefaultAppearance& cDA) {
487     m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
488     return *this;
489   }
490 
491   FX_BOOL HasFont();
492 
493   CFX_ByteString GetFontString();
494 
495   void GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize);
496 
497   FX_BOOL HasColor(FX_BOOL bStrokingOperation = FALSE);
498 
499   CFX_ByteString GetColorString(FX_BOOL bStrokingOperation = FALSE);
500 
501   void GetColor(int& iColorType,
502                 FX_FLOAT fc[4],
503                 FX_BOOL bStrokingOperation = FALSE);
504 
505   void GetColor(FX_ARGB& color,
506                 int& iColorType,
507                 FX_BOOL bStrokingOperation = FALSE);
508 
509   FX_BOOL HasTextMatrix();
510 
511   CFX_ByteString GetTextMatrixString();
512 
513   CFX_Matrix GetTextMatrix();
514 
515  protected:
516   CFX_ByteString m_csDA;
517 };
518 #define FIELDTYPE_UNKNOWN 0
519 #define FIELDTYPE_PUSHBUTTON 1
520 #define FIELDTYPE_CHECKBOX 2
521 #define FIELDTYPE_RADIOBUTTON 3
522 #define FIELDTYPE_COMBOBOX 4
523 #define FIELDTYPE_LISTBOX 5
524 #define FIELDTYPE_TEXTFIELD 6
525 #define FIELDTYPE_SIGNATURE 7
526 class CPDF_InterForm : public CFX_PrivateData {
527  public:
528   CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP);
529   ~CPDF_InterForm();
530 
531   static void EnableUpdateAP(FX_BOOL bUpdateAP);
532 
533   static FX_BOOL UpdatingAPEnabled();
534 
535   static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict,
536                                                 const FX_CHAR* csType,
537                                                 int iMinLen = 2,
538                                                 const FX_CHAR* csPrefix = "");
539 
540   static CPDF_Font* AddStandardFont(CPDF_Document* pDocument,
541                                     CFX_ByteString csFontName);
542 
543   static CFX_ByteString GetNativeFont(uint8_t iCharSet, void* pLogFont = NULL);
544 
545   static CFX_ByteString GetNativeFont(void* pLogFont = NULL);
546 
547   static uint8_t GetNativeCharSet();
548 
549   static CPDF_Font* AddNativeFont(uint8_t iCharSet, CPDF_Document* pDocument);
550 
551   static CPDF_Font* AddNativeFont(CPDF_Document* pDocument);
552 
553   FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, int iType);
554 
555   FX_BOOL ValidateFieldName(const CPDF_FormField* pField,
556                             CFX_WideString& csNewFieldName);
557 
558   FX_BOOL ValidateFieldName(const CPDF_FormControl* pControl,
559                             CFX_WideString& csNewFieldName);
560 
561   FX_DWORD CountFields(const CFX_WideString& csFieldName = L"");
562 
563   CPDF_FormField* GetField(FX_DWORD index,
564                            const CFX_WideString& csFieldName = L"");
565 
566   void GetAllFieldNames(CFX_WideStringArray& allFieldNames);
567 
568   CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const;
569 
570   CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage,
571                                       FX_FLOAT pdf_x,
572                                       FX_FLOAT pdf_y,
573                                       int* z_order) const;
574 
575   CPDF_FormControl* GetControlByDict(const CPDF_Dictionary* pWidgetDict) const;
576 
GetDocument()577   CPDF_Document* GetDocument() const { return m_pDocument; }
578 
GetFormDict()579   CPDF_Dictionary* GetFormDict() const { return m_pFormDict; }
580 
581   FX_BOOL NeedConstructAP();
582 
583   void NeedConstructAP(FX_BOOL bNeedAP);
584 
585   int CountFieldsInCalculationOrder();
586 
587   CPDF_FormField* GetFieldInCalculationOrder(int index);
588 
589   int FindFieldInCalculationOrder(const CPDF_FormField* pField);
590 
591   FX_DWORD CountFormFonts();
592 
593   CPDF_Font* GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag);
594 
595   CPDF_Font* GetFormFont(CFX_ByteString csNameTag);
596 
597   CPDF_Font* GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag);
598 
599   CPDF_Font* GetNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
600 
601   CPDF_Font* GetNativeFormFont(CFX_ByteString& csNameTag);
602 
603   FX_BOOL FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
604 
605   FX_BOOL FindFormFont(CFX_ByteString csFontName,
606                        CPDF_Font*& pFont,
607                        CFX_ByteString& csNameTag);
608 
FindFormFont(CFX_WideString csFontName,CPDF_Font * & pFont,CFX_ByteString & csNameTag)609   inline FX_BOOL FindFormFont(CFX_WideString csFontName,
610                               CPDF_Font*& pFont,
611                               CFX_ByteString& csNameTag) {
612     return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag);
613   }
614 
615   void AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
616 
617   CPDF_Font* AddNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
618 
619   CPDF_Font* AddNativeFormFont(CFX_ByteString& csNameTag);
620 
621   void RemoveFormFont(const CPDF_Font* pFont);
622 
623   void RemoveFormFont(CFX_ByteString csNameTag);
624 
625   CPDF_DefaultAppearance GetDefaultAppearance();
626 
627   CPDF_Font* GetDefaultFormFont();
628 
629   int GetFormAlignment();
630 
631   CPDF_FormField* CheckRequiredFields(
632       const std::vector<CPDF_FormField*>* fields,
633       bool bIncludeOrExclude) const;
634 
635   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
636                              bool bSimpleFileSpec = false) const;
637 
638   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
639                              const std::vector<CPDF_FormField*>& fields,
640                              bool bIncludeOrExclude = true,
641                              bool bSimpleFileSpec = false) const;
642 
643   FX_BOOL ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE);
644 
645   bool ResetForm(const std::vector<CPDF_FormField*>& fields,
646                  bool bIncludeOrExclude = true,
647                  bool bNotify = false);
648 
649   bool ResetForm(bool bNotify = false);
650 
GetFormNotify()651   CPDF_FormNotify* GetFormNotify() const { return m_pFormNotify; }
652 
653   void SetFormNotify(const CPDF_FormNotify* pNotify);
654 
IsUpdated()655   FX_BOOL IsUpdated() { return m_bUpdated; }
656 
ClearUpdatedFlag()657   void ClearUpdatedFlag() { m_bUpdated = FALSE; }
658 
659   FX_BOOL HasXFAForm() const;
660 
661   void FixPageFields(const CPDF_Page* pPage);
662 
663  protected:
664   static FX_BOOL m_bUpdateAP;
665 
666   void LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0);
667 
668   CPDF_Object* GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);
669 
670   CPDF_FormField* AddTerminalField(CPDF_Dictionary* pFieldDict);
671 
672   CPDF_FormControl* AddControl(const CPDF_FormField* pField,
673                                CPDF_Dictionary* pWidgetDict);
674 
675   void FDF_ImportField(CPDF_Dictionary* pField,
676                        const CFX_WideString& parent_name,
677                        FX_BOOL bNotify = FALSE,
678                        int nLevel = 0);
679 
680   FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName,
681                             int iType,
682                             const CPDF_FormField* pExcludedField,
683                             const CPDF_FormControl* pExcludedControl);
684 
685   int CompareFieldName(const CFX_WideString& name1,
686                        const CFX_WideString& name2);
687 
688   int CompareFieldName(const CFX_ByteString& name1,
689                        const CFX_ByteString& name2);
690 
691   CPDF_Document* const m_pDocument;
692 
693   FX_BOOL m_bGenerateAP;
694 
695   CPDF_Dictionary* m_pFormDict;
696 
697   std::map<const CPDF_Dictionary*, CPDF_FormControl*> m_ControlMap;
698 
699   std::unique_ptr<CFieldTree> m_pFieldTree;
700 
701   CFX_ByteString m_bsEncoding;
702 
703   CPDF_FormNotify* m_pFormNotify;
704 
705   FX_BOOL m_bUpdated;
706   friend class CPDF_FormControl;
707   friend class CPDF_FormField;
708 };
709 #define FORMFIELD_READONLY 0x01
710 #define FORMFIELD_REQUIRED 0x02
711 #define FORMFIELD_NOEXPORT 0x04
712 #define FORMRADIO_NOTOGGLEOFF 0x100
713 #define FORMRADIO_UNISON 0x200
714 #define FORMTEXT_MULTILINE 0x100
715 #define FORMTEXT_PASSWORD 0x200
716 #define FORMTEXT_NOSCROLL 0x400
717 #define FORMTEXT_COMB 0x800
718 #define FORMCOMBO_EDIT 0x100
719 #define FORMLIST_MULTISELECT 0x100
720 class CPDF_FormField {
721  public:
722   enum Type {
723     Unknown,
724     PushButton,
725     RadioButton,
726     CheckBox,
727     Text,
728     RichText,
729     File,
730     ListBox,
731     ComboBox,
732     Sign
733   };
734 
735   CFX_WideString GetFullName();
736 
GetType()737   Type GetType() { return m_Type; }
738 
GetFlags()739   FX_DWORD GetFlags() { return m_Flags; }
740 
GetFieldDict()741   CPDF_Dictionary* GetFieldDict() const { return m_pDict; }
742 
SetFieldDict(CPDF_Dictionary * pDict)743   void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; }
744 
745   FX_BOOL ResetField(FX_BOOL bNotify = FALSE);
746 
CountControls()747   int CountControls() { return m_ControlList.GetSize(); }
748 
GetControl(int index)749   CPDF_FormControl* GetControl(int index) { return m_ControlList.GetAt(index); }
750 
751   int GetControlIndex(const CPDF_FormControl* pControl);
752 
753   int GetFieldType();
754 
755   CPDF_AAction GetAdditionalAction();
756 
757   CFX_WideString GetAlternateName();
758 
759   CFX_WideString GetMappingName();
760 
761   FX_DWORD GetFieldFlags();
762 
763   CFX_ByteString GetDefaultStyle();
764 
765   CFX_WideString GetRichTextString();
766 
767   CFX_WideString GetValue();
768 
769   CFX_WideString GetDefaultValue();
770 
771   FX_BOOL SetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE);
772 
773   int GetMaxLen();
774 
775   int CountSelectedItems();
776 
777   int GetSelectedIndex(int index);
778 
779   FX_BOOL ClearSelection(FX_BOOL bNotify = FALSE);
780 
781   FX_BOOL IsItemSelected(int index);
782 
783   FX_BOOL SetItemSelection(int index,
784                            FX_BOOL bSelected,
785                            FX_BOOL bNotify = FALSE);
786 
787   FX_BOOL IsItemDefaultSelected(int index);
788 
789   int GetDefaultSelectedItem();
790 
791   int CountOptions();
792 
793   CFX_WideString GetOptionLabel(int index);
794 
795   CFX_WideString GetOptionValue(int index);
796 
797   int FindOption(CFX_WideString csOptLabel);
798 
799   int FindOptionValue(const CFX_WideString& csOptValue, int iStartIndex = 0);
800 
801   FX_BOOL CheckControl(int iControlIndex,
802                        FX_BOOL bChecked,
803                        FX_BOOL bNotify = FALSE);
804 
805   int GetTopVisibleIndex();
806 
807   int CountSelectedOptions();
808 
809   int GetSelectedOptionIndex(int index);
810 
811   FX_BOOL IsOptionSelected(int iOptIndex);
812 
813   FX_BOOL SelectOption(int iOptIndex,
814                        FX_BOOL bSelected,
815                        FX_BOOL bNotify = FALSE);
816 
817   FX_BOOL ClearSelectedOptions(FX_BOOL bNotify = FALSE);
818 
819 #ifdef PDF_ENABLE_XFA
820   FX_BOOL ClearOptions(FX_BOOL bNotify = FALSE);
821 
822   int InsertOption(CFX_WideString csOptLabel,
823                    int index = -1,
824                    FX_BOOL bNotify = FALSE);
825 #endif  // PDF_ENABLE_XFA
826 
GetFontSize()827   FX_FLOAT GetFontSize() { return m_FontSize; }
828 
GetFont()829   CPDF_Font* GetFont() { return m_pFont; }
830 
831  protected:
832   CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
833   ~CPDF_FormField();
834 
835   CFX_WideString GetValue(FX_BOOL bDefault);
836 
837   FX_BOOL SetValue(const CFX_WideString& value,
838                    FX_BOOL bDefault,
839                    FX_BOOL bNotify);
840 
841   void SyncFieldFlags();
842 
843   int FindListSel(CPDF_String* str);
844 
845   CFX_WideString GetOptionText(int index, int sub_index);
846 
847   void LoadDA();
848 
849   void UpdateAP(CPDF_FormControl* pControl);
850 
851   CFX_WideString GetCheckValue(FX_BOOL bDefault);
852 
853   FX_BOOL SetCheckValue(const CFX_WideString& value,
854                         FX_BOOL bDefault,
855                         FX_BOOL bNotify);
856 
857   CPDF_FormField::Type m_Type;
858   FX_DWORD m_Flags;
859   CPDF_InterForm* m_pForm;
860   CPDF_Dictionary* m_pDict;
861   CFX_ArrayTemplate<CPDF_FormControl*> m_ControlList;
862   FX_FLOAT m_FontSize;
863   CPDF_Font* m_pFont;
864 
865   friend class CPDF_InterForm;
866   friend class CPDF_FormControl;
867 };
868 CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict,
869                                const FX_CHAR* name,
870                                int nLevel = 0);
871 class CPDF_IconFit {
872  public:
873   // TODO(thestig): Examine why this cannot be explicit.
874   CPDF_IconFit(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
875 
876   operator CPDF_Dictionary*() const { return m_pDict; }
877 
878   enum ScaleMethod { Always = 0, Bigger, Smaller, Never };
879 
880   ScaleMethod GetScaleMethod();
881 
882   FX_BOOL IsProportionalScale();
883 
884   void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);
885 
886   FX_BOOL GetFittingBounds();
887 
888   CPDF_Dictionary* m_pDict;
889 };
890 
891 #define TEXTPOS_CAPTION 0
892 #define TEXTPOS_ICON 1
893 #define TEXTPOS_BELOW 2
894 #define TEXTPOS_ABOVE 3
895 #define TEXTPOS_RIGHT 4
896 #define TEXTPOS_LEFT 5
897 #define TEXTPOS_OVERLAID 6
898 class CPDF_FormControl {
899  public:
GetType()900   CPDF_FormField::Type GetType() { return m_pField->GetType(); }
901 
GetInterForm()902   CPDF_InterForm* GetInterForm() const { return m_pForm; }
903 
GetField()904   CPDF_FormField* GetField() const { return m_pField; }
905 
GetWidget()906   CPDF_Dictionary* GetWidget() const { return m_pWidgetDict; }
907 
908   CFX_FloatRect GetRect() const;
909 
910   void DrawControl(CFX_RenderDevice* pDevice,
911                    CFX_Matrix* pMatrix,
912                    CPDF_Page* pPage,
913                    CPDF_Annot::AppearanceMode mode,
914                    const CPDF_RenderOptions* pOptions = NULL);
915 
916   CFX_ByteString GetCheckedAPState();
917 
918   CFX_WideString GetExportValue();
919 
920   FX_BOOL IsChecked();
921 
922   FX_BOOL IsDefaultChecked();
923 
924   enum HighlightingMode { None = 0, Invert, Outline, Push, Toggle };
925 
926   HighlightingMode GetHighlightingMode();
927 
928   bool HasMKEntry(CFX_ByteString csEntry) const;
929 
930   int GetRotation();
931 
GetBorderColor(int & iColorType)932   inline FX_ARGB GetBorderColor(int& iColorType) {
933     return GetColor(iColorType, "BC");
934   }
935 
GetOriginalBorderColor(int index)936   FX_FLOAT GetOriginalBorderColor(int index) {
937     return GetOriginalColor(index, "BC");
938   }
939 
GetOriginalBorderColor(int & iColorType,FX_FLOAT fc[4])940   void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) {
941     GetOriginalColor(iColorType, fc, "BC");
942   }
943 
GetBackgroundColor(int & iColorType)944   FX_ARGB GetBackgroundColor(int& iColorType) {
945     return GetColor(iColorType, "BG");
946   }
947 
GetOriginalBackgroundColor(int index)948   FX_FLOAT GetOriginalBackgroundColor(int index) {
949     return GetOriginalColor(index, "BG");
950   }
951 
GetOriginalBackgroundColor(int & iColorType,FX_FLOAT fc[4])952   void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) {
953     GetOriginalColor(iColorType, fc, "BG");
954   }
955 
GetNormalCaption()956   CFX_WideString GetNormalCaption() { return GetCaption("CA"); }
957 
GetRolloverCaption()958   CFX_WideString GetRolloverCaption() { return GetCaption("RC"); }
959 
GetDownCaption()960   CFX_WideString GetDownCaption() { return GetCaption("AC"); }
961 
GetNormalIcon()962   CPDF_Stream* GetNormalIcon() { return GetIcon("I"); }
963 
GetRolloverIcon()964   CPDF_Stream* GetRolloverIcon() { return GetIcon("RI"); }
965 
GetDownIcon()966   CPDF_Stream* GetDownIcon() { return GetIcon("IX"); }
967 
968   CPDF_IconFit GetIconFit();
969 
970   int GetTextPosition();
971 
972   CPDF_Action GetAction();
973 
974   CPDF_AAction GetAdditionalAction();
975 
976   CPDF_DefaultAppearance GetDefaultAppearance();
977 
978   CPDF_Font* GetDefaultControlFont();
979 
980   int GetControlAlignment();
981 
982  protected:
983   CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
984 
985   CFX_ByteString GetOnStateName();
986 
987   void SetOnStateName(const CFX_ByteString& csOn);
988 
989   void CheckControl(FX_BOOL bChecked);
990 
991   FX_ARGB GetColor(int& iColorType, CFX_ByteString csEntry);
992 
993   FX_FLOAT GetOriginalColor(int index, CFX_ByteString csEntry);
994 
995   void GetOriginalColor(int& iColorType,
996                         FX_FLOAT fc[4],
997                         CFX_ByteString csEntry);
998 
999   CFX_WideString GetCaption(CFX_ByteString csEntry);
1000 
1001   CPDF_Stream* GetIcon(CFX_ByteString csEntry);
1002 
1003   CPDF_ApSettings GetMK() const;
1004 
1005   CPDF_InterForm* m_pForm;
1006 
1007   CPDF_FormField* m_pField;
1008 
1009   CPDF_Dictionary* m_pWidgetDict;
1010   friend class CPDF_InterForm;
1011   friend class CPDF_FormField;
1012 };
1013 class CPDF_FormNotify {
1014  public:
~CPDF_FormNotify()1015   virtual ~CPDF_FormNotify() {}
1016 
BeforeValueChange(const CPDF_FormField * pField,CFX_WideString & csValue)1017   virtual int BeforeValueChange(const CPDF_FormField* pField,
1018                                 CFX_WideString& csValue) {
1019     return 0;
1020   }
1021 
AfterValueChange(const CPDF_FormField * pField)1022   virtual int AfterValueChange(const CPDF_FormField* pField) { return 0; }
1023 
BeforeSelectionChange(const CPDF_FormField * pField,CFX_WideString & csValue)1024   virtual int BeforeSelectionChange(const CPDF_FormField* pField,
1025                                     CFX_WideString& csValue) {
1026     return 0;
1027   }
1028 
AfterSelectionChange(const CPDF_FormField * pField)1029   virtual int AfterSelectionChange(const CPDF_FormField* pField) { return 0; }
1030 
AfterCheckedStatusChange(const CPDF_FormField * pField,const CFX_ByteArray & statusArray)1031   virtual int AfterCheckedStatusChange(const CPDF_FormField* pField,
1032                                        const CFX_ByteArray& statusArray) {
1033     return 0;
1034   }
1035 
BeforeFormReset(const CPDF_InterForm * pForm)1036   virtual int BeforeFormReset(const CPDF_InterForm* pForm) { return 0; }
1037 
AfterFormReset(const CPDF_InterForm * pForm)1038   virtual int AfterFormReset(const CPDF_InterForm* pForm) { return 0; }
1039 
BeforeFormImportData(const CPDF_InterForm * pForm)1040   virtual int BeforeFormImportData(const CPDF_InterForm* pForm) { return 0; }
1041 
AfterFormImportData(const CPDF_InterForm * pForm)1042   virtual int AfterFormImportData(const CPDF_InterForm* pForm) { return 0; }
1043 };
1044 FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
1045 class CPDF_PageLabel {
1046  public:
CPDF_PageLabel(CPDF_Document * pDocument)1047   explicit CPDF_PageLabel(CPDF_Document* pDocument) { m_pDocument = pDocument; }
1048 
1049   CFX_WideString GetLabel(int nPage) const;
1050 
1051   int32_t GetPageByLabel(const CFX_ByteStringC& bsLabel) const;
1052 
1053   int32_t GetPageByLabel(const CFX_WideStringC& wsLabel) const;
1054 
1055  protected:
1056   CPDF_Document* m_pDocument;
1057 };
1058 
1059 class CPDF_Metadata {
1060  public:
1061   explicit CPDF_Metadata(CPDF_Document* pDoc);
1062   ~CPDF_Metadata();
1063 
1064   const CXML_Element* GetRoot() const;
1065 
1066  private:
1067   std::unique_ptr<CXML_Element> m_pXmlElement;
1068 };
1069 
1070 class CPDF_ViewerPreferences {
1071  public:
1072   explicit CPDF_ViewerPreferences(CPDF_Document* pDoc);
1073 
1074   ~CPDF_ViewerPreferences();
1075 
1076   FX_BOOL IsDirectionR2L() const;
1077 
1078   FX_BOOL PrintScaling() const;
1079 
1080   int32_t NumCopies() const;
1081 
1082   CPDF_Array* PrintPageRange() const;
1083 
1084   CFX_ByteString Duplex() const;
1085 
1086  protected:
1087   CPDF_Document* const m_pDoc;
1088 };
1089 
1090 class CPDF_ApSettings {
1091  public:
1092   explicit CPDF_ApSettings(CPDF_Dictionary* pDict);
1093 
1094   bool HasMKEntry(const CFX_ByteStringC& csEntry) const;
1095   int GetRotation() const;
1096 
GetBorderColor(int & iColorType)1097   FX_ARGB GetBorderColor(int& iColorType) const {
1098     return GetColor(iColorType, "BC");
1099   }
1100 
GetOriginalBorderColor(int index)1101   FX_FLOAT GetOriginalBorderColor(int index) const {
1102     return GetOriginalColor(index, "BC");
1103   }
1104 
GetOriginalBorderColor(int & iColorType,FX_FLOAT fc[4])1105   void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) const {
1106     GetOriginalColor(iColorType, fc, "BC");
1107   }
1108 
GetBackgroundColor(int & iColorType)1109   FX_ARGB GetBackgroundColor(int& iColorType) const {
1110     return GetColor(iColorType, "BG");
1111   }
1112 
GetOriginalBackgroundColor(int index)1113   FX_FLOAT GetOriginalBackgroundColor(int index) const {
1114     return GetOriginalColor(index, "BG");
1115   }
1116 
GetOriginalBackgroundColor(int & iColorType,FX_FLOAT fc[4])1117   void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) const {
1118     GetOriginalColor(iColorType, fc, "BG");
1119   }
1120 
GetNormalCaption()1121   CFX_WideString GetNormalCaption() const { return GetCaption("CA"); }
1122 
GetRolloverCaption()1123   CFX_WideString GetRolloverCaption() const { return GetCaption("RC"); }
1124 
GetDownCaption()1125   CFX_WideString GetDownCaption() const { return GetCaption("AC"); }
1126 
GetNormalIcon()1127   CPDF_Stream* GetNormalIcon() const { return GetIcon("I"); }
1128 
GetRolloverIcon()1129   CPDF_Stream* GetRolloverIcon() const { return GetIcon("RI"); }
1130 
GetDownIcon()1131   CPDF_Stream* GetDownIcon() const { return GetIcon("IX"); }
1132 
1133   CPDF_IconFit GetIconFit() const;
1134 
1135   int GetTextPosition() const;
1136 
1137  protected:
1138   friend class CPDF_FormControl;
1139 
1140   FX_ARGB GetColor(int& iColorType, const CFX_ByteStringC& csEntry) const;
1141 
1142   FX_FLOAT GetOriginalColor(int index, const CFX_ByteStringC& csEntry) const;
1143 
1144   void GetOriginalColor(int& iColorType,
1145                         FX_FLOAT fc[4],
1146                         const CFX_ByteStringC& csEntry) const;
1147 
1148   CFX_WideString GetCaption(const CFX_ByteStringC& csEntry) const;
1149 
1150   CPDF_Stream* GetIcon(const CFX_ByteStringC& csEntry) const;
1151 
1152   CPDF_Dictionary* const m_pDict;
1153 };
1154 
1155 CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath);
1156 
1157 #endif  // CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_
1158