Line data Source code
1 : #pragma once
2 : #ifndef ZIPIOS_FILEENTRY_HPP
3 : #define ZIPIOS_FILEENTRY_HPP
4 :
5 : /*
6 : Zipios -- a small C++ library that provides easy access to .zip files.
7 :
8 : Copyright (C) 2000-2007 Thomas Sondergaard
9 : Copyright (C) 2015-2019 Made to Order Software Corporation
10 :
11 : This library is free software; you can redistribute it and/or
12 : modify it under the terms of the GNU Lesser General Public
13 : License as published by the Free Software Foundation; either
14 : version 2.1 of the License, or (at your option) any later version.
15 :
16 : This library is distributed in the hope that it will be useful,
17 : but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 : Lesser General Public License for more details.
20 :
21 : You should have received a copy of the GNU Lesser General Public
22 : License along with this library; if not, write to the Free Software
23 : Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 : */
25 :
26 : /** \file
27 : * \brief Define the zipios::FileEntry class.
28 : *
29 : * The zipios::FileEntry class is an interface defining a virtual
30 : * representation to a file in a Zip archive or on disk.
31 : *
32 : * File entries are found in various file collections.
33 : *
34 : * \sa zipios::FileCollection
35 : */
36 :
37 : #include "zipios/filepath.hpp"
38 : #include "zipios/dosdatetime.hpp"
39 :
40 : #include <memory>
41 : #include <vector>
42 :
43 :
44 : namespace zipios
45 : {
46 :
47 :
48 : enum class StorageMethod : uint8_t
49 : {
50 : STORED = 0,
51 : SHRUNK = 1,
52 : REDUCED1 = 2,
53 : REDUCED2 = 3,
54 : REDUCED3 = 4,
55 : REDUCED4 = 5,
56 : IMPLODED = 6,
57 : TOKENIZED = 7,
58 : DEFLATED = 8,
59 : DEFLATED64 = 9,
60 : OLD_TERSE = 10,
61 : RESERVED11 = 11,
62 : BZIP2 = 12,
63 : REVERVED13 = 13,
64 : LZMA = 14,
65 : RESERVED15 = 15,
66 : RESERVED16 = 16,
67 : RESERVED17 = 17,
68 : NEW_TERSE = 18,
69 : LZ77 = 19,
70 : WAVPACK = 97,
71 : PPMD_I_1 = 98
72 : };
73 :
74 :
75 258114 : class FileEntry
76 : {
77 : public:
78 : typedef std::shared_ptr<FileEntry> pointer_t;
79 : typedef std::vector<pointer_t> vector_t;
80 : typedef std::vector<unsigned char> buffer_t;
81 : typedef uint32_t crc32_t;
82 :
83 : // we use our own compression level type, it gets converted as
84 : // required when the level is to be used by a compression scheme
85 : typedef int CompressionLevel;
86 :
87 : static CompressionLevel const COMPRESSION_LEVEL_DEFAULT = -3;
88 : static CompressionLevel const COMPRESSION_LEVEL_SMALLEST = -2;
89 : static CompressionLevel const COMPRESSION_LEVEL_FASTEST = -1;
90 : static CompressionLevel const COMPRESSION_LEVEL_NONE = 0;
91 : static CompressionLevel const COMPRESSION_LEVEL_MINIMUM = 1;
92 : static CompressionLevel const COMPRESSION_LEVEL_MAXIMUM = 100;
93 :
94 : FileEntry(FilePath const & filename, std::string const & comment = std::string());
95 : virtual pointer_t clone() const = 0;
96 : virtual ~FileEntry();
97 :
98 : virtual std::string getComment() const;
99 : virtual size_t getCompressedSize() const;
100 : virtual crc32_t getCrc() const;
101 : std::streampos getEntryOffset() const;
102 : virtual buffer_t getExtra() const;
103 : virtual size_t getHeaderSize() const;
104 : virtual CompressionLevel getLevel() const;
105 : virtual StorageMethod getMethod() const;
106 : virtual std::string getName() const;
107 : virtual std::string getFileName() const;
108 : virtual size_t getSize() const;
109 : virtual DOSDateTime::dosdatetime_t
110 : getTime() const;
111 : virtual std::time_t getUnixTime() const;
112 : bool hasCrc() const;
113 : virtual bool isDirectory() const;
114 : virtual bool isEqual(FileEntry const& file_entry) const;
115 : virtual bool isValid() const;
116 : virtual void setComment(std::string const& comment);
117 : virtual void setCompressedSize(size_t size);
118 : virtual void setCrc(crc32_t crc);
119 : void setEntryOffset(std::streampos offset);
120 : virtual void setExtra(buffer_t const& extra);
121 : virtual void setLevel(CompressionLevel level);
122 : virtual void setMethod(StorageMethod method);
123 : virtual void setSize(size_t size);
124 : virtual void setTime(DOSDateTime::dosdatetime_t time);
125 : virtual void setUnixTime(std::time_t time);
126 : virtual std::string toString() const;
127 :
128 : virtual void read(std::istream& is);
129 : virtual void write(std::ostream& os);
130 :
131 : protected:
132 : FilePath m_filename;
133 : std::string m_comment;
134 : size_t m_uncompressed_size = 0;
135 : time_t m_unix_time = 0;
136 : std::streampos m_entry_offset = 0;
137 : StorageMethod m_compress_method = StorageMethod::STORED;
138 : CompressionLevel m_compression_level = COMPRESSION_LEVEL_DEFAULT;
139 : uint32_t m_crc_32 = 0;
140 : buffer_t m_extra_field;
141 : bool m_has_crc_32 = false;
142 : bool m_valid = false;
143 : };
144 :
145 :
146 : std::ostream& operator << (std::ostream& os, FileEntry const& entry);
147 :
148 :
149 : } // zipios namespace
150 :
151 : // Local Variables:
152 : // mode: cpp
153 : // indent-tabs-mode: nil
154 : // c-basic-offset: 4
155 : // tab-width: 4
156 : // End:
157 :
158 : // vim: ts=4 sw=4 et
159 : #endif
|