// 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 XFA_FXFA_APP_XFA_FFDOCHANDLER_H_
#define XFA_FXFA_APP_XFA_FFDOCHANDLER_H_

#include "xfa/include/fxfa/fxfa.h"

class CXFA_FFDocHandler : public IXFA_DocHandler {
 public:
  CXFA_FFDocHandler();
  ~CXFA_FFDocHandler();
  virtual void ReleaseDoc(IXFA_Doc* hDoc);
  virtual IXFA_DocProvider* GetDocProvider(IXFA_Doc* hDoc);
  virtual FX_DWORD GetDocType(IXFA_Doc* hDoc);
  virtual int32_t StartLoad(IXFA_Doc* hDoc);
  virtual int32_t DoLoad(IXFA_Doc* hDoc, IFX_Pause* pPause = NULL);
  virtual void StopLoad(IXFA_Doc* hDoc);

  virtual IXFA_DocView* CreateDocView(IXFA_Doc* hDoc, FX_DWORD dwView = 0);
  virtual int32_t CountPackages(IXFA_Doc* hDoc);
  virtual void GetPackageName(IXFA_Doc* hDoc,
                              int32_t iPackage,
                              CFX_WideStringC& wsPackage);
  virtual IFDE_XMLElement* GetPackageData(IXFA_Doc* hDoc,
                                          const CFX_WideStringC& wsPackage);
  virtual FX_BOOL SavePackage(IXFA_Doc* hDoc,
                              const CFX_WideStringC& wsPackage,
                              IFX_FileWrite* pFile,
                              IXFA_ChecksumContext* pCSContext = NULL);
  virtual FX_BOOL CloseDoc(IXFA_Doc* hDoc);
  virtual FX_BOOL ImportData(IXFA_Doc* hDoc,
                             IFX_FileRead* pStream,
                             FX_BOOL bXDP = TRUE);
  virtual void SetJSERuntime(IXFA_Doc* hDoc, FXJSE_HRUNTIME hRuntime);
  virtual FXJSE_HVALUE GetXFAScriptObject(IXFA_Doc* hDoc);
  virtual XFA_ATTRIBUTEENUM GetRestoreState(IXFA_Doc* hDoc);
  virtual FX_BOOL RunDocScript(IXFA_Doc* hDoc,
                               XFA_SCRIPTTYPE eScriptType,
                               const CFX_WideStringC& wsScript,
                               FXJSE_HVALUE hRetValue,
                               FXJSE_HVALUE hThisObject);

 protected:
};

#endif  // XFA_FXFA_APP_XFA_FFDOCHANDLER_H_
