// Copyright 2016 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

#include "core/fpdfapi/parser/cpdf_linearized.h"

#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_number.h"
#include "third_party/base/ptr_util.h"

namespace {

template <class T>
bool IsValidNumericDictionaryValue(const CPDF_Dictionary* pDict,
                                   const char* key,
                                   T min_value,
                                   bool must_exist = true) {
  if (!pDict->KeyExist(key))
    return !must_exist;
  const CPDF_Number* pNum = ToNumber(pDict->GetObjectFor(key));
  if (!pNum || !pNum->IsInteger())
    return false;
  const int raw_value = pNum->GetInteger();
  if (!pdfium::base::IsValueInRangeForNumericType<T>(raw_value))
    return false;
  return static_cast<T>(raw_value) >= min_value;
}

}  // namespace

// static
std::unique_ptr<CPDF_Linearized> CPDF_Linearized::CreateForObject(
    std::unique_ptr<CPDF_Object> pObj) {
  auto pDict = ToDictionary(std::move(pObj));
  if (!pDict || !pDict->KeyExist("Linearized") ||
      !IsValidNumericDictionaryValue<FX_FILESIZE>(pDict.get(), "L", 1) ||
      !IsValidNumericDictionaryValue<uint32_t>(pDict.get(), "P", 0, false) ||
      !IsValidNumericDictionaryValue<FX_FILESIZE>(pDict.get(), "T", 1) ||
      !IsValidNumericDictionaryValue<uint32_t>(pDict.get(), "N", 0) ||
      !IsValidNumericDictionaryValue<FX_FILESIZE>(pDict.get(), "E", 1) ||
      !IsValidNumericDictionaryValue<uint32_t>(pDict.get(), "O", 1))
    return nullptr;
  return pdfium::WrapUnique(new CPDF_Linearized(pDict.get()));
}

CPDF_Linearized::CPDF_Linearized(const CPDF_Dictionary* pDict) {
  if (!pDict)
    return;
  m_szFileSize = pDict->GetIntegerFor("L");
  m_dwFirstPageNo = pDict->GetIntegerFor("P");
  m_szLastXRefOffset = pDict->GetIntegerFor("T");
  m_PageCount = pDict->GetIntegerFor("N");
  m_szFirstPageEndOffset = pDict->GetIntegerFor("E");
  m_FirstPageObjNum = pDict->GetIntegerFor("O");
  const CPDF_Array* pHintStreamRange = pDict->GetArrayFor("H");
  const size_t nHintStreamSize =
      pHintStreamRange ? pHintStreamRange->GetCount() : 0;
  if (nHintStreamSize == 2 || nHintStreamSize == 4) {
    m_szHintStart = std::max(pHintStreamRange->GetIntegerAt(0), 0);
    m_szHintLength = std::max(pHintStreamRange->GetIntegerAt(1), 0);
  }
}

CPDF_Linearized::~CPDF_Linearized() {}

bool CPDF_Linearized::HasHintTable() const {
  return GetPageCount() > 1 && GetHintStart() > 0 && GetHintLength() > 0;
}
