// 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_

#include "core/include/fxcrt/fx_basic.h"
#include "core/include/fxcrt/fx_stream.h"

class CFX_BitStream;
class CPDF_DataAvail;
class CPDF_Dictionary;
class CPDF_Stream;
class IFX_DownloadHints;

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_
