1 
2 //
3 // This source file is part of appleseed.
4 // Visit https://appleseedhq.net/ for additional information and resources.
5 //
6 // This software is released under the MIT license.
7 //
8 // Copyright (c) 2017-2018 Gleb Mishchenko, The appleseedhq Organization
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining a copy
11 // of this software and associated documentation files (the "Software"), to deal
12 // in the Software without restriction, including without limitation the rights
13 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 // copies of the Software, and to permit persons to whom the Software is
15 // furnished to do so, subject to the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be included in
18 // all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 // THE SOFTWARE.
27 //
28 
29 #pragma once
30 
31 // appleseed.foundation headers.
32 #include "foundation/core/exceptions/exception.h"
33 
34 // Boost headers.
35 #include "boost/filesystem/path.hpp"
36 
37 // Standard headers.
38 #include <set>
39 #include <string>
40 #include <vector>
41 
42 namespace foundation
43 {
44 
45 //
46 // Exception class used for all zip related exceptions.
47 //
48 
49 class ZipException
50   : public foundation::Exception
51 {
52   public:
53     ZipException(const char* what);
54     ZipException(const char* what, const int err);
55 };
56 
57 //
58 // Extracts zip file zipFilename to unzipped_dir directory.
59 //
60 // Throws ZipException in case of exception.
61 // If exception is thrown, unzipped folder is deleted.
62 //
63 
64 void unzip(const std::string& zip_filename, const std::string& unzipped_dir);
65 
66 //
67 // Archives directory_to_zip to zip_filename zip file.
68 //
69 // Throws ZipException in case of exception.
70 // If exception is thrown, zip archive is deleted.
71 //
72 
73 void zip(const std::string& zip_filename, const std::string& directory_to_zip);
74 
75 //
76 // Checks if file is in zip format by trying to open it.
77 //
78 
79 bool is_zip_file(const char* filename);
80 
81 //
82 // Returns all filenames from zip_filenames zip with given extension.
83 //
84 // Throws ZipException if zip_filename can't be opened or is not a zip file.
85 //
86 
87 std::vector<std::string> get_filenames_with_extension_from_zip(
88     const std::string& zip_filename,
89     const std::string& extension);
90 
91 //
92 // Retrieves all files inside a given directory and its subdirectories.
93 //
94 
95 std::set<std::string> recursive_ls(const boost::filesystem::path& dir);
96 
97 }   // namespace foundation
98