// 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_FFAPP_H_
#define XFA_FFAPP_H_

class CXFA_FileRead : public IFX_FileRead {
 public:
  explicit CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams);

  virtual FX_FILESIZE GetSize();
  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);

  virtual void Release() { delete this; }

 protected:
  CFX_ObjectArray<CPDF_StreamAcc> m_Data;
};
class CXFA_FWLAdapterWidgetMgr;
class CXFA_FWLTheme;
class CXFA_FFDocHandler;
class CXFA_FFMenuHandler;
class CXFA_FontMgr;
class CXFA_FFApp : public IXFA_App, public IFWL_AdapterNative {
 public:
  CXFA_FFApp(IXFA_AppProvider* pProvider);
  ~CXFA_FFApp() override;

  // IFXFA_App:
  IXFA_DocHandler* GetDocHandler() override;
  IXFA_Doc* CreateDoc(IXFA_DocProvider* pProvider,
                      IFX_FileRead* pStream,
                      FX_BOOL bTakeOverFile) override;
  IXFA_Doc* CreateDoc(IXFA_DocProvider* pProvider,
                      CPDF_Document* pPDFDoc) override;
  IXFA_AppProvider* GetAppProvider() override { return m_pProvider; }
  void SetDefaultFontMgr(IXFA_FontMgr* pFontMgr) override;
  IXFA_MenuHandler* GetMenuHandler() override;

  // IFWL_AdapterNative:
  IFWL_AdapterWidgetMgr* GetWidgetMgr(
      IFWL_WidgetMgrDelegate* pDelegate) override;
  IFWL_AdapterThreadMgr* GetThreadMgr() override;
  IFWL_AdapterTimerMgr* GetTimerMgr() override;
  IFWL_AdapterCursorMgr* GetCursorMgr() override;
  IFWL_AdapterMonitorMgr* GetMonitorMgr() override;
  IFWL_AdapterClipboardMgr* GetClipboardMgr() override;

  CXFA_FontMgr* GetXFAFontMgr();
  IFX_FontMgr* GetFDEFontMgr();
  CXFA_FWLTheme* GetFWLTheme();
  IFWL_WidgetMgrDelegate* GetWidgetMgrDelegate() {
    return m_pWidgetMgrDelegate;
  }

 protected:
  CXFA_FFDocHandler* m_pDocHandler;
  IFWL_App* m_pFWLApp;
  CXFA_FWLTheme* m_pFWLTheme;
  IXFA_AppProvider* m_pProvider;
  CXFA_FontMgr* m_pFontMgr;
#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
  IFX_FontSourceEnum* m_pFontSource;
#endif
  CXFA_FWLAdapterWidgetMgr* m_pAdapterWidgetMgr;
  IFWL_WidgetMgrDelegate* m_pWidgetMgrDelegate;
  IFX_FontMgr* m_pFDEFontMgr;
  CXFA_FFMenuHandler* m_pMenuHandler;
  CFWL_SDAdapterThreadMgr* m_pAdapterThreadMgr;
};

#endif  // XFA_FFAPP_H_
