1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker 5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6*3ac0a46fSAndroid Build Coastguard Worker 7*3ac0a46fSAndroid Build Coastguard Worker #ifndef FPDFSDK_FPDFXFA_CPDFXFA_CONTEXT_H_ 8*3ac0a46fSAndroid Build Coastguard Worker #define FPDFSDK_FPDFXFA_CPDFXFA_CONTEXT_H_ 9*3ac0a46fSAndroid Build Coastguard Worker 10*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h> 11*3ac0a46fSAndroid Build Coastguard Worker 12*3ac0a46fSAndroid Build Coastguard Worker #include <memory> 13*3ac0a46fSAndroid Build Coastguard Worker #include <vector> 14*3ac0a46fSAndroid Build Coastguard Worker 15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_document.h" 16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/cfx_timer.h" 17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/observed_ptr.h" 18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/retain_ptr.h" 19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/unowned_ptr.h" 20*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_formfillenvironment.h" 21*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" 22*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/heap.h" 23*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/persistent.h" 24*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffapp.h" 25*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdoc.h" 26*3ac0a46fSAndroid Build Coastguard Worker 27*3ac0a46fSAndroid Build Coastguard Worker class CFX_XMLDocument; 28*3ac0a46fSAndroid Build Coastguard Worker class CJS_Runtime; 29*3ac0a46fSAndroid Build Coastguard Worker class CPDFXFA_DocEnvironment; 30*3ac0a46fSAndroid Build Coastguard Worker 31*3ac0a46fSAndroid Build Coastguard Worker // Per-process initializations. 32*3ac0a46fSAndroid Build Coastguard Worker void CPDFXFA_ModuleInit(); 33*3ac0a46fSAndroid Build Coastguard Worker void CPDFXFA_ModuleDestroy(); 34*3ac0a46fSAndroid Build Coastguard Worker 35*3ac0a46fSAndroid Build Coastguard Worker class CPDFXFA_Context final : public CPDF_Document::Extension, 36*3ac0a46fSAndroid Build Coastguard Worker public CXFA_FFApp::CallbackIface { 37*3ac0a46fSAndroid Build Coastguard Worker public: 38*3ac0a46fSAndroid Build Coastguard Worker enum class LoadStatus : uint8_t { 39*3ac0a46fSAndroid Build Coastguard Worker kPreload = 0, 40*3ac0a46fSAndroid Build Coastguard Worker kLoading, 41*3ac0a46fSAndroid Build Coastguard Worker kLoaded, 42*3ac0a46fSAndroid Build Coastguard Worker kClosing, 43*3ac0a46fSAndroid Build Coastguard Worker }; 44*3ac0a46fSAndroid Build Coastguard Worker 45*3ac0a46fSAndroid Build Coastguard Worker explicit CPDFXFA_Context(CPDF_Document* pPDFDoc); 46*3ac0a46fSAndroid Build Coastguard Worker ~CPDFXFA_Context() override; 47*3ac0a46fSAndroid Build Coastguard Worker 48*3ac0a46fSAndroid Build Coastguard Worker bool LoadXFADoc(); GetLoadStatus()49*3ac0a46fSAndroid Build Coastguard Worker LoadStatus GetLoadStatus() const { return m_nLoadStatus; } GetFormType()50*3ac0a46fSAndroid Build Coastguard Worker FormType GetFormType() const { return m_FormType; } GetOriginalPageCount()51*3ac0a46fSAndroid Build Coastguard Worker int GetOriginalPageCount() const { return m_nPageCount; } SetOriginalPageCount(int count)52*3ac0a46fSAndroid Build Coastguard Worker void SetOriginalPageCount(int count) { 53*3ac0a46fSAndroid Build Coastguard Worker m_nPageCount = count; 54*3ac0a46fSAndroid Build Coastguard Worker m_XFAPageList.resize(count); 55*3ac0a46fSAndroid Build Coastguard Worker } 56*3ac0a46fSAndroid Build Coastguard Worker GetPDFDoc()57*3ac0a46fSAndroid Build Coastguard Worker CPDF_Document* GetPDFDoc() const { return m_pPDFDoc; } GetXMLDoc()58*3ac0a46fSAndroid Build Coastguard Worker CFX_XMLDocument* GetXMLDoc() { return m_pXML.get(); } GetXFADoc()59*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDoc* GetXFADoc() { return m_pXFADoc; } GetXFADocView()60*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* GetXFADocView() const { return m_pXFADocView.Get(); } GetFormFillEnv()61*3ac0a46fSAndroid Build Coastguard Worker CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { 62*3ac0a46fSAndroid Build Coastguard Worker return m_pFormFillEnv.Get(); 63*3ac0a46fSAndroid Build Coastguard Worker } 64*3ac0a46fSAndroid Build Coastguard Worker void SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv); 65*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDFXFA_Page> GetOrCreateXFAPage(int page_index); 66*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDFXFA_Page> GetXFAPage(int page_index); 67*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CPDFXFA_Page> GetXFAPage(CXFA_FFPageView* pPage) const; 68*3ac0a46fSAndroid Build Coastguard Worker void ClearChangeMark(); 69*3ac0a46fSAndroid Build Coastguard Worker 70*3ac0a46fSAndroid Build Coastguard Worker // CPDF_Document::Extension: 71*3ac0a46fSAndroid Build Coastguard Worker int GetPageCount() const override; 72*3ac0a46fSAndroid Build Coastguard Worker void DeletePage(int page_index) override; 73*3ac0a46fSAndroid Build Coastguard Worker uint32_t GetUserPermissions() const override; 74*3ac0a46fSAndroid Build Coastguard Worker bool ContainsExtensionForm() const override; 75*3ac0a46fSAndroid Build Coastguard Worker bool ContainsExtensionFullForm() const override; 76*3ac0a46fSAndroid Build Coastguard Worker bool ContainsExtensionForegroundForm() const override; 77*3ac0a46fSAndroid Build Coastguard Worker 78*3ac0a46fSAndroid Build Coastguard Worker // CXFA_FFApp::CallbackIface: 79*3ac0a46fSAndroid Build Coastguard Worker WideString GetLanguage() override; 80*3ac0a46fSAndroid Build Coastguard Worker WideString GetPlatform() override; 81*3ac0a46fSAndroid Build Coastguard Worker WideString GetAppName() override; 82*3ac0a46fSAndroid Build Coastguard Worker WideString GetAppTitle() const override; 83*3ac0a46fSAndroid Build Coastguard Worker void Beep(uint32_t dwType) override; 84*3ac0a46fSAndroid Build Coastguard Worker int32_t MsgBox(const WideString& wsMessage, 85*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsTitle, 86*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwIconType, 87*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwButtonType) override; 88*3ac0a46fSAndroid Build Coastguard Worker WideString Response(const WideString& wsQuestion, 89*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsTitle, 90*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsDefaultAnswer, 91*3ac0a46fSAndroid Build Coastguard Worker bool bMark) override; 92*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<IFX_SeekableReadStream> DownloadURL( 93*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsURL) override; 94*3ac0a46fSAndroid Build Coastguard Worker bool PostRequestURL(const WideString& wsURL, 95*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsData, 96*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsContentType, 97*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsEncode, 98*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsHeader, 99*3ac0a46fSAndroid Build Coastguard Worker WideString& wsResponse) override; 100*3ac0a46fSAndroid Build Coastguard Worker bool PutRequestURL(const WideString& wsURL, 101*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsData, 102*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsEncode) override; 103*3ac0a46fSAndroid Build Coastguard Worker CFX_Timer::HandlerIface* GetTimerHandler() const override; 104*3ac0a46fSAndroid Build Coastguard Worker cppgc::Heap* GetGCHeap() const override; 105*3ac0a46fSAndroid Build Coastguard Worker 106*3ac0a46fSAndroid Build Coastguard Worker bool SaveDatasetsPackage(const RetainPtr<IFX_SeekableStream>& pStream); 107*3ac0a46fSAndroid Build Coastguard Worker bool SaveFormPackage(const RetainPtr<IFX_SeekableStream>& pStream); 108*3ac0a46fSAndroid Build Coastguard Worker void SendPostSaveToXFADoc(); 109*3ac0a46fSAndroid Build Coastguard Worker void SendPreSaveToXFADoc( 110*3ac0a46fSAndroid Build Coastguard Worker std::vector<RetainPtr<IFX_SeekableStream>>* fileList); 111*3ac0a46fSAndroid Build Coastguard Worker 112*3ac0a46fSAndroid Build Coastguard Worker private: 113*3ac0a46fSAndroid Build Coastguard Worker CJS_Runtime* GetCJSRuntime() const; 114*3ac0a46fSAndroid Build Coastguard Worker bool SavePackage(const RetainPtr<IFX_SeekableStream>& pStream, 115*3ac0a46fSAndroid Build Coastguard Worker XFA_HashCode code); 116*3ac0a46fSAndroid Build Coastguard Worker 117*3ac0a46fSAndroid Build Coastguard Worker FormType m_FormType = FormType::kNone; 118*3ac0a46fSAndroid Build Coastguard Worker LoadStatus m_nLoadStatus = LoadStatus::kPreload; 119*3ac0a46fSAndroid Build Coastguard Worker int m_nPageCount = 0; 120*3ac0a46fSAndroid Build Coastguard Worker 121*3ac0a46fSAndroid Build Coastguard Worker // The order in which the following members are destroyed is critical. 122*3ac0a46fSAndroid Build Coastguard Worker UnownedPtr<CPDF_Document> const m_pPDFDoc; 123*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CFX_XMLDocument> m_pXML; 124*3ac0a46fSAndroid Build Coastguard Worker ObservedPtr<CPDFSDK_FormFillEnvironment> m_pFormFillEnv; 125*3ac0a46fSAndroid Build Coastguard Worker std::vector<RetainPtr<CPDFXFA_Page>> m_XFAPageList; 126*3ac0a46fSAndroid Build Coastguard Worker 127*3ac0a46fSAndroid Build Coastguard Worker // Can't outlive |m_pFormFillEnv|. 128*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CPDFXFA_DocEnvironment> m_pDocEnv; 129*3ac0a46fSAndroid Build Coastguard Worker 130*3ac0a46fSAndroid Build Coastguard Worker FXGCScopedHeap m_pGCHeap; 131*3ac0a46fSAndroid Build Coastguard Worker cppgc::Persistent<CXFA_FFApp> m_pXFAApp; // can't outlive |m_pGCHeap| 132*3ac0a46fSAndroid Build Coastguard Worker cppgc::Persistent<CXFA_FFDoc> m_pXFADoc; // Can't outlive |m_pGCHeap| 133*3ac0a46fSAndroid Build Coastguard Worker cppgc::Persistent<CXFA_FFDocView> m_pXFADocView; // Can't outlive |m_pGCHeap| 134*3ac0a46fSAndroid Build Coastguard Worker }; 135*3ac0a46fSAndroid Build Coastguard Worker 136*3ac0a46fSAndroid Build Coastguard Worker #endif // FPDFSDK_FPDFXFA_CPDFXFA_CONTEXT_H_ 137