1//========================================================================
2//
3// Dict.h
4//
5// Copyright 1996-2003 Glyph & Cog, LLC
6//
7//========================================================================
8
9//========================================================================
10//
11// Modified under the Poppler project - http://poppler.freedesktop.org
12//
13// All changes made under the Poppler project to this file are licensed
14// under GPL version 2 or later
15//
16// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
17// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
18// Copyright (C) 2007-2008 Julien Rebetez <julienr@svn.gnome.org>
19// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
20// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
21// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
22//
23// To see a description of the changes please see the Changelog file that
24// came with your tarball or type make ChangeLog if you are building from git
25//
26//========================================================================
27
28#ifndef DICT_H
29#define DICT_H
30
31#ifdef USE_GCC_PRAGMAS
32#pragma interface
33#endif
34
35#include "poppler-config.h"
36#include "Object.h"
37#include "goo/GooMutex.h"
38
39//------------------------------------------------------------------------
40// Dict
41//------------------------------------------------------------------------
42
43struct DictEntry {
44 char *key;
45 Object val;
46};
47
48class Dict {
49public:
50
51 // Constructor.
52 Dict(XRef *xrefA);
53 Dict(Dict* dictA);
54 Dict *copy(XRef *xrefA);
55
56 // Destructor.
57 ~Dict();
58
59 // Reference counting.
60 int incRef();
61 int decRef();
62
63 // Get number of entries.
64 int getLength() { return length; }
65
66 // Add an entry. NB: does not copy key.
67 void add(char *key, Object *val);
68
69 // Update the value of an existing entry, otherwise create it
70 void set(const char *key, Object *val);
71 // Remove an entry. This invalidate indexes
72 void remove(const char *key);
73
74 // Check if dictionary is of specified type.
75 GBool is(const char *type);
76
77 // Look up an entry and return the value. Returns a null object
78 // if <key> is not in the dictionary.
79 Object *lookup(const char *key, Object *obj, int recursion = 0);
80 Object *lookupNF(const char *key, Object *obj);
81 GBool lookupInt(const char *key, const char *alt_key, int *value);
82
83 // Iterative accessors.
84 char *getKey(int i);
85 Object *getVal(int i, Object *obj);
86 Object *getValNF(int i, Object *obj);
87
88 // Set the xref pointer. This is only used in one special case: the
89 // trailer dictionary, which is read before the xref table is
90 // parsed.
91 void setXRef(XRef *xrefA) { xref = xrefA; }
92
93 XRef *getXRef() { return xref; }
94
95 GBool hasKey(const char *key);
96
97private:
98
99 GBool sorted;
100 XRef *xref; // the xref table for this PDF file
101 DictEntry *entries; // array of entries
102 int size; // size of <entries> array
103 int length; // number of entries in dictionary
104 int ref; // reference count
105#if MULTITHREADED
106 GooMutex mutex;
107#endif
108
109 DictEntry *find(const char *key);
110};
111
112#endif
113