You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.7 KiB
137 lines
3.7 KiB
//========================================================================
|
|
//
|
|
// XRef.h
|
|
//
|
|
// Copyright 1996-2003 Glyph & Cog, LLC
|
|
//
|
|
//========================================================================
|
|
|
|
#ifndef XREF_H
|
|
#define XREF_H
|
|
|
|
#include <aconf.h>
|
|
|
|
#ifdef USE_GCC_PRAGMAS
|
|
#pragma interface
|
|
#endif
|
|
|
|
#include "gtypes.h"
|
|
#include "Object.h"
|
|
|
|
class Dict;
|
|
class Stream;
|
|
class Parser;
|
|
class ObjectStream;
|
|
|
|
//------------------------------------------------------------------------
|
|
// XRef
|
|
//------------------------------------------------------------------------
|
|
|
|
enum XRefEntryType {
|
|
xrefEntryFree,
|
|
xrefEntryUncompressed,
|
|
xrefEntryCompressed
|
|
};
|
|
|
|
struct XRefEntry {
|
|
Guint offset;
|
|
int gen;
|
|
XRefEntryType type;
|
|
};
|
|
|
|
class XRef {
|
|
public:
|
|
|
|
// Constructor. Read xref table from stream.
|
|
XRef(BaseStream *strA);
|
|
|
|
// Destructor.
|
|
~XRef();
|
|
|
|
// Is xref table valid?
|
|
GBool isOk() { return ok; }
|
|
|
|
// Get the error code (if isOk() returns false).
|
|
int getErrorCode() { return errCode; }
|
|
|
|
// Set the encryption parameters.
|
|
void setEncryption(int permFlagsA, GBool ownerPasswordOkA,
|
|
Guchar *fileKeyA, int keyLengthA, int encVersionA,
|
|
CryptAlgorithm encAlgorithmA);
|
|
|
|
// Is the file encrypted?
|
|
GBool isEncrypted() { return encrypted; }
|
|
|
|
// Check various permissions.
|
|
GBool okToPrint(GBool ignoreOwnerPW = gFalse);
|
|
GBool okToChange(GBool ignoreOwnerPW = gFalse);
|
|
GBool okToCopy(GBool ignoreOwnerPW = gFalse);
|
|
GBool okToAddNotes(GBool ignoreOwnerPW = gFalse);
|
|
|
|
// Get catalog object.
|
|
Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); }
|
|
|
|
// Fetch an indirect reference.
|
|
Object *fetch(int num, int gen, Object *obj);
|
|
|
|
// Return the document's Info dictionary (if any).
|
|
Object *getDocInfo(Object *obj);
|
|
Object *getDocInfoNF(Object *obj);
|
|
|
|
// Return the number of objects in the xref table.
|
|
int getNumObjects() { return size; }
|
|
|
|
// Return the offset of the last xref table.
|
|
Guint getLastXRefPos() { return lastXRefPos; }
|
|
|
|
// Return the catalog object reference.
|
|
int getRootNum() { return rootNum; }
|
|
int getRootGen() { return rootGen; }
|
|
|
|
// Get end position for a stream in a damaged file.
|
|
// Returns false if unknown or file is not damaged.
|
|
GBool getStreamEnd(Guint streamStart, Guint *streamEnd);
|
|
|
|
// Retuns the entry that belongs to the offset
|
|
int getNumEntry(Guint offset) const;
|
|
|
|
// Direct access.
|
|
int getSize() { return size; }
|
|
XRefEntry *getEntry(int i) { return &entries[i]; }
|
|
Object *getTrailerDict() { return &trailerDict; }
|
|
|
|
private:
|
|
|
|
BaseStream *str; // input stream
|
|
Guint start; // offset in file (to allow for garbage
|
|
// at beginning of file)
|
|
XRefEntry *entries; // xref entries
|
|
int size; // size of <entries> array
|
|
int rootNum, rootGen; // catalog dict
|
|
GBool ok; // true if xref table is valid
|
|
int errCode; // error code (if <ok> is false)
|
|
Object trailerDict; // trailer dictionary
|
|
Guint lastXRefPos; // offset of last xref table
|
|
Guint *streamEnds; // 'endstream' positions - only used in
|
|
// damaged files
|
|
int streamEndsLen; // number of valid entries in streamEnds
|
|
ObjectStream *objStr; // cached object stream
|
|
GBool encrypted; // true if file is encrypted
|
|
int permFlags; // permission bits
|
|
GBool ownerPasswordOk; // true if owner password is correct
|
|
Guchar fileKey[16]; // file decryption key
|
|
int keyLength; // length of key, in bytes
|
|
int encVersion; // encryption version
|
|
CryptAlgorithm encAlgorithm; // encryption algorithm
|
|
|
|
Guint getStartXref();
|
|
GBool readXRef(Guint *pos);
|
|
GBool readXRefTable(Parser *parser, Guint *pos);
|
|
GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n);
|
|
GBool readXRefStream(Stream *xrefStr, Guint *pos);
|
|
GBool constructXRef();
|
|
Guint strToUnsigned(char *s);
|
|
};
|
|
|
|
#endif
|