1 //
2 // ZipArchive.h
3 //
4 // Library: Zip
5 // Package: Zip
6 // Module:  ZipArchive
7 //
8 // Definition of the ZipArchive class.
9 //
10 // Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
11 // and Contributors.
12 //
13 // SPDX-License-Identifier:	BSL-1.0
14 //
15 
16 
17 #ifndef Zip_ZipArchive_INCLUDED
18 #define Zip_ZipArchive_INCLUDED
19 
20 
21 #include "Poco/Zip/Zip.h"
22 #include "Poco/Zip/ZipLocalFileHeader.h"
23 #include "Poco/Zip/ZipFileInfo.h"
24 #include "Poco/Zip/ZipArchiveInfo.h"
25 #include <istream>
26 #include <map>
27 
28 
29 namespace Poco {
30 namespace Zip {
31 
32 
33 class ParseCallback;
34 class Compress;
35 
36 
37 class Zip_API ZipArchive
38 	/// A ZipArchive contains information on the content of a zip file
39 {
40 public:
41 	using FileHeaders = std::map<std::string, ZipLocalFileHeader>;
42 	using FileInfos = std::map<std::string, ZipFileInfo>;
43 	using DirectoryInfos = std::map<Poco::UInt16, ZipArchiveInfo>;
44 	using DirectoryInfos64 = std::map<Poco::UInt32, ZipArchiveInfo64>;
45 
46 	ZipArchive(std::istream& in);
47 		/// Creates the ZipArchive from a file. Note that the in stream will be in state failed after the constructor is finished
48 
49 	ZipArchive(std::istream& in, ParseCallback& callback);
50 		/// Creates the ZipArchive from a file or network stream. Note that the in stream will be in state failed after the constructor is finished
51 
52 	~ZipArchive();
53 		/// Destroys the ZipArchive.
54 
55 	FileInfos::const_iterator fileInfoBegin() const;
56 
57 	FileInfos::const_iterator fileInfoEnd() const;
58 
59 	FileHeaders::const_iterator findHeader(const std::string& fileName) const;
60 
61 	FileHeaders::const_iterator headerBegin() const;
62 
63 	FileHeaders::const_iterator headerEnd() const;
64 
65 	const std::string& getZipComment() const;
66 
67 private:
68 	void parse(std::istream& in, ParseCallback& pc);
69 
70 	ZipArchive(const FileHeaders& entries, const FileInfos& infos, const DirectoryInfos& dirs, const DirectoryInfos64& dirs64 );
71 
72 private:
73 	FileHeaders    _entries;
74 		/// Info generated by parsing the data block of the zip file
75 	FileInfos      _infos;
76 		/// Info generated by parsing the directory block of the zip file
77 	DirectoryInfos _disks;
78 		/// Stores directory info for all found disks
79 	DirectoryInfos64 _disks64;
80 		/// Stores directory info for all found disks
81 
82 	static const std::string EMPTY_COMMENT;
83 
84 	friend class Compress;
85 };
86 
87 
fileInfoBegin()88 inline ZipArchive::FileInfos::const_iterator ZipArchive::fileInfoBegin() const
89 {
90 	return _infos.begin();
91 }
92 
93 
fileInfoEnd()94 inline ZipArchive::FileInfos::const_iterator ZipArchive::fileInfoEnd() const
95 {
96 	return _infos.end();
97 }
98 
99 
findHeader(const std::string & fileName)100 inline ZipArchive::FileHeaders::const_iterator ZipArchive::findHeader(const std::string& fileName) const
101 {
102 	return _entries.find(fileName);
103 }
104 
105 
headerBegin()106 inline ZipArchive::FileHeaders::const_iterator ZipArchive::headerBegin() const
107 {
108 	return _entries.begin();
109 }
110 
111 
headerEnd()112 inline ZipArchive::FileHeaders::const_iterator ZipArchive::headerEnd() const
113 {
114 	return _entries.end();
115 }
116 
117 
118 } } // namespace Poco::Zip
119 
120 
121 #endif // Zip_ZipArchive_INCLUDED
122