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

class CPDF_DataAvail;

class CPDF_HintTables {
 public:
  CPDF_HintTables(CPDF_DataAvail* pDataAvail, CPDF_Dictionary* pLinearized)
      : m_pLinearizedDict(pLinearized),
        m_pDataAvail(pDataAvail),
        m_nFirstPageSharedObjs(0),
        m_szFirstPageObjOffset(0) {}
  ~CPDF_HintTables();
  FX_BOOL GetPagePos(int index,
                     FX_FILESIZE& szPageStartPos,
                     FX_FILESIZE& szPageLength,
                     FX_DWORD& dwObjNum);
  FX_BOOL CheckPage(int index, IFX_DownloadHints* pHints);
  FX_BOOL LoadHintStream(CPDF_Stream* pHintStream);

 protected:
  FX_BOOL ReadPageHintTable(CFX_BitStream* hStream);
  FX_BOOL ReadSharedObjHintTable(CFX_BitStream* hStream);
  FX_DWORD GetItemLength(int index, const CFX_FileSizeArray& szArray);

 private:
  int ReadPrimaryHintStreamOffset() const;
  int ReadPrimaryHintStreamLength() const;

  CPDF_Dictionary* m_pLinearizedDict;
  CPDF_DataAvail* m_pDataAvail;
  FX_DWORD m_nFirstPageSharedObjs;
  FX_FILESIZE m_szFirstPageObjOffset;
  CFX_DWordArray m_dwDeltaNObjsArray;
  CFX_DWordArray m_dwNSharedObjsArray;
  CFX_DWordArray m_dwSharedObjNumArray;
  CFX_DWordArray m_dwIdentifierArray;
  CFX_FileSizeArray m_szPageOffsetArray;
  CFX_FileSizeArray m_szSharedObjOffsetArray;
};
#endif  // CORE_SRC_FPDFAPI_FPDF_PARSER_PARSER_INT_H_
