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

#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);
  IPDF_DataAvail::DocAvailStatus 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 offset);
  FX_DWORD GetItemLength(int index, const std::vector<FX_FILESIZE>& 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;
  std::vector<FX_FILESIZE> m_szPageOffsetArray;
  std::vector<FX_FILESIZE> m_szSharedObjOffsetArray;
};

#endif  // CORE_SRC_FPDFAPI_FPDF_PARSER_PARSER_INT_H_
