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 <aconf.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?
isOk()52   GBool isOk() { return ok; }
53 
54   // Get the error code (if isOk() returns false).
getErrorCode()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 		     CryptAlgorithm encAlgorithmA);
61 
62   // Is the file encrypted?
isEncrypted()63   GBool isEncrypted() { return encrypted; }
64 
65   // Check various permissions.
66   GBool okToPrint(GBool ignoreOwnerPW = gFalse);
67   GBool okToChange(GBool ignoreOwnerPW = gFalse);
68   GBool okToCopy(GBool ignoreOwnerPW = gFalse);
69   GBool okToAddNotes(GBool ignoreOwnerPW = gFalse);
70 
71   // Get catalog object.
getCatalog(Object * obj)72   Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); }
73 
74   // Fetch an indirect reference.
75   Object *fetch(int num, int gen, Object *obj);
76 
77   // Return the document's Info dictionary (if any).
78   Object *getDocInfo(Object *obj);
79   Object *getDocInfoNF(Object *obj);
80 
81   // Return the number of objects in the xref table.
getNumObjects()82   int getNumObjects() { return size; }
83 
84   // Return the offset of the last xref table.
getLastXRefPos()85   Guint getLastXRefPos() { return lastXRefPos; }
86 
87   // Return the catalog object reference.
getRootNum()88   int getRootNum() { return rootNum; }
getRootGen()89   int getRootGen() { return rootGen; }
90 
91   // Get end position for a stream in a damaged file.
92   // Returns false if unknown or file is not damaged.
93   GBool getStreamEnd(Guint streamStart, Guint *streamEnd);
94 
95   // Direct access.
getSize()96   int getSize() { return size; }
getEntry(int i)97   XRefEntry *getEntry(int i) { return &entries[i]; }
getTrailerDict()98   Object *getTrailerDict() { return &trailerDict; }
99 
100 private:
101 
102   BaseStream *str;		// input stream
103   Guint start;			// offset in file (to allow for garbage
104 				//   at beginning of file)
105   XRefEntry *entries;		// xref entries
106   int size;			// size of <entries> array
107   int rootNum, rootGen;		// catalog dict
108   GBool ok;			// true if xref table is valid
109   int errCode;			// error code (if <ok> is false)
110   Object trailerDict;		// trailer dictionary
111   Guint lastXRefPos;		// offset of last xref table
112   Guint *streamEnds;		// 'endstream' positions - only used in
113 				//   damaged files
114   int streamEndsLen;		// number of valid entries in streamEnds
115   ObjectStream *objStr;		// cached object stream
116   GBool encrypted;		// true if file is encrypted
117   int permFlags;		// permission bits
118   GBool ownerPasswordOk;	// true if owner password is correct
119   Guchar fileKey[16];		// file decryption key
120   int keyLength;		// length of key, in bytes
121   int encVersion;		// encryption version
122   CryptAlgorithm encAlgorithm;	// encryption algorithm
123 
124   Guint getStartXref();
125   GBool readXRef(Guint *pos);
126   GBool readXRefTable(Parser *parser, Guint *pos);
127   GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n);
128   GBool readXRefStream(Stream *xrefStr, Guint *pos);
129   GBool constructXRef();
130   Guint strToUnsigned(char *s);
131 };
132 
133 #endif
134