Index: components/zip/zip_internal.cc |
diff --git a/components/zip/zip_internal.cc b/components/zip/zip_internal.cc |
deleted file mode 100644 |
index 56bca5e923aa4f670f78c40f305e017f670f4a4a..0000000000000000000000000000000000000000 |
--- a/components/zip/zip_internal.cc |
+++ /dev/null |
@@ -1,316 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/zip/zip.h" |
- |
-#include <algorithm> |
- |
-#include "base/logging.h" |
-#include "base/utf_string_conversions.h" |
- |
-#if defined(USE_SYSTEM_MINIZIP) |
-#include <minizip/ioapi.h> |
-#include <minizip/unzip.h> |
-#include <minizip/zip.h> |
-#else |
-#include "third_party/zlib/contrib/minizip/unzip.h" |
-#include "third_party/zlib/contrib/minizip/zip.h" |
-#if defined(OS_WIN) |
-#include "third_party/zlib/contrib/minizip/iowin32.h" |
-#elif defined(OS_POSIX) |
-#include "third_party/zlib/contrib/minizip/ioapi.h" |
-#endif // defined(OS_POSIX) |
-#endif // defined(USE_SYSTEM_MINIZIP) |
- |
-namespace { |
- |
-#if defined(OS_WIN) |
-typedef struct { |
- HANDLE hf; |
- int error; |
-} WIN32FILE_IOWIN; |
- |
-// This function is derived from third_party/minizip/iowin32.c. |
-// Its only difference is that it treats the char* as UTF8 and |
-// uses the Unicode version of CreateFile. |
-void* ZipOpenFunc(void *opaque, const char* filename, int mode) { |
- DWORD desired_access, creation_disposition; |
- DWORD share_mode, flags_and_attributes; |
- HANDLE file = 0; |
- void* ret = NULL; |
- |
- desired_access = share_mode = flags_and_attributes = 0; |
- |
- if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ) { |
- desired_access = GENERIC_READ; |
- creation_disposition = OPEN_EXISTING; |
- share_mode = FILE_SHARE_READ; |
- } else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) { |
- desired_access = GENERIC_WRITE | GENERIC_READ; |
- creation_disposition = OPEN_EXISTING; |
- } else if (mode & ZLIB_FILEFUNC_MODE_CREATE) { |
- desired_access = GENERIC_WRITE | GENERIC_READ; |
- creation_disposition = CREATE_ALWAYS; |
- } |
- |
- base::string16 filename16 = UTF8ToUTF16(filename); |
- if ((filename != NULL) && (desired_access != 0)) { |
- file = CreateFile(filename16.c_str(), desired_access, share_mode, |
- NULL, creation_disposition, flags_and_attributes, NULL); |
- } |
- |
- if (file == INVALID_HANDLE_VALUE) |
- file = NULL; |
- |
- if (file != NULL) { |
- WIN32FILE_IOWIN file_ret; |
- file_ret.hf = file; |
- file_ret.error = 0; |
- ret = malloc(sizeof(WIN32FILE_IOWIN)); |
- if (ret == NULL) |
- CloseHandle(file); |
- else |
- *(static_cast<WIN32FILE_IOWIN*>(ret)) = file_ret; |
- } |
- return ret; |
-} |
-#endif |
- |
-#if defined(OS_POSIX) |
-// Callback function for zlib that opens a file stream from a file descriptor. |
-void* FdOpenFileFunc(void* opaque, const char* filename, int mode) { |
- FILE* file = NULL; |
- const char* mode_fopen = NULL; |
- |
- if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ) |
- mode_fopen = "rb"; |
- else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) |
- mode_fopen = "r+b"; |
- else if (mode & ZLIB_FILEFUNC_MODE_CREATE) |
- mode_fopen = "wb"; |
- |
- if ((filename != NULL) && (mode_fopen != NULL)) |
- file = fdopen(*static_cast<int*>(opaque), mode_fopen); |
- |
- return file; |
-} |
- |
-// We don't actually close the file stream since that would close |
-// the underlying file descriptor, and we don't own it. However we do need to |
-// flush buffers and free |opaque| since we malloc'ed it in FillFdOpenFileFunc. |
-int CloseFileFunc(void* opaque, void* stream) { |
- fflush(static_cast<FILE*>(stream)); |
- free(opaque); |
- return 0; |
-} |
- |
-// Fills |pzlib_filecunc_def| appropriately to handle the zip file |
-// referred to by |fd|. |
-void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) { |
- fill_fopen_filefunc(pzlib_filefunc_def); |
- pzlib_filefunc_def->zopen_file = FdOpenFileFunc; |
- pzlib_filefunc_def->zclose_file = CloseFileFunc; |
- int* ptr_fd = static_cast<int*>(malloc(sizeof(fd))); |
- *ptr_fd = fd; |
- pzlib_filefunc_def->opaque = ptr_fd; |
-} |
-#endif // defined(OS_POSIX) |
- |
-#if defined(OS_WIN) |
-// Callback function for zlib that opens a file stream from a Windows handle. |
-void* HandleOpenFileFunc(void* opaque, const char* filename, int mode) { |
- WIN32FILE_IOWIN file_ret; |
- file_ret.hf = static_cast<HANDLE>(opaque); |
- file_ret.error = 0; |
- if (file_ret.hf == INVALID_HANDLE_VALUE) |
- return NULL; |
- |
- void* ret = malloc(sizeof(WIN32FILE_IOWIN)); |
- if (ret != NULL) |
- *(static_cast<WIN32FILE_IOWIN*>(ret)) = file_ret; |
- return ret; |
-} |
-#endif |
- |
-// A struct that contains data required for zlib functions to extract files from |
-// a zip archive stored in memory directly. The following I/O API functions |
-// expect their opaque parameters refer to this struct. |
-struct ZipBuffer { |
- const char* data; // weak |
- size_t length; |
- size_t offset; |
-}; |
- |
-// Opens the specified file. When this function returns a non-NULL pointer, zlib |
-// uses this pointer as a stream parameter while compressing or uncompressing |
-// data. (Returning NULL represents an error.) This function initializes the |
-// given opaque parameter and returns it because this parameter stores all |
-// information needed for uncompressing data. (This function does not support |
-// writing compressed data and it returns NULL for this case.) |
-void* OpenZipBuffer(void* opaque, const char* /*filename*/, int mode) { |
- if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) != ZLIB_FILEFUNC_MODE_READ) { |
- NOTREACHED(); |
- return NULL; |
- } |
- ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque); |
- if (!buffer || !buffer->data || !buffer->length) |
- return NULL; |
- buffer->offset = 0; |
- return opaque; |
-} |
- |
-// Reads compressed data from the specified stream. This function copies data |
-// refered by the opaque parameter and returns the size actually copied. |
-uLong ReadZipBuffer(void* opaque, void* /*stream*/, void* buf, uLong size) { |
- ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque); |
- DCHECK_LE(buffer->offset, buffer->length); |
- size_t remaining_bytes = buffer->length - buffer->offset; |
- if (!buffer || !buffer->data || !remaining_bytes) |
- return 0; |
- size = std::min(size, static_cast<uLong>(remaining_bytes)); |
- memcpy(buf, &buffer->data[buffer->offset], size); |
- buffer->offset += size; |
- return size; |
-} |
- |
-// Writes compressed data to the stream. This function always returns zero |
-// because this implementation is only for reading compressed data. |
-uLong WriteZipBuffer(void* /*opaque*/, |
- void* /*stream*/, |
- const void* /*buf*/, |
- uLong /*size*/) { |
- NOTREACHED(); |
- return 0; |
-} |
- |
-// Returns the offset from the beginning of the data. |
-long GetOffsetOfZipBuffer(void* opaque, void* /*stream*/) { |
- ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque); |
- if (!buffer) |
- return -1; |
- return static_cast<long>(buffer->offset); |
-} |
- |
-// Moves the current offset to the specified position. |
-long SeekZipBuffer(void* opaque, void* /*stream*/, uLong offset, int origin) { |
- ZipBuffer* buffer = static_cast<ZipBuffer*>(opaque); |
- if (!buffer) |
- return -1; |
- if (origin == ZLIB_FILEFUNC_SEEK_CUR) { |
- buffer->offset = std::min(buffer->offset + static_cast<size_t>(offset), |
- buffer->length); |
- return 0; |
- } |
- if (origin == ZLIB_FILEFUNC_SEEK_END) { |
- buffer->offset = (buffer->length > offset) ? buffer->length - offset : 0; |
- return 0; |
- } |
- if (origin == ZLIB_FILEFUNC_SEEK_SET) { |
- buffer->offset = std::min(buffer->length, static_cast<size_t>(offset)); |
- return 0; |
- } |
- NOTREACHED(); |
- return -1; |
-} |
- |
-// Closes the input offset and deletes all resources used for compressing or |
-// uncompressing data. This function deletes the ZipBuffer object referred by |
-// the opaque parameter since zlib deletes the unzFile object and it does not |
-// use this object any longer. |
-int CloseZipBuffer(void* opaque, void* /*stream*/) { |
- if (opaque) |
- free(opaque); |
- return 0; |
-} |
- |
-// Returns the last error happened when reading or writing data. This function |
-// always returns zero, which means there are not any errors. |
-int GetErrorOfZipBuffer(void* /*opaque*/, void* /*stream*/) { |
- return 0; |
-} |
- |
-} // namespace |
- |
-namespace zip { |
-namespace internal { |
- |
-unzFile OpenForUnzipping(const std::string& file_name_utf8) { |
- zlib_filefunc_def* zip_func_ptrs = NULL; |
-#if defined(OS_WIN) |
- zlib_filefunc_def zip_funcs; |
- fill_win32_filefunc(&zip_funcs); |
- zip_funcs.zopen_file = ZipOpenFunc; |
- zip_func_ptrs = &zip_funcs; |
-#endif |
- return unzOpen2(file_name_utf8.c_str(), zip_func_ptrs); |
-} |
- |
-#if defined(OS_POSIX) |
-unzFile OpenFdForUnzipping(int zip_fd) { |
- zlib_filefunc_def zip_funcs; |
- FillFdOpenFileFunc(&zip_funcs, zip_fd); |
- // Passing dummy "fd" filename to zlib. |
- return unzOpen2("fd", &zip_funcs); |
-} |
-#endif |
- |
-#if defined(OS_WIN) |
-unzFile OpenHandleForUnzipping(HANDLE zip_handle) { |
- zlib_filefunc_def zip_funcs; |
- fill_win32_filefunc(&zip_funcs); |
- zip_funcs.zopen_file = HandleOpenFileFunc; |
- zip_funcs.opaque = zip_handle; |
- return unzOpen2("fd", &zip_funcs); |
-} |
-#endif |
- |
-// static |
-unzFile PreprareMemoryForUnzipping(const std::string& data) { |
- if (data.empty()) |
- return NULL; |
- |
- ZipBuffer* buffer = static_cast<ZipBuffer*>(malloc(sizeof(ZipBuffer))); |
- if (!buffer) |
- return NULL; |
- buffer->data = data.data(); |
- buffer->length = data.length(); |
- buffer->offset = 0; |
- |
- zlib_filefunc_def zip_functions; |
- zip_functions.zopen_file = OpenZipBuffer; |
- zip_functions.zread_file = ReadZipBuffer; |
- zip_functions.zwrite_file = WriteZipBuffer; |
- zip_functions.ztell_file = GetOffsetOfZipBuffer; |
- zip_functions.zseek_file = SeekZipBuffer; |
- zip_functions.zclose_file = CloseZipBuffer; |
- zip_functions.zerror_file = GetErrorOfZipBuffer; |
- zip_functions.opaque = static_cast<void*>(buffer); |
- return unzOpen2(NULL, &zip_functions); |
-} |
- |
-zipFile OpenForZipping(const std::string& file_name_utf8, int append_flag) { |
- zlib_filefunc_def* zip_func_ptrs = NULL; |
-#if defined(OS_WIN) |
- zlib_filefunc_def zip_funcs; |
- fill_win32_filefunc(&zip_funcs); |
- zip_funcs.zopen_file = ZipOpenFunc; |
- zip_func_ptrs = &zip_funcs; |
-#endif |
- return zipOpen2(file_name_utf8.c_str(), |
- append_flag, |
- NULL, // global comment |
- zip_func_ptrs); |
-} |
- |
-#if defined(OS_POSIX) |
-zipFile OpenFdForZipping(int zip_fd, int append_flag) { |
- zlib_filefunc_def zip_funcs; |
- FillFdOpenFileFunc(&zip_funcs, zip_fd); |
- // Passing dummy "fd" filename to zlib. |
- return zipOpen2("fd", append_flag, NULL, &zip_funcs); |
-} |
-#endif |
- |
-} // namespace internal |
-} // namespace zip |