//======================================================================== // // CachedFile.h // // Caching files support. // // This file is licensed under the GPLv2 or later // // Copyright 2009 Stefan Thomas // Copyright 2010 Hib Eris // Copyright 2010, 2018-2020 Albert Astals Cid // //======================================================================== #ifndef CACHEDFILE_H #define CACHEDFILE_H #include "poppler-config.h" #include "Object.h" #include "Stream.h" #include //------------------------------------------------------------------------ #define CachedFileChunkSize 8192 // This should be a multiple of cachedStreamBufSize class GooString; class CachedFileLoader; //------------------------------------------------------------------------ // CachedFile // // CachedFile gives FILE-like access to a document at a specified URI. // In the constructor, you specify a CachedFileLoader that handles loading // the data from the document. The CachedFile requests no more data then it // needs from the CachedFileLoader. //------------------------------------------------------------------------ class CachedFile { friend class CachedFileWriter; public: CachedFile(CachedFileLoader *cacheLoader, GooString *uri); CachedFile(const CachedFile &) = delete; CachedFile &operator=(const CachedFile &) = delete; unsigned int getLength() const { return length; } long int tell(); int seek(long int offset, int origin); size_t read(void *ptr, size_t unitsize, size_t count); size_t write(const char *ptr, size_t size, size_t fromByte); int cache(const std::vector &ranges); // Reference counting. void incRefCnt(); void decRefCnt(); private: ~CachedFile(); enum ChunkState { chunkStateNew = 0, chunkStateLoaded }; typedef struct { ChunkState state; char data[CachedFileChunkSize]; } Chunk; int cache(size_t offset, size_t length); CachedFileLoader *loader; GooString *uri; size_t length; size_t streamPos; std::vector *chunks; int refCnt; // reference count }; //------------------------------------------------------------------------ // CachedFileWriter // // CachedFileWriter handles sequential writes to a CachedFile. // On construction, you specify the CachedFile and the chunks of it to which data // should be written. //------------------------------------------------------------------------ class CachedFileWriter { public: // Construct a CachedFile Writer. // The caller is responsible for deleting the cachedFile and chunksA. CachedFileWriter(CachedFile *cachedFile, std::vector *chunksA); ~CachedFileWriter(); // Writes size bytes from ptr to cachedFile, returns number of bytes written. size_t write(const char *ptr, size_t size); private: CachedFile *cachedFile; std::vector *chunks; std::vector::iterator it; size_t offset; }; //------------------------------------------------------------------------ // CachedFileLoader // // CachedFileLoader is an abstact class that specifies the interface for // loadng data from an URI into a CachedFile. //------------------------------------------------------------------------ class CachedFileLoader { public: CachedFileLoader() = default; virtual ~CachedFileLoader(); CachedFileLoader(const CachedFileLoader &) = delete; CachedFileLoader &operator=(const CachedFileLoader &) = delete; // Initializes the file load. // Returns the length of the file. // The caller is responsible for deleting uri and cachedFile. virtual size_t init(GooString *uri, CachedFile *cachedFile) = 0; // Loads specified byte ranges and passes it to the writer to store them. // Returns 0 on success, Anything but 0 on failure. // The caller is responsible for deleting the writer. virtual int load(const std::vector &ranges, CachedFileWriter *writer) = 0; }; //------------------------------------------------------------------------ #endif