| //======================================================================== |
| // |
| // CachedFile.h |
| // |
| // Caching files support. |
| // |
| // This file is licensed under the GPLv2 or later |
| // |
| // Copyright 2009 Stefan Thomas <thomas@eload24.com> |
| // Copyright 2010 Hib Eris <hib@hiberis.nl> |
| // Copyright 2010, 2018 Albert Astals Cid <aacid@kde.org> |
| // |
| //======================================================================== |
| |
| #ifndef CACHEDFILE_H |
| #define CACHEDFILE_H |
| |
| #include "poppler-config.h" |
| |
| #include "Object.h" |
| #include "Stream.h" |
| |
| #include <vector> |
| |
| //------------------------------------------------------------------------ |
| |
| #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() { 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<ByteRange> &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<Chunk> *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<int> *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<int> *chunks; |
| std::vector<int>::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<ByteRange> &ranges, CachedFileWriter *writer) = 0; |
| |
| }; |
| |
| //------------------------------------------------------------------------ |
| |
| #endif |