// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef FPDFSDK_FPDFXFA_CPDFXFA_CONTEXT_H_ #define FPDFSDK_FPDFXFA_CPDFXFA_CONTEXT_H_ #include #include #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fxcrt/fx_system.h" #include "core/fxcrt/observable.h" #include "core/fxcrt/unowned_ptr.h" #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h" #include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" #include "xfa/fxfa/cxfa_ffdoc.h" class CJS_Runtime; class CPDFSDK_FormFillEnvironment; class CXFA_FFDocHandler; class IJS_EventContext; class IJS_Runtime; enum LoadStatus { FXFA_LOADSTATUS_PRELOAD = 0, FXFA_LOADSTATUS_LOADING, FXFA_LOADSTATUS_LOADED, FXFA_LOADSTATUS_CLOSING, FXFA_LOADSTATUS_CLOSED }; class CPDFXFA_Context : public CPDF_Document::Extension, public IXFA_AppProvider { public: explicit CPDFXFA_Context(std::unique_ptr pPDFDoc); ~CPDFXFA_Context() override; bool LoadXFADoc(); CPDF_Document* GetPDFDoc() { return m_pPDFDoc.get(); } CXFA_FFDoc* GetXFADoc() { return m_pXFADoc.get(); } CXFA_FFDocView* GetXFADocView() { return m_pXFADocView.Get(); } FormType GetFormType() const { return m_FormType; } bool ContainsXFAForm() const { return m_FormType == FormType::kXFAFull || m_FormType == FormType::kXFAForeground; } CJS_Runtime* GetCJSRuntime() const; CXFA_FFApp* GetXFAApp() { return m_pXFAApp.get(); } CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv.Get(); } void SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv); int GetPageCount() const; void DeletePage(int page_index); RetainPtr GetXFAPage(int page_index); RetainPtr GetXFAPage(CXFA_FFPageView* pPage) const; void ClearChangeMark(); // IFXA_AppProvider: WideString GetLanguage() override; WideString GetPlatform() override; WideString GetAppName() override; WideString GetAppTitle() const override; void Beep(uint32_t dwType) override; int32_t MsgBox(const WideString& wsMessage, const WideString& wsTitle, uint32_t dwIconType, uint32_t dwButtonType) override; WideString Response(const WideString& wsQuestion, const WideString& wsTitle, const WideString& wsDefaultAnswer, bool bMark) override; RetainPtr DownloadURL( const WideString& wsURL) override; bool PostRequestURL(const WideString& wsURL, const WideString& wsData, const WideString& wsContentType, const WideString& wsEncode, const WideString& wsHeader, WideString& wsResponse) override; bool PutRequestURL(const WideString& wsURL, const WideString& wsData, const WideString& wsEncode) override; IFWL_AdapterTimerMgr* GetTimerMgr() override; protected: friend class CPDFXFA_DocEnvironment; int GetOriginalPageCount() const { return m_nPageCount; } void SetOriginalPageCount(int count) { m_nPageCount = count; m_XFAPageList.resize(count); } LoadStatus GetLoadStatus() const { return m_nLoadStatus; } std::vector>* GetXFAPageList() { return &m_XFAPageList; } private: void CloseXFADoc(); FormType m_FormType = FormType::kNone; std::unique_ptr m_pPDFDoc; std::unique_ptr m_pXFADoc; Observable::ObservedPtr m_pFormFillEnv; UnownedPtr m_pXFADocView; std::unique_ptr m_pXFAApp; std::unique_ptr m_pRuntime; std::vector> m_XFAPageList; LoadStatus m_nLoadStatus = FXFA_LOADSTATUS_PRELOAD; int m_nPageCount = 0; // Must be destroyed before |m_pFormFillEnv|. CPDFXFA_DocEnvironment m_DocEnv; }; #endif // FPDFSDK_FPDFXFA_CPDFXFA_CONTEXT_H_