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