#ifndef XREF_H
#define XREF_H
#include <config.h>
#ifdef USE_GCC_PRAGMAS
#pragma interface
#endif
#include "gtypes.h"
#include "Object.h"
class Dict;
class Stream;
class Parser;
class ObjectStream;
enum XRefEntryType {
xrefEntryFree,
xrefEntryUncompressed,
xrefEntryCompressed
};
struct XRefEntry {
Guint offset;
int gen;
XRefEntryType type;
};
class XRef {
public:
XRef(BaseStream *strA);
~XRef();
GBool isOk() { return ok; }
int getErrorCode() { return errCode; }
void setEncryption(int permFlagsA, GBool ownerPasswordOkA,
Guchar *fileKeyA, int keyLengthA, int encVersionA);
GBool isEncrypted() { return encrypted; }
GBool okToPrint(GBool ignoreOwnerPW = gFalse);
GBool okToChange(GBool ignoreOwnerPW = gFalse);
GBool okToCopy(GBool ignoreOwnerPW = gFalse);
GBool okToAddNotes(GBool ignoreOwnerPW = gFalse);
Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); }
Object *fetch(int num, int gen, Object *obj);
Object *getDocInfo(Object *obj);
Object *getDocInfoNF(Object *obj);
int getNumObjects() { return size; }
Guint getLastXRefPos() { return lastXRefPos; }
int getRootNum() { return rootNum; }
int getRootGen() { return rootGen; }
GBool getStreamEnd(Guint streamStart, Guint *streamEnd);
int getSize() { return size; }
XRefEntry *getEntry(int i) { return &entries[i]; }
Object *getTrailerDict() { return &trailerDict; }
private:
BaseStream *str; Guint start; XRefEntry *entries; int size; int rootNum, rootGen; GBool ok; int errCode; Object trailerDict; Guint lastXRefPos; Guint *streamEnds; int streamEndsLen; ObjectStream *objStr; GBool encrypted; int permFlags; GBool ownerPasswordOk; Guchar fileKey[16]; int keyLength; int encVersion;
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