]>
Commit | Line | Data |
---|---|---|
ef416fc2 | 1 | //======================================================================== |
2 | // | |
3 | // XRef.h | |
4 | // | |
5 | // Copyright 1996-2003 Glyph & Cog, LLC | |
6 | // | |
7 | //======================================================================== | |
8 | ||
9 | #ifndef XREF_H | |
10 | #define XREF_H | |
11 | ||
12 | #include <config.h> | |
13 | ||
14 | #ifdef USE_GCC_PRAGMAS | |
15 | #pragma interface | |
16 | #endif | |
17 | ||
18 | #include "gtypes.h" | |
19 | #include "Object.h" | |
20 | ||
21 | class Dict; | |
22 | class Stream; | |
23 | class Parser; | |
24 | class ObjectStream; | |
25 | ||
26 | //------------------------------------------------------------------------ | |
27 | // XRef | |
28 | //------------------------------------------------------------------------ | |
29 | ||
30 | enum XRefEntryType { | |
31 | xrefEntryFree, | |
32 | xrefEntryUncompressed, | |
33 | xrefEntryCompressed | |
34 | }; | |
35 | ||
36 | struct XRefEntry { | |
37 | Guint offset; | |
38 | int gen; | |
39 | XRefEntryType type; | |
40 | }; | |
41 | ||
42 | class XRef { | |
43 | public: | |
44 | ||
45 | // Constructor. Read xref table from stream. | |
46 | XRef(BaseStream *strA); | |
47 | ||
48 | // Destructor. | |
49 | ~XRef(); | |
50 | ||
51 | // Is xref table valid? | |
52 | GBool isOk() { return ok; } | |
53 | ||
54 | // Get the error code (if isOk() returns false). | |
55 | int getErrorCode() { return errCode; } | |
56 | ||
57 | // Set the encryption parameters. | |
58 | void setEncryption(int permFlagsA, GBool ownerPasswordOkA, | |
59 | Guchar *fileKeyA, int keyLengthA, int encVersionA); | |
60 | ||
61 | // Is the file encrypted? | |
62 | GBool isEncrypted() { return encrypted; } | |
63 | ||
64 | // Check various permissions. | |
65 | GBool okToPrint(GBool ignoreOwnerPW = gFalse); | |
66 | GBool okToChange(GBool ignoreOwnerPW = gFalse); | |
67 | GBool okToCopy(GBool ignoreOwnerPW = gFalse); | |
68 | GBool okToAddNotes(GBool ignoreOwnerPW = gFalse); | |
69 | ||
70 | // Get catalog object. | |
71 | Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); } | |
72 | ||
73 | // Fetch an indirect reference. | |
74 | Object *fetch(int num, int gen, Object *obj); | |
75 | ||
76 | // Return the document's Info dictionary (if any). | |
77 | Object *getDocInfo(Object *obj); | |
78 | Object *getDocInfoNF(Object *obj); | |
79 | ||
80 | // Return the number of objects in the xref table. | |
81 | int getNumObjects() { return size; } | |
82 | ||
83 | // Return the offset of the last xref table. | |
84 | Guint getLastXRefPos() { return lastXRefPos; } | |
85 | ||
86 | // Return the catalog object reference. | |
87 | int getRootNum() { return rootNum; } | |
88 | int getRootGen() { return rootGen; } | |
89 | ||
90 | // Get end position for a stream in a damaged file. | |
91 | // Returns false if unknown or file is not damaged. | |
92 | GBool getStreamEnd(Guint streamStart, Guint *streamEnd); | |
93 | ||
94 | // Direct access. | |
95 | int getSize() { return size; } | |
96 | XRefEntry *getEntry(int i) { return &entries[i]; } | |
97 | Object *getTrailerDict() { return &trailerDict; } | |
98 | ||
99 | private: | |
100 | ||
101 | BaseStream *str; // input stream | |
102 | Guint start; // offset in file (to allow for garbage | |
103 | // at beginning of file) | |
104 | XRefEntry *entries; // xref entries | |
105 | int size; // size of <entries> array | |
106 | int rootNum, rootGen; // catalog dict | |
107 | GBool ok; // true if xref table is valid | |
108 | int errCode; // error code (if <ok> is false) | |
109 | Object trailerDict; // trailer dictionary | |
110 | Guint lastXRefPos; // offset of last xref table | |
111 | Guint *streamEnds; // 'endstream' positions - only used in | |
112 | // damaged files | |
113 | int streamEndsLen; // number of valid entries in streamEnds | |
114 | ObjectStream *objStr; // cached object stream | |
115 | GBool encrypted; // true if file is encrypted | |
116 | int permFlags; // permission bits | |
117 | GBool ownerPasswordOk; // true if owner password is correct | |
118 | Guchar fileKey[16]; // file decryption key | |
119 | int keyLength; // length of key, in bytes | |
120 | int encVersion; // encryption algorithm | |
121 | ||
122 | Guint getStartXref(); | |
123 | GBool readXRef(Guint *pos); | |
124 | GBool readXRefTable(Parser *parser, Guint *pos); | |
125 | GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n); | |
126 | GBool readXRefStream(Stream *xrefStr, Guint *pos); | |
127 | GBool constructXRef(); | |
128 | Guint strToUnsigned(char *s); | |
129 | }; | |
130 | ||
131 | #endif |