OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "third_party/zlib/google/zip.h" | 5 #include "third_party/zlib/google/zip.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/files/file_enumerator.h" | 9 #include "base/files/file_enumerator.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 } | 50 } |
51 | 51 |
52 bool AddEntryToZip(zipFile zip_file, const base::FilePath& path, | 52 bool AddEntryToZip(zipFile zip_file, const base::FilePath& path, |
53 const base::FilePath& root_path) { | 53 const base::FilePath& root_path) { |
54 std::string str_path = | 54 std::string str_path = |
55 path.AsUTF8Unsafe().substr(root_path.AsUTF8Unsafe().length() + 1); | 55 path.AsUTF8Unsafe().substr(root_path.AsUTF8Unsafe().length() + 1); |
56 #if defined(OS_WIN) | 56 #if defined(OS_WIN) |
57 ReplaceSubstringsAfterOffset(&str_path, 0u, "\\", "/"); | 57 ReplaceSubstringsAfterOffset(&str_path, 0u, "\\", "/"); |
58 #endif | 58 #endif |
59 | 59 |
60 bool is_directory = file_util::DirectoryExists(path); | 60 bool is_directory = base::DirectoryExists(path); |
61 if (is_directory) | 61 if (is_directory) |
62 str_path += "/"; | 62 str_path += "/"; |
63 | 63 |
64 if (ZIP_OK != zipOpenNewFileInZip( | 64 if (ZIP_OK != zipOpenNewFileInZip( |
65 zip_file, str_path.c_str(), | 65 zip_file, str_path.c_str(), |
66 NULL, NULL, 0u, NULL, 0u, NULL, // file info, extrafield local, length, | 66 NULL, NULL, 0u, NULL, 0u, NULL, // file info, extrafield local, length, |
67 // extrafield global, length, comment | 67 // extrafield global, length, comment |
68 Z_DEFLATED, Z_DEFAULT_COMPRESSION)) { | 68 Z_DEFLATED, Z_DEFAULT_COMPRESSION)) { |
69 DLOG(ERROR) << "Could not open zip file entry " << str_path; | 69 DLOG(ERROR) << "Could not open zip file entry " << str_path; |
70 return false; | 70 return false; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 DLOG(WARNING) << "Failed to advance to the next file"; | 120 DLOG(WARNING) << "Failed to advance to the next file"; |
121 return false; | 121 return false; |
122 } | 122 } |
123 } | 123 } |
124 return true; | 124 return true; |
125 } | 125 } |
126 | 126 |
127 bool ZipWithFilterCallback(const base::FilePath& src_dir, | 127 bool ZipWithFilterCallback(const base::FilePath& src_dir, |
128 const base::FilePath& dest_file, | 128 const base::FilePath& dest_file, |
129 const FilterCallback& filter_cb) { | 129 const FilterCallback& filter_cb) { |
130 DCHECK(file_util::DirectoryExists(src_dir)); | 130 DCHECK(base::DirectoryExists(src_dir)); |
131 | 131 |
132 zipFile zip_file = internal::OpenForZipping(dest_file.AsUTF8Unsafe(), | 132 zipFile zip_file = internal::OpenForZipping(dest_file.AsUTF8Unsafe(), |
133 APPEND_STATUS_CREATE); | 133 APPEND_STATUS_CREATE); |
134 | 134 |
135 if (!zip_file) { | 135 if (!zip_file) { |
136 DLOG(WARNING) << "couldn't create file " << dest_file.value(); | 136 DLOG(WARNING) << "couldn't create file " << dest_file.value(); |
137 return false; | 137 return false; |
138 } | 138 } |
139 | 139 |
140 bool success = true; | 140 bool success = true; |
(...skipping 27 matching lines...) Expand all Loading... |
168 } else { | 168 } else { |
169 return ZipWithFilterCallback( | 169 return ZipWithFilterCallback( |
170 src_dir, dest_file, base::Bind(&ExcludeHiddenFilesFilter)); | 170 src_dir, dest_file, base::Bind(&ExcludeHiddenFilesFilter)); |
171 } | 171 } |
172 } | 172 } |
173 | 173 |
174 #if defined(OS_POSIX) | 174 #if defined(OS_POSIX) |
175 bool ZipFiles(const base::FilePath& src_dir, | 175 bool ZipFiles(const base::FilePath& src_dir, |
176 const std::vector<base::FilePath>& src_relative_paths, | 176 const std::vector<base::FilePath>& src_relative_paths, |
177 int dest_fd) { | 177 int dest_fd) { |
178 DCHECK(file_util::DirectoryExists(src_dir)); | 178 DCHECK(base::DirectoryExists(src_dir)); |
179 zipFile zip_file = internal::OpenFdForZipping(dest_fd, APPEND_STATUS_CREATE); | 179 zipFile zip_file = internal::OpenFdForZipping(dest_fd, APPEND_STATUS_CREATE); |
180 | 180 |
181 if (!zip_file) { | 181 if (!zip_file) { |
182 DLOG(ERROR) << "couldn't create file for fd " << dest_fd; | 182 DLOG(ERROR) << "couldn't create file for fd " << dest_fd; |
183 return false; | 183 return false; |
184 } | 184 } |
185 | 185 |
186 bool success = true; | 186 bool success = true; |
187 for (std::vector<base::FilePath>::const_iterator iter = | 187 for (std::vector<base::FilePath>::const_iterator iter = |
188 src_relative_paths.begin(); | 188 src_relative_paths.begin(); |
189 iter != src_relative_paths.end(); ++iter) { | 189 iter != src_relative_paths.end(); ++iter) { |
190 const base::FilePath& path = src_dir.Append(*iter); | 190 const base::FilePath& path = src_dir.Append(*iter); |
191 if (!AddEntryToZip(zip_file, path, src_dir)) { | 191 if (!AddEntryToZip(zip_file, path, src_dir)) { |
192 // TODO(hshi): clean up the partial zip file when error occurs. | 192 // TODO(hshi): clean up the partial zip file when error occurs. |
193 success = false; | 193 success = false; |
194 break; | 194 break; |
195 } | 195 } |
196 } | 196 } |
197 | 197 |
198 if (ZIP_OK != zipClose(zip_file, NULL)) { | 198 if (ZIP_OK != zipClose(zip_file, NULL)) { |
199 DLOG(ERROR) << "Error closing zip file for fd " << dest_fd; | 199 DLOG(ERROR) << "Error closing zip file for fd " << dest_fd; |
200 success = false; | 200 success = false; |
201 } | 201 } |
202 | 202 |
203 return success; | 203 return success; |
204 } | 204 } |
205 #endif // defined(OS_POSIX) | 205 #endif // defined(OS_POSIX) |
206 | 206 |
207 } // namespace zip | 207 } // namespace zip |
OLD | NEW |