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 
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;
135  time_t m_unix_time = 0;
136  std::streampos m_entry_offset = 0;
139  uint32_t m_crc_32 = 0;
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
zipios::FileEntry::CompressionLevel
int CompressionLevel
The compression level to be used to save an entry.
Definition: fileentry.hpp:85
zipios::FileEntry::m_extra_field
buffer_t m_extra_field
Definition: fileentry.hpp:140
zipios::FileEntry::getFileName
virtual std::string getFileName() const
Return the basename of this entry.
Definition: fileentry.cpp:319
zipios::FileEntry::getName
virtual std::string getName() const
Return the filename of the entry.
Definition: fileentry.cpp:302
zipios::StorageMethod::OLD_TERSE
@ OLD_TERSE
zipios::FileEntry::setUnixTime
virtual void setUnixTime(std::time_t time)
Sets the time field in Unix time format for the entry.
Definition: fileentry.cpp:676
zipios::FileEntry::crc32_t
uint32_t crc32_t
Definition: fileentry.hpp:81
zipios::StorageMethod::TOKENIZED
@ TOKENIZED
zipios::FileEntry::getMethod
virtual StorageMethod getMethod() const
Return the method used to create this entry.
Definition: fileentry.cpp:281
zipios::FileEntry::setExtra
virtual void setExtra(buffer_t const &extra)
Set the extra field buffer.
Definition: fileentry.cpp:533
zipios::FileEntry::m_valid
bool m_valid
Definition: fileentry.hpp:142
zipios::DOSDateTime::dosdatetime_t
uint32_t dosdatetime_t
Definition: dosdatetime.hpp:47
zipios::FileEntry::m_compression_level
CompressionLevel m_compression_level
Definition: fileentry.hpp:138
zipios::StorageMethod::DEFLATED64
@ DEFLATED64
zipios::FileEntry::m_uncompressed_size
size_t m_uncompressed_size
Definition: fileentry.hpp:134
filepath.hpp
Define the zipios::FilePath class.
zipios::FileEntry
A FileEntry represents an entry in a FileCollection.
Definition: fileentry.hpp:75
zipios::FileEntry::setEntryOffset
void setEntryOffset(std::streampos offset)
Defines the position of the entry in a Zip archive.
Definition: fileentry.cpp:518
zipios::FileEntry::COMPRESSION_LEVEL_FASTEST
static const CompressionLevel COMPRESSION_LEVEL_FASTEST
Definition: fileentry.hpp:89
zipios::StorageMethod::REVERVED13
@ REVERVED13
zipios::FileEntry::write
virtual void write(std::ostream &os)
Write this FileEntry to the output stream.
Definition: fileentry.cpp:750
zipios::StorageMethod::SHRUNK
@ SHRUNK
zipios::FileEntry::setSize
virtual void setSize(size_t size)
Sets the size field for the entry.
Definition: fileentry.cpp:643
zipios::FileEntry::getUnixTime
virtual std::time_t getUnixTime() const
Get the Unix date/time of this entry.
Definition: fileentry.cpp:380
dosdatetime.hpp
Define a type to manage date and time in MS-DOS format.
zipios::FileEntry::m_filename
FilePath m_filename
Definition: fileentry.hpp:132
zipios::FileEntry::FileEntry
FileEntry(FilePath const &filename, std::string const &comment=std::string())
Initialize a FileEntry object.
Definition: fileentry.cpp:99
zipios::FileEntry::setMethod
virtual void setMethod(StorageMethod method)
Sets the storage method field for the entry.
Definition: fileentry.cpp:591
zipios::StorageMethod::RESERVED16
@ RESERVED16
zipios::FileEntry::m_has_crc_32
bool m_has_crc_32
Definition: fileentry.hpp:141
zipios::FileEntry::pointer_t
std::shared_ptr< FileEntry > pointer_t
Definition: fileentry.hpp:78
zipios::FileEntry::setLevel
virtual void setLevel(CompressionLevel level)
Define the level of compression to use by this FileEntry.
Definition: fileentry.cpp:554
zipios::FileEntry::getHeaderSize
virtual size_t getHeaderSize() const
Retrieve the size of the header.
Definition: fileentry.cpp:236
zipios::FileEntry::isDirectory
virtual bool isDirectory() const
Check whether the filename represents a directory.
Definition: fileentry.cpp:408
zipios::FileEntry::m_comment
std::string m_comment
Definition: fileentry.hpp:133
zipios::StorageMethod::RESERVED15
@ RESERVED15
zipios::FileEntry::COMPRESSION_LEVEL_SMALLEST
static const CompressionLevel COMPRESSION_LEVEL_SMALLEST
Definition: fileentry.hpp:88
zipios::operator<<
std::ostream & operator<<(std::ostream &os, FileCollection const &collection)
Write a FileCollection to the output stream.
Definition: filecollection.cpp:598
zipios::FileEntry::COMPRESSION_LEVEL_MAXIMUM
static const CompressionLevel COMPRESSION_LEVEL_MAXIMUM
Definition: fileentry.hpp:92
zipios::StorageMethod::RESERVED11
@ RESERVED11
zipios::FileEntry::COMPRESSION_LEVEL_DEFAULT
static const CompressionLevel COMPRESSION_LEVEL_DEFAULT
Definition: fileentry.hpp:87
zipios::FileEntry::hasCrc
bool hasCrc() const
Check whether the CRC32 was defined.
Definition: fileentry.cpp:394
zipios::FileEntry::~FileEntry
virtual ~FileEntry()
Clean up a FileEntry object.
Definition: fileentry.cpp:133
zipios::FileEntry::COMPRESSION_LEVEL_NONE
static const CompressionLevel COMPRESSION_LEVEL_NONE
Definition: fileentry.hpp:90
zipios::StorageMethod::LZMA
@ LZMA
zipios::StorageMethod::IMPLODED
@ IMPLODED
zipios::FilePath
Handle a file path and name and its statistics.
Definition: filepath.hpp:46
zipios::StorageMethod::LZ77
@ LZ77
zipios::FileEntry::getCrc
virtual crc32_t getCrc() const
Return the CRC of the entry.
Definition: fileentry.cpp:181
zipios::StorageMethod::BZIP2
@ BZIP2
zipios::StorageMethod::REDUCED1
@ REDUCED1
zipios::FileEntry::setTime
virtual void setTime(DOSDateTime::dosdatetime_t time)
Set the FileEntry time using a DOS time.
Definition: fileentry.cpp:659
zipios::StorageMethod::RESERVED17
@ RESERVED17
zipios::FileEntry::isEqual
virtual bool isEqual(FileEntry const &file_entry) const
Compare two file entries for equality.
Definition: fileentry.cpp:431
zipios::FileEntry::setCrc
virtual void setCrc(crc32_t crc)
Save the CRC of the entry.
Definition: fileentry.cpp:498
zipios::FileEntry::m_compress_method
StorageMethod m_compress_method
Definition: fileentry.hpp:137
zipios::StorageMethod::REDUCED2
@ REDUCED2
zipios::FileEntry::buffer_t
std::vector< unsigned char > buffer_t
Definition: fileentry.hpp:80
zipios::StorageMethod::REDUCED4
@ REDUCED4
zipios::FileEntry::getEntryOffset
std::streampos getEntryOffset() const
Get the offset of this entry in a Zip archive.
Definition: fileentry.cpp:201
zipios::FileEntry::setComment
virtual void setComment(std::string const &comment)
Set the comment field for the FileEntry.
Definition: fileentry.cpp:467
zipios::FileEntry::toString
virtual std::string toString() const
Returns a human-readable string representation of the entry.
Definition: fileentry.cpp:691
zipios::StorageMethod
StorageMethod
The types used with FileEntry::setMethod and FileEntry::getMethod.
Definition: fileentry.hpp:48
zipios::StorageMethod::NEW_TERSE
@ NEW_TERSE
zipios::StorageMethod::WAVPACK
@ WAVPACK
zipios::FileEntry::getExtra
virtual buffer_t getExtra() const
Some extra data to be stored along the entry.
Definition: fileentry.cpp:221
zipios::FileEntry::getLevel
virtual CompressionLevel getLevel() const
Retrieve the compression level.
Definition: fileentry.cpp:261
zipios::FileEntry::setCompressedSize
virtual void setCompressedSize(size_t size)
Set the size when the file is compressed.
Definition: fileentry.cpp:486
zipios::FileEntry::isValid
virtual bool isValid() const
Check whether this entry is valid.
Definition: fileentry.cpp:453
zipios::FileEntry::getComment
virtual std::string getComment() const
Retrieve the comment of the file entry.
Definition: fileentry.cpp:149
zipios::FileEntry::clone
virtual pointer_t clone() const =0
Create a clone of a file entry.
zipios::FileEntry::getTime
virtual DOSDateTime::dosdatetime_t getTime() const
Get the MS-DOS date/time of this entry.
Definition: fileentry.cpp:348
zipios::StorageMethod::DEFLATED
@ DEFLATED
zipios::StorageMethod::STORED
@ STORED
zipios::FileEntry::m_unix_time
time_t m_unix_time
Definition: fileentry.hpp:135
zipios::FileEntry::read
virtual void read(std::istream &is)
Read this FileEntry from the input stream.
Definition: fileentry.cpp:732
zipios::StorageMethod::PPMD_I_1
@ PPMD_I_1
zipios::StorageMethod::REDUCED3
@ REDUCED3
zipios::FileEntry::vector_t
std::vector< pointer_t > vector_t
Definition: fileentry.hpp:79
zipios::FileEntry::getSize
virtual size_t getSize() const
Retrieve the size of the file when uncompressed.
Definition: fileentry.cpp:331
zipios::FileEntry::m_entry_offset
std::streampos m_entry_offset
Definition: fileentry.hpp:136
zipios::FileEntry::COMPRESSION_LEVEL_MINIMUM
static const CompressionLevel COMPRESSION_LEVEL_MINIMUM
Definition: fileentry.hpp:91
zipios
The zipios namespace includes the Zipios library definitions.
Definition: backbuffer.cpp:35
zipios::FileEntry::getCompressedSize
virtual size_t getCompressedSize() const
Retrieve the size of the file when compressed.
Definition: fileentry.cpp:163
zipios::FileEntry::m_crc_32
uint32_t m_crc_32
Definition: fileentry.hpp:139