Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

190 lines
5.7 KiB
C++

//========================================================================
//
// 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 "gfile.h"
#include "Object.h"
#if MULTITHREADED
#include "GMutex.h"
#endif
class Dict;
class Stream;
class Parser;
class ObjectStream;
class XRefPosSet;
//------------------------------------------------------------------------
// XRef
//------------------------------------------------------------------------
enum XRefEntryType {
xrefEntryFree,
xrefEntryUncompressed,
xrefEntryCompressed
};
struct XRefEntry {
GFileOffset offset;
int gen;
XRefEntryType type;
};
struct XRefCacheEntry {
int num;
int gen;
Object obj;
};
#define xrefCacheSize 16
#define objStrCacheSize 128
#define objStrCacheTimeout 1000
class XRef {
public:
// Constructor. Read xref table from stream.
XRef(BaseStream *strA, GBool repair);
// 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; }
void offEncrypted() { encrypted = gFalse; }
void onEncrypted() { encrypted = gTrue; }
GBool getEncryption(int *permFlagsA, GBool *ownerPasswordOkA,
int *keyLengthA, int *encVersionA,
CryptAlgorithm *encAlgorithmA);
// Check various permissions.
GBool okToPrint(GBool ignoreOwnerPW = gFalse);
GBool okToChange(GBool ignoreOwnerPW = gFalse);
GBool okToCopy(GBool ignoreOwnerPW = gFalse);
GBool okToAddNotes(GBool ignoreOwnerPW = gFalse);
int getPermFlags() { return permFlags; }
// Get catalog object.
Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); }
// Fetch an indirect reference.
Object *fetch(int num, int gen, Object *obj, int recursion = 0);
// 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 last + 1; }
// Return the offset of the last xref table.
GFileOffset getLastXRefPos() { return lastXRefPos; }
// Return the offset of the 'startxref' at the end of the file.
GFileOffset getLastStartxrefPos() { return lastStartxrefPos; }
// Return the catalog object reference.
int getRootNum() { return rootNum; }
int getRootGen() { return rootGen; }
// Get the xref table positions.
int getNumXRefTables() { return xrefTablePosLen; }
GFileOffset getXRefTablePos(int idx) { return xrefTablePos[idx]; }
// Get end position for a stream in a damaged file.
// Returns false if unknown or file is not damaged.
GBool getStreamEnd(GFileOffset streamStart, GFileOffset *streamEnd);
// Direct access.
int getSize() { return size; }
XRefEntry *getEntry(int i) { return &entries[i]; }
Object *getTrailerDict() { return &trailerDict; }
private:
BaseStream *str; // input stream
GFileOffset start; // offset in file (to allow for garbage
// at beginning of file)
XRefEntry *entries; // xref entries
int size; // size of <entries> array
int last; // last used index in <entries>
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
GFileOffset lastXRefPos; // offset of last xref table
GFileOffset lastStartxrefPos; // offset of 'startxref' at end of file
GFileOffset *xrefTablePos; // positions of all xref tables
int xrefTablePosLen; // number of xref table positions
GFileOffset *streamEnds; // 'endstream' positions - only used in
// damaged files
int streamEndsLen; // number of valid entries in streamEnds
ObjectStream * // cached object streams
objStrs[objStrCacheSize];
int objStrCacheLength; // number of valid entries in objStrs[]
Guint // time of last use for each obj stream
objStrLastUse[objStrCacheSize];
Guint objStrTime; // current time for the obj stream cache
#if MULTITHREADED
GMutex objStrsMutex;
#endif
GBool encrypted; // true if file is encrypted
int permFlags; // permission bits
GBool ownerPasswordOk; // true if owner password is correct
Guchar fileKey[32]; // file decryption key
int keyLength; // length of key, in bytes
int encVersion; // encryption version
CryptAlgorithm encAlgorithm; // encryption algorithm
XRefCacheEntry // cache of recently accessed objects
cache[xrefCacheSize];
#if MULTITHREADED
GMutex cacheMutex;
#endif
GFileOffset getStartXref();
GBool readXRef(GFileOffset *pos, XRefPosSet *posSet, GBool hybrid);
GBool readXRefTable(GFileOffset *pos, int offset, XRefPosSet *posSet);
GBool readXRefStream(Stream *xrefStr, GFileOffset *pos, GBool hybrid);
GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n);
GBool constructXRef();
void constructTrailerDict(GFileOffset pos);
GBool saveTrailerDict(Dict *dict, GBool isXRefStream);
char *constructObjectEntry(char *p, GFileOffset pos, int *objNum);
void constructObjectStreamEntries(Object *objStr, int objStrObjNum);
GBool constructXRefEntry(int num, int gen, GFileOffset pos,
XRefEntryType type);
GBool getObjectStreamObject(int objStrNum, int objIdx,
int objNum, Object *obj);
ObjectStream *getObjectStream(int objStrNum);
void cleanObjectStreamCache();
GFileOffset strToFileOffset(char *s);
};
#endif