neoGFX
Cross-platform C++ app/game engine
Loading...
Searching...
No Matches
zip.hpp
Go to the documentation of this file.
1// zip.h
2/*
3 * Copyright (c) 2007 Leigh Johnston.
4 *
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * * Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * * Neither the name of Leigh Johnston nor the names of any
19 * other contributors to this software may be used to endorse or
20 * promote products derived from this software without specific prior
21 * written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
27 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*/
35
36#pragma once
37
38#include <neolib/neolib.hpp>
39#include <vector>
40#include <memory>
41
42namespace neolib
43{
44 class zip
45 {
46 public:
47 typedef std::vector<uint8_t> buffer_type;
48 public:
49 struct zip_file_too_big : std::runtime_error { zip_file_too_big() : std::runtime_error("neolib::zip::zip_file_too_big") {} };
50 struct file_not_found : std::runtime_error { file_not_found() : std::runtime_error("neolib::zip::file_not_found") {} };
51 public:
52 zip(const std::string& aZipFilePath);
53 zip(const buffer_type& aZipFile);
54 zip(buffer_type&& aZipFile);
55 zip(const void* aZipFileData, std::size_t aZipFileDataLength);
56 public:
57 size_t file_count() const { return iFiles.size(); }
58 std::size_t index_of(const std::string& aFile) const;
59 bool extract(size_t aIndex, const std::string& aTargetDirectory);
60 bool extract_to(size_t aIndex, buffer_type& aBuffer);
61 std::string extract_to_string(size_t aIndex);
62 const std::string& file_path(size_t aIndex) const;
63 bool ok() const { return !iError; }
64 private:
65 bool parse();
66 const uint8_t* data_front();
67 const uint8_t* data_back();
68 private:
69 buffer_type iZipFile;
70 const uint8_t* iZipFileData;
71 std::size_t iZipFileDataLength;
72 bool iError;
73 struct dir_header;
74 struct dir_file_header;
75 struct local_header;
76 typedef unsigned long dword;
77 typedef unsigned short word;
78 typedef unsigned char byte;
79 std::vector<const dir_file_header*> iDirEntries;
80 std::vector<std::string> iFiles;
81 };
82}
bool extract(size_t aIndex, const std::string &aTargetDirectory)
const std::string & file_path(size_t aIndex) const
bool extract_to(size_t aIndex, buffer_type &aBuffer)
std::vector< uint8_t > buffer_type
Definition zip.hpp:47
std::size_t index_of(const std::string &aFile) const
size_t file_count() const
Definition zip.hpp:57
zip(const void *aZipFileData, std::size_t aZipFileDataLength)
bool ok() const
Definition zip.hpp:63
zip(const std::string &aZipFilePath)
zip(buffer_type &&aZipFile)
zip(const buffer_type &aZipFile)
std::string extract_to_string(size_t aIndex)