zipios  2.2.0
Zipios – a small C++ library that provides easy access to .zip files.
fileentry.hpp
Go to the documentation of this file.
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 
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 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;
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:
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;
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
Define a type to manage date and time in MS-DOS format.
std::ostream & operator<<(std::ostream &os, FileCollection const &collection)
Write a FileCollection to the output stream.
The zipios namespace includes the Zipios library definitions.
Definition: backbuffer.cpp:35
buffer_t m_extra_field
Definition: fileentry.hpp:140
StorageMethod
The types used with FileEntry::setMethod and FileEntry::getMethod.
Definition: fileentry.hpp:48
int CompressionLevel
The compression level to be used to save an entry.
Definition: fileentry.hpp:85
FilePath m_filename
Definition: fileentry.hpp:132
uint32_t crc32_t
Definition: fileentry.hpp:81
A FileEntry represents an entry in a FileCollection.
Definition: fileentry.hpp:75
Define the zipios::FilePath class.
Handle a file path and name and its statistics.
Definition: filepath.hpp:46
std::vector< unsigned char > buffer_t
Definition: fileentry.hpp:80
std::shared_ptr< FileEntry > pointer_t
Definition: fileentry.hpp:78
std::string m_comment
Definition: fileentry.hpp:133
std::vector< pointer_t > vector_t
Definition: fileentry.hpp:79