14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FPDFAPI_PARSER_CPDF_DICTIONARY_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FPDFAPI_PARSER_CPDF_DICTIONARY_H_
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <map>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <set>
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility>
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_object.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/cfx_string_pool_template.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/cfx_weak_ptr.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_coordinates.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_string.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h"
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_IndirectObjectHolder;
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_Dictionary : public CPDF_Object {
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  using const_iterator =
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      std::map<CFX_ByteString, std::unique_ptr<CPDF_Object>>::const_iterator;
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary();
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  explicit CPDF_Dictionary(const CFX_WeakPtr<CFX_ByteStringPool>& pPool);
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CPDF_Dictionary() override;
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // CPDF_Object:
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Type GetType() const override;
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_Object> Clone() const override;
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* GetDict() const override;
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsDictionary() const override;
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* AsDictionary() override;
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const CPDF_Dictionary* AsDictionary() const override;
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  size_t GetCount() const { return m_Map.size(); }
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* GetObjectFor(const CFX_ByteString& key) const;
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* GetDirectObjectFor(const CFX_ByteString& key) const;
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString GetStringFor(const CFX_ByteString& key) const;
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString GetStringFor(const CFX_ByteString& key,
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                              const CFX_ByteString& default_str) const;
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WideString GetUnicodeTextFor(const CFX_ByteString& key) const;
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetIntegerFor(const CFX_ByteString& key) const;
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int GetIntegerFor(const CFX_ByteString& key, int default_int) const;
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool GetBooleanFor(const CFX_ByteString& key, bool bDefault = false) const;
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT GetNumberFor(const CFX_ByteString& key) const;
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* GetDictFor(const CFX_ByteString& key) const;
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream* GetStreamFor(const CFX_ByteString& key) const;
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Array* GetArrayFor(const CFX_ByteString& key) const;
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect GetRectFor(const CFX_ByteString& key) const;
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_Matrix GetMatrixFor(const CFX_ByteString& key) const;
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT GetFloatFor(const CFX_ByteString& key) const {
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return GetNumberFor(key);
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool KeyExist(const CFX_ByteString& key) const;
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsSignatureDict() const;
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Set* functions invalidate iterators for the element with the key |key|.
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Takes ownership of |pObj|, returns an unowned pointer to it.
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* SetFor(const CFX_ByteString& key,
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      std::unique_ptr<CPDF_Object> pObj);
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Creates a new object owned by the dictionary and returns an unowned
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // pointer to it.
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  template <typename T, typename... Args>
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  typename std::enable_if<!CanInternStrings<T>::value, T*>::type SetNewFor(
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      const CFX_ByteString& key,
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      Args&&... args) {
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return static_cast<T*>(
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        SetFor(key, pdfium::MakeUnique<T>(std::forward<Args>(args)...)));
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  template <typename T, typename... Args>
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  typename std::enable_if<CanInternStrings<T>::value, T*>::type SetNewFor(
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      const CFX_ByteString& key,
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      Args&&... args) {
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return static_cast<T*>(SetFor(
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        key, pdfium::MakeUnique<T>(m_pPool, std::forward<Args>(args)...)));
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Convenience functions to convert native objects to array form.
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetRectFor(const CFX_ByteString& key, const CFX_FloatRect& rect);
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetMatrixFor(const CFX_ByteString& key, const CFX_Matrix& matrix);
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void ConvertToIndirectObjectFor(const CFX_ByteString& key,
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  CPDF_IndirectObjectHolder* pHolder);
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Invalidates iterators for the element with the key |key|.
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void RemoveFor(const CFX_ByteString& key);
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // Invalidates iterators for the element with the key |oldkey|.
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void ReplaceKey(const CFX_ByteString& oldkey, const CFX_ByteString& newkey);
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const_iterator begin() const { return m_Map.begin(); }
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const_iterator end() const { return m_Map.end(); }
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WeakPtr<CFX_ByteStringPool> GetByteStringPool() const { return m_pPool; }
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann protected:
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString MaybeIntern(const CFX_ByteString& str);
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_Object> CloneNonCyclic(
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bool bDirect,
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      std::set<const CPDF_Object*>* visited) const override;
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_WeakPtr<CFX_ByteStringPool> m_pPool;
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::map<CFX_ByteString, std::unique_ptr<CPDF_Object>> m_Map;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) {
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return obj ? obj->AsDictionary() : nullptr;
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) {
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return obj ? obj->AsDictionary() : nullptr;
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmanninline std::unique_ptr<CPDF_Dictionary> ToDictionary(
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::unique_ptr<CPDF_Object> obj) {
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pDict = ToDictionary(obj.get());
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pDict)
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  obj.release();
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return std::unique_ptr<CPDF_Dictionary>(pDict);
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // CORE_FPDFAPI_PARSER_CPDF_DICTIONARY_H_
132