diff --git a/Makefile b/Makefile index cd7d14e..8abbfdc 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ BUILD := build SOURCES := source DATA := data INCLUDES := include -ROMFS := RomFs +#ROMFS := RomFS #--------------------------------------------------------------------------------- # options for code generation @@ -53,16 +53,13 @@ CFLAGS := -g -Wall -O2 -ffunction-sections \ $(ARCH) $(DEFINES) CFLAGS += -D__SWITCH__ $(INCLUDE) `sdl2-config --cflags` -LFLAGS=`sdl2-config --libs` -lSDL2_ttf CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions ASFLAGS := -g $(ARCH) LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -#LIBS := `sdl2-config --libs` -#LIBS := -lSDL2_mixer -lmodplug -lmpg123 -lvorbisidec -logg -lSDL2_ttf -lSDL2_gfx -lSDL2_image \ -# -lpng -ljpeg `sdl2-config --libs` -lnx -lmupdf -lmupdf-third +#LIBS := `sdl2-config --libs` -lSDL2_ttf -lSDL2_image -lmupdf -lmupdf-third LIBS := `aarch64-none-elf-pkg-config --libs sdl2` -lSDL2_ttf -lSDL2_image -lmupdf -lmupdf-third #--------------------------------------------------------------------------------- diff --git a/RomFs/arial.ttf b/RomFs/arial.ttf deleted file mode 100644 index 8682d94..0000000 Binary files a/RomFs/arial.ttf and /dev/null differ diff --git a/include/BLUnZip.h b/include/BLUnZip.h deleted file mode 100644 index 25bf960..0000000 --- a/include/BLUnZip.h +++ /dev/null @@ -1,86 +0,0 @@ -/* BLUnZip - * C++ class for doing basic zip extraction to strings - * Scott Lawrence yorgle@gmail.com - * - * This code is HEAVILY based on the "minizip" code included with zlib - * also available here: http://www.winimage.com/zLibDll/minizip.html - * - * v1.0 2013-June-05 - Initial release - */ - -/* This code is provided under an MIT license: - -The MIT License (MIT) - -Copyright (c) 2013 Scott Lawrence - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ - - -#include -#include - -extern "C" -{ -#include "minizip/zip.h" -} - -class BLUnZip -{ -private: - std::string filename; - bool valid; - zipFile zf; - -public: - BLUnZip( std::string filename ); - ~BLUnZip( void ); - -public: - bool isValid( void ) { return valid; } - -public: - zipFile Open( std::string zipfilename ); - void Close( void ); - -/* -public: - void Add( std::string contentPath, std::string zipPath, int flags ); -*/ - -public: - void List( void ); - - - int ItemCount( void ); - - int IndexOfItem( std::string itemName ); - - void ListOfItems( std::vector& listing ); - std::string NameOfItem( int idx ); - long SizeOfItem( int idx ); - int ExtractToRAM( int idx, char * buf, long bufsz, std::string pw="" ); - std::string ExtractToString( int idx, std::string password="" ); - -public: - long SizeOfItem( std::string itemName ) { return this->SizeOfItem( this->IndexOfItem( itemName)); } - std::string ExtractToString( std::string itemName, std::string password="" ) { return this->ExtractToString( this->IndexOfItem( itemName), password); } -}; diff --git a/include/BLZip.h b/include/BLZip.h deleted file mode 100644 index 893f398..0000000 --- a/include/BLZip.h +++ /dev/null @@ -1,73 +0,0 @@ -/* BLZip - * C++ class for doing basic zip compression - * Scott Lawrence yorgle@gmail.com - * - * This code is HEAVILY based on the "minizip" code included with zlib - * also available here: http://www.winimage.com/zLibDll/minizip.html - * - * v1.0 2013-June-05 - Initial release - */ - -/* This code is provided under an MIT license: - -The MIT License (MIT) - -Copyright (c) 2013 Scott Lawrence - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ - - -#include - -extern "C" -{ -#include "minizip/zip.h" -#include "minizip/unzip.h" -} - -#define ZipFlag_Overwrite 0x01 /* -o */ -#define ZipFlag_Append 0x02 /* -a */ -#define ZipFlag_Store 0x04 /* -0 */ -#define ZipFlag_Faster 0x08 /* -1 */ -#define ZipFlag_Better 0x10 /* -9 */ -#define ZipFlag_NoPaths 0x20 /* -j */ - - -class BLZip -{ -private: - std::string filename; - bool valid; - zipFile zf; - -public: - BLZip( std::string filename ); - ~BLZip( void ); - -public: - zipFile Open( std::string zipfilename ); - void Close( void ); - -public: - int Add( std::string contentPath, - std::string zipPath="", - int flags = ZipFlag_Better ); -}; diff --git a/include/SDL_helper.h b/include/SDL_helper.h index 19ec46f..0910583 100644 --- a/include/SDL_helper.h +++ b/include/SDL_helper.h @@ -1,5 +1,5 @@ -#ifndef NX_SHELL_SDL_HELPER_H -#define NX_SHELL_SDL_HELPER_H +#ifndef EBOOK_READER_SDL_HELPER_H +#define EBOOK_READER_SDL_HELPER_H #include #include @@ -29,8 +29,8 @@ static inline SDL_Color SDL_MakeColour(Uint8 r, Uint8 g, Uint8 b, Uint8 a) void SDL_ClearScreen(SDL_Renderer *renderer, SDL_Color colour); void SDL_DrawRect(SDL_Renderer *renderer, int x, int y, int w, int h, SDL_Color colour); void SDL_DrawCircle(SDL_Renderer *renderer, int x, int y, int r, SDL_Color colour); -void SDL_DrawText(TTF_Font *font, int x, int y, SDL_Color colour, const char *text); -void SDL_DrawTextf(TTF_Font *font, int x, int y, SDL_Color colour, const char* text, ...); +void SDL_DrawText(SDL_Surface* window_surface, TTF_Font *font, int x, int y, SDL_Color colour, const char *text); +void SDL_DrawTextf(SDL_Surface* window_surface, TTF_Font *font, int x, int y, SDL_Color colour, const char* text, ...); void SDL_LoadImage(SDL_Renderer *renderer, SDL_Texture **texture, char *path); void SDL_LoadImageBuf(SDL_Renderer *renderer, SDL_Texture **texture, void *mem, int size); void SDL_DrawImage(SDL_Renderer *renderer, SDL_Texture *texture, int x, int y, int w, int h); diff --git a/include/common.h b/include/common.h deleted file mode 100644 index 4af7d61..0000000 --- a/include/common.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef NX_SHELL_COMMON_H -#define NX_SHELL_COMMON_H - -#include -#include -#include -#include -#include -#include - -#define wait(msec) svcSleepThread(10000000 * (s64)msec) - -jmp_buf exitJmp; - -SDL_Window *WINDOW; -SDL_Surface *WINDOW_SURFACE; -SDL_Renderer *RENDERER; -TTF_Font *Roboto_large, *Roboto, *Roboto_small, *Roboto_OSK; - -#define ROOT_PATH "/" -#define START_PATH ROOT_PATH -#define MAX_FILES 1024 -#define FILES_PER_PAGE 8 - -int MENU_DEFAULT_STATE; -int BROWSE_STATE; - -#define MENU_STATE_HOME 0 -#define MENU_STATE_OPTIONS 1 -#define MENU_STATE_MENUBAR 2 -#define MENU_STATE_SETTINGS 3 -#define MENU_STATE_FTP 4 -#define MENU_STATE_SORT 5 -#define MENU_STATE_THEMES 6 -#define MENU_STATE_DIALOG 7 -#define MENU_STATE_PROPERTIES 8 - -#define STATE_SD 0 -#define STATE_NAND 1 - -char cwd[512]; -char fileName[255]; - -#endif \ No newline at end of file diff --git a/include/fs.h b/include/fs.h deleted file mode 100644 index 0ac788a..0000000 --- a/include/fs.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef NX_SHELL_FS_H -#define NX_SHELL_FS_H - -#include - -FsFileSystem fs; - -int FS_MakeDir(const char *path); -int FS_RecursiveMakeDir(const char * dir); -bool FS_FileExists(const char *path); -bool FS_DirExists(const char *path); -const char *FS_GetFileExt(const char *filename); -char *FS_GetFileModifiedTime(const char *filename); -Result FS_GetFileSize(const char *path, u64 *size); - -#endif \ No newline at end of file diff --git a/include/menu_book_reader.h b/include/menu_book_reader.h index fb402c4..8b5c3a5 100644 --- a/include/menu_book_reader.h +++ b/include/menu_book_reader.h @@ -1,5 +1,5 @@ -#ifndef NX_SHELL_MENU_BOOK_READER_H -#define NX_SHELL_MENU_BOOK_READER_H +#ifndef EBOOK_READER_MENU_BOOK_READER_H +#define EBOOK_READER_MENU_BOOK_READER_H #include diff --git a/include/minizip/LICENSE.txt b/include/minizip/LICENSE.txt deleted file mode 100644 index 086295a..0000000 --- a/include/minizip/LICENSE.txt +++ /dev/null @@ -1,17 +0,0 @@ -Condition of use and distribution are the same as zlib: - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgement in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. \ No newline at end of file diff --git a/include/minizip/crypt.h b/include/minizip/crypt.h deleted file mode 100644 index d1d155c..0000000 --- a/include/minizip/crypt.h +++ /dev/null @@ -1,137 +0,0 @@ -/* crypt.h -- base code for traditional PKWARE encryption - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - Modifications for Info-ZIP crypting - Copyright (C) 2003 Terry Thorsen - - This code is a modified version of crypting code in Info-ZIP distribution - - Copyright (C) 1990-2000 Info-ZIP. All rights reserved. - - See the Info-ZIP LICENSE file version 2000-Apr-09 or later for terms of use - which also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html - - The encryption/decryption parts of this source code (as opposed to the - non-echoing password parts) were originally written in Europe. The - whole source package can be freely distributed, including from the USA. - (Prior to January 2000, re-export from the US was a violation of US law.) - - This encryption code is a direct transcription of the algorithm from - Roger Schlafly, described by Phil Katz in the file appnote.txt. This - file (appnote.txt) is distributed with the PKZIP program (even in the - version without encryption capabilities). - - If you don't need crypting in your application, just define symbols - NOCRYPT and NOUNCRYPT. - - Mar 8th, 2016 - Lucio Cosmo - Fixed support for 64bit builds for archives with "PKWARE" password. - Changed long, unsigned long, unsigned to unsigned int in - access functions to crctables and pkeys - -*/ - -#define CRC32(c, b) ((*(pcrc_32_tab+(((unsigned int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) - -/*********************************************************************** - * Return the next byte in the pseudo-random sequence - */ -static int decrypt_byte(unsigned int* pkeys) -{ - unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an - * unpredictable manner on 16-bit systems; not a problem - * with any known compiler so far, though */ - - temp = ((unsigned int)(*(pkeys+2)) & 0xffff) | 2; - return (unsigned int)(((temp * (temp ^ 1)) >> 8) & 0xff); -} - -/*********************************************************************** - * Update the encryption keys with the next byte of plain text - */ -static int update_keys(unsigned int* pkeys,const unsigned int* pcrc_32_tab,int c) -{ - (*(pkeys+0)) = CRC32((*(pkeys+0)), c); - (*(pkeys+1)) += (*(pkeys+0)) & 0xff; - (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; - { - register int keyshift = (int)((*(pkeys+1)) >> 24); - (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); - } - return c; -} - - -/*********************************************************************** - * Initialize the encryption keys and the random header according to - * the given password. - */ -static void init_keys(const char* passwd,unsigned int* pkeys,const unsigned int* pcrc_32_tab) -{ - *(pkeys+0) = 305419896L; - *(pkeys+1) = 591751049L; - *(pkeys+2) = 878082192L; - while (*passwd != 0) - { - update_keys(pkeys,pcrc_32_tab,(int)*passwd); - passwd++; - } -} - -#define zdecode(pkeys,pcrc_32_tab,c) \ - (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys))) - -#define zencode(pkeys,pcrc_32_tab,c,t) \ - (t=decrypt_byte(pkeys), update_keys(pkeys,pcrc_32_tab,c), t^(c)) - -#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED - -#define RAND_HEAD_LEN 12 - /* "last resort" source for second part of crypt seed pattern */ -# ifndef ZCR_SEED2 -# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ -# endif - -static int crypthead(const char* passwd, /* password string */ - unsigned char* buf, /* where to write header */ - int bufSize, - unsigned int* pkeys, - const unsigned int* pcrc_32_tab, - unsigned int crcForCrypting) -{ - int n; /* index in random header */ - int t; /* temporary */ - int c; /* random byte */ - unsigned char header[RAND_HEAD_LEN-2]; /* random header */ - static unsigned calls = 0; /* ensure different random header each time */ - - if (bufSize < RAND_HEAD_LEN) - return 0; - - /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the - * output of rand() to get less predictability, since rand() is - * often poorly implemented. - */ - if (++calls == 1) - { - srand((unsigned)(time(NULL) ^ ZCR_SEED2)); - } - init_keys(passwd, pkeys, pcrc_32_tab); - for (n = 0; n < RAND_HEAD_LEN-2; n++) - { - c = (rand() >> 7) & 0xff; - header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); - } - /* Encrypt random header (last two bytes is high word of crc) */ - init_keys(passwd, pkeys, pcrc_32_tab); - for (n = 0; n < RAND_HEAD_LEN-2; n++) - { - buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); - } - buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); - buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); - return n; -} - -#endif diff --git a/include/minizip/ioapi.c b/include/minizip/ioapi.c deleted file mode 100644 index 485215d..0000000 --- a/include/minizip/ioapi.c +++ /dev/null @@ -1,380 +0,0 @@ -/* ioapi.h -- IO base function header for compress/uncompress .zip - part of the MiniZip project - - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - Modifications for Zip64 support - Copyright (C) 2009-2010 Mathias Svensson - http://result42.com - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -//taken and adapted from https://stackoverflow.com/a/13492589 - -// save diagnostic state -#pragma GCC diagnostic push - -// turn off the specific warning. Can also use "-Wall" -#pragma GCC diagnostic ignored "-Wunused-parameter" - -#include -#include - -#include "ioapi.h" - -#if defined(_WIN32) -# define snprintf _snprintf -#endif - -#ifdef __APPLE__ -/* In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions */ -# define FOPEN_FUNC(filename, mode) fopen(filename, mode) -# define FTELLO_FUNC(stream) ftello(stream) -# define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) -#else -# define FOPEN_FUNC(filename, mode) fopen64(filename, mode) -# define FTELLO_FUNC(stream) ftello64(stream) -# define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) -#endif - -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ -#ifndef SEEK_CUR -# define SEEK_CUR 1 -#endif -#ifndef SEEK_END -# define SEEK_END 2 -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 -#endif - -voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) -{ - if (pfilefunc->zfile_func64.zopen64_file != NULL) - return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); - return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); -} - -voidpf call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode)) -{ - if (pfilefunc->zfile_func64.zopendisk64_file != NULL) - return (*(pfilefunc->zfile_func64.zopendisk64_file)) (pfilefunc->zfile_func64.opaque,filestream,number_disk,mode); - return (*(pfilefunc->zopendisk32_file))(pfilefunc->zfile_func64.opaque,filestream,number_disk,mode); -} - -long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) -{ - uLong offsetTruncated; - if (pfilefunc->zfile_func64.zseek64_file != NULL) - return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); - offsetTruncated = (uLong)offset; - if (offsetTruncated != offset) - return -1; - return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); -} - -ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) -{ - uLong tell_uLong; - if (pfilefunc->zfile_func64.zseek64_file != NULL) - return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); - tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); - if ((tell_uLong) == 0xffffffff) - return (ZPOS64_T)-1; - return tell_uLong; -} - -void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) -{ - p_filefunc64_32->zfile_func64.zopen64_file = NULL; - p_filefunc64_32->zfile_func64.zopendisk64_file = NULL; - p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; - p_filefunc64_32->zopendisk32_file = p_filefunc32->zopendisk_file; - p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; - p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; - p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; - p_filefunc64_32->zfile_func64.ztell64_file = NULL; - p_filefunc64_32->zfile_func64.zseek64_file = NULL; - p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; - p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; - p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; - p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; - p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; -} - -static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); -static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); -static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); -static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); -static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); -static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); - -typedef struct -{ - FILE *file; - int filenameLength; - void *filename; -} FILE_IOPOSIX; - -static voidpf file_build_ioposix(FILE *file, const char *filename) -{ - FILE_IOPOSIX *ioposix = NULL; - if (file == NULL) - return NULL; - ioposix = (FILE_IOPOSIX*)malloc(sizeof(FILE_IOPOSIX)); - ioposix->file = file; - ioposix->filenameLength = strlen(filename) + 1; - ioposix->filename = (char*)malloc(ioposix->filenameLength * sizeof(char)); - strncpy(ioposix->filename, filename, ioposix->filenameLength); - return (voidpf)ioposix; -} - -static voidpf ZCALLBACK fopen_file_func (voidpf 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 = fopen(filename, mode_fopen); - return file_build_ioposix(file, filename); - } - return file; -} - -static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* 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 = FOPEN_FUNC((const char*)filename, mode_fopen); - return file_build_ioposix(file, (const char*)filename); - } - return file; -} - -static voidpf ZCALLBACK fopendisk64_file_func (voidpf opaque, voidpf stream, int number_disk, int mode) -{ - FILE_IOPOSIX *ioposix = NULL; - char *diskFilename = NULL; - voidpf ret = NULL; - int i = 0; - - if (stream == NULL) - return NULL; - ioposix = (FILE_IOPOSIX*)stream; - diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char)); - strncpy(diskFilename, ioposix->filename, ioposix->filenameLength); - for (i = ioposix->filenameLength - 1; i >= 0; i -= 1) - { - if (diskFilename[i] != '.') - continue; - snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02d", number_disk + 1); - break; - } - if (i >= 0) - ret = fopen64_file_func(opaque, diskFilename, mode); - free(diskFilename); - return ret; -} - -static voidpf ZCALLBACK fopendisk_file_func (voidpf opaque, voidpf stream, int number_disk, int mode) -{ - FILE_IOPOSIX *ioposix = NULL; - char *diskFilename = NULL; - voidpf ret = NULL; - int i = 0; - - if (stream == NULL) - return NULL; - ioposix = (FILE_IOPOSIX*)stream; - diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char)); - strncpy(diskFilename, ioposix->filename, ioposix->filenameLength); - for (i = ioposix->filenameLength - 1; i >= 0; i -= 1) - { - if (diskFilename[i] != '.') - continue; - snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02d", number_disk + 1); - break; - } - if (i >= 0) - ret = fopen_file_func(opaque, diskFilename, mode); - free(diskFilename); - return ret; -} - -static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) -{ - FILE_IOPOSIX *ioposix = NULL; - uLong ret; - if (stream == NULL) - return -1; - ioposix = (FILE_IOPOSIX*)stream; - ret = (uLong)fread(buf, 1, (size_t)size, ioposix->file); - return ret; -} - -static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) -{ - FILE_IOPOSIX *ioposix = NULL; - uLong ret; - if (stream == NULL) - return -1; - ioposix = (FILE_IOPOSIX*)stream; - ret = (uLong)fwrite(buf, 1, (size_t)size, ioposix->file); - return ret; -} - -static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) -{ - FILE_IOPOSIX *ioposix = NULL; - long ret = -1; - if (stream == NULL) - return ret; - ioposix = (FILE_IOPOSIX*)stream; - ret = ftell(ioposix->file); - return ret; -} - -static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) -{ - FILE_IOPOSIX *ioposix = NULL; - ZPOS64_T ret = -1; - if (stream == NULL) - return ret; - ioposix = (FILE_IOPOSIX*)stream; - ret = FTELLO_FUNC(ioposix->file); - return ret; -} - -static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) -{ - FILE_IOPOSIX *ioposix = NULL; - int fseek_origin = 0; - long ret = 0; - - if (stream == NULL) - return -1; - ioposix = (FILE_IOPOSIX*)stream; - - switch (origin) - { - case ZLIB_FILEFUNC_SEEK_CUR: - fseek_origin = SEEK_CUR; - break; - case ZLIB_FILEFUNC_SEEK_END: - fseek_origin = SEEK_END; - break; - case ZLIB_FILEFUNC_SEEK_SET: - fseek_origin = SEEK_SET; - break; - default: - return -1; - } - if (fseek(ioposix->file, offset, fseek_origin) != 0) - ret = -1; - return ret; -} - -static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) -{ - FILE_IOPOSIX *ioposix = NULL; - int fseek_origin = 0; - long ret = 0; - - if (stream == NULL) - return -1; - ioposix = (FILE_IOPOSIX*)stream; - - switch (origin) - { - case ZLIB_FILEFUNC_SEEK_CUR: - fseek_origin = SEEK_CUR; - break; - case ZLIB_FILEFUNC_SEEK_END: - fseek_origin = SEEK_END; - break; - case ZLIB_FILEFUNC_SEEK_SET: - fseek_origin = SEEK_SET; - break; - default: - return -1; - } - - if(FSEEKO_FUNC(ioposix->file, offset, fseek_origin) != 0) - ret = -1; - - return ret; -} - - -static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) -{ - FILE_IOPOSIX *ioposix = NULL; - int ret = -1; - if (stream == NULL) - return ret; - ioposix = (FILE_IOPOSIX*)stream; - if (ioposix->filename != NULL) - free(ioposix->filename); - ret = fclose(ioposix->file); - free(ioposix); - return ret; -} - -static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) -{ - FILE_IOPOSIX *ioposix = NULL; - int ret = -1; - if (stream == NULL) - return ret; - ioposix = (FILE_IOPOSIX*)stream; - ret = ferror(ioposix->file); - return ret; -} - -void fill_fopen_filefunc (zlib_filefunc_def* pzlib_filefunc_def) -{ - pzlib_filefunc_def->zopen_file = fopen_file_func; - pzlib_filefunc_def->zopendisk_file = fopendisk_file_func; - pzlib_filefunc_def->zread_file = fread_file_func; - pzlib_filefunc_def->zwrite_file = fwrite_file_func; - pzlib_filefunc_def->ztell_file = ftell_file_func; - pzlib_filefunc_def->zseek_file = fseek_file_func; - pzlib_filefunc_def->zclose_file = fclose_file_func; - pzlib_filefunc_def->zerror_file = ferror_file_func; - pzlib_filefunc_def->opaque = NULL; -} - -void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) -{ - pzlib_filefunc_def->zopen64_file = fopen64_file_func; - pzlib_filefunc_def->zopendisk64_file = fopendisk64_file_func; - pzlib_filefunc_def->zread_file = fread_file_func; - pzlib_filefunc_def->zwrite_file = fwrite_file_func; - pzlib_filefunc_def->ztell64_file = ftell64_file_func; - pzlib_filefunc_def->zseek64_file = fseek64_file_func; - pzlib_filefunc_def->zclose_file = fclose_file_func; - pzlib_filefunc_def->zerror_file = ferror_file_func; - pzlib_filefunc_def->opaque = NULL; -} - -// turn the warnings back on -#pragma GCC diagnostic pop diff --git a/include/minizip/ioapi.h b/include/minizip/ioapi.h deleted file mode 100644 index 9d73081..0000000 --- a/include/minizip/ioapi.h +++ /dev/null @@ -1,158 +0,0 @@ -/* ioapi.h -- IO base function header for compress/uncompress .zip - part of the MiniZip project - - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - Modifications for Zip64 support - Copyright (C) 2009-2010 Mathias Svensson - http://result42.com - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef _ZLIBIOAPI64_H -#define _ZLIBIOAPI64_H - -#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) -# ifndef __USE_FILE_OFFSET64 -# define __USE_FILE_OFFSET64 -# endif -# ifndef __USE_LARGEFILE64 -# define __USE_LARGEFILE64 -# endif -# ifndef _LARGEFILE64_SOURCE -# define _LARGEFILE64_SOURCE -# endif -# ifndef _FILE_OFFSET_BIT -# define _FILE_OFFSET_BIT 64 -# endif -#endif - -#include -#include -#include - - -#define fopen64 fopen -#define ftello64 ftell -#define fseeko64 fseek - -/* a type choosen by DEFINE */ -#ifdef HAVE_64BIT_INT_CUSTOM -typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; -#else -# ifdef HAVE_STDINT_H -# include "stdint.h" - typedef uint64_t ZPOS64_T; -# else -# if defined(_MSC_VER) || defined(__BORLANDC__) - typedef unsigned __int64 ZPOS64_T; -# else - typedef unsigned long long int ZPOS64_T; -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_FILEFUNC_SEEK_CUR (1) -#define ZLIB_FILEFUNC_SEEK_END (2) -#define ZLIB_FILEFUNC_SEEK_SET (0) - -#define ZLIB_FILEFUNC_MODE_READ (1) -#define ZLIB_FILEFUNC_MODE_WRITE (2) -#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) -#define ZLIB_FILEFUNC_MODE_EXISTING (4) -#define ZLIB_FILEFUNC_MODE_CREATE (8) - -#ifndef ZCALLBACK -# if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || \ - defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) -# define ZCALLBACK CALLBACK -# else -# define ZCALLBACK -# endif -#endif - -typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); -typedef voidpf (ZCALLBACK *opendisk_file_func) OF((voidpf opaque, voidpf stream, int number_disk, int mode)); -typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); -typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); -typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); - -typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); - -/* here is the "old" 32 bits structure structure */ -typedef struct zlib_filefunc_def_s -{ - open_file_func zopen_file; - opendisk_file_func zopendisk_file; - read_file_func zread_file; - write_file_func zwrite_file; - tell_file_func ztell_file; - seek_file_func zseek_file; - close_file_func zclose_file; - testerror_file_func zerror_file; - voidpf opaque; -} zlib_filefunc_def; - -typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); -typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); -typedef voidpf (ZCALLBACK *opendisk64_file_func)OF((voidpf opaque, voidpf stream, int number_disk, int mode)); - -typedef struct zlib_filefunc64_def_s -{ - open64_file_func zopen64_file; - opendisk64_file_func zopendisk64_file; - read_file_func zread_file; - write_file_func zwrite_file; - tell64_file_func ztell64_file; - seek64_file_func zseek64_file; - close_file_func zclose_file; - testerror_file_func zerror_file; - voidpf opaque; -} zlib_filefunc64_def; - -void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); -void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); - -/* now internal definition, only for zip.c and unzip.h */ -typedef struct zlib_filefunc64_32_def_s -{ - zlib_filefunc64_def zfile_func64; - open_file_func zopen32_file; - opendisk_file_func zopendisk32_file; - tell_file_func ztell32_file; - seek_file_func zseek32_file; -} zlib_filefunc64_32_def; - -#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) -#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) -/*#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))*/ -/*#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))*/ -#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) -#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) - -voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); -voidpf call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode)); -long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); -ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); - -void fill_zlib_filefunc64_32_def_from_filefunc32 OF((zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)); - -#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) -#define ZOPENDISK64(filefunc,filestream,diskn,mode) (call_zopendisk64((&(filefunc)),(filestream),(diskn),(mode))) -#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) -#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/minizip/ioapi_mem.c b/include/minizip/ioapi_mem.c deleted file mode 100644 index c6aecd5..0000000 --- a/include/minizip/ioapi_mem.c +++ /dev/null @@ -1,202 +0,0 @@ -/* ioapi_mem.h -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - This version of ioapi is designed to access memory rather than files. - We do use a region of memory to put data in to and take it out of. We do - not have auto-extending buffers and do not inform anyone else that the - data has been written. It is really intended for accessing a zip archive - embedded in an application such that I can write an installer with no - external files. Creation of archives has not been attempted, although - parts of the framework are present. - - Based on Unzip ioapi.c version 0.22, May 19th, 2003 - - Copyright (C) 1998-2003 Gilles Vollant - (C) 2003 Justin Fletcher - - This file is under the same license as the Unzip tool it is distributed - with. -*/ - -//taken and adapted from https://stackoverflow.com/a/13492589 - -// save diagnostic state -#pragma GCC diagnostic push - -// turn off the specific warning. Can also use "-Wall" -#pragma GCC diagnostic ignored "-Wunused-parameter" - -#include -#include -#include - -#include "zlib.h" -#include "ioapi.h" - -#include "ioapi_mem.h" - -#ifndef IOMEM_BUFFERSIZE -# define IOMEM_BUFFERSIZE (64 * 1024) -#endif - -voidpf ZCALLBACK fopen_mem_func (opaque, filename, mode) - voidpf opaque; - const char* filename; - int mode; -{ - ourmemory_t *mem = (ourmemory_t *)opaque; - if (mem == NULL) - return NULL; /* Mem structure passed in was null */ - - if (mode & ZLIB_FILEFUNC_MODE_CREATE) - { - if (mem->grow) - { - mem->size = IOMEM_BUFFERSIZE; - mem->base = (char *)malloc(mem->size); - } - - mem->limit = 0; /* When writing we start with 0 bytes written */ - } - else - mem->limit = mem->size; - - mem->cur_offset = 0; - - return mem; -} - -voidpf ZCALLBACK fopendisk_mem_func (opaque, stream, number_disk, mode) - voidpf opaque; - voidpf stream; - int number_disk; - int mode; -{ - /* Not used */ - return NULL; -} - -uLong ZCALLBACK fread_mem_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - void* buf; - uLong size; -{ - ourmemory_t *mem = (ourmemory_t *)stream; - - if (size > mem->size - mem->cur_offset) - size = mem->size - mem->cur_offset; - - memcpy(buf, mem->base + mem->cur_offset, size); - mem->cur_offset += size; - - return size; -} - - -uLong ZCALLBACK fwrite_mem_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - const void* buf; - uLong size; -{ - ourmemory_t *mem = (ourmemory_t *)stream; - char *newbase = NULL; - uLong newmemsize = 0; - - if (size > mem->size - mem->cur_offset) - { - if (mem->grow) - { - newmemsize = mem->size; - if (size < IOMEM_BUFFERSIZE) - newmemsize += IOMEM_BUFFERSIZE; - else - newmemsize += size; - newbase = (char *)malloc(newmemsize); - memcpy(newbase, mem->base, mem->size); - free(mem->base); - mem->base = newbase; - mem->size = newmemsize; - } - else - size = mem->size - mem->cur_offset; - } - memcpy(mem->base + mem->cur_offset, buf, size); - mem->cur_offset += size; - if (mem->cur_offset > mem->limit) - mem->limit = mem->cur_offset; - - return size; -} - -long ZCALLBACK ftell_mem_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - ourmemory_t *mem = (ourmemory_t *)stream; - return mem->cur_offset; -} - -long ZCALLBACK fseek_mem_func (opaque, stream, offset, origin) - voidpf opaque; - voidpf stream; - uLong offset; - int origin; -{ - ourmemory_t *mem = (ourmemory_t *)stream; - uLong new_pos; - switch (origin) - { - case ZLIB_FILEFUNC_SEEK_CUR: - new_pos = mem->cur_offset + offset; - break; - case ZLIB_FILEFUNC_SEEK_END: - new_pos = mem->limit + offset; - break; - case ZLIB_FILEFUNC_SEEK_SET: - new_pos = offset; - break; - default: - return -1; - } - - if (new_pos > mem->size) - return 1; /* Failed to seek that far */ - mem->cur_offset = new_pos; - return 0; -} - -int ZCALLBACK fclose_mem_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - /* Even with grow = 1, caller must always free() memory */ - return 0; -} - -int ZCALLBACK ferror_mem_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - /* We never return errors */ - return 0; -} - -void fill_memory_filefunc (pzlib_filefunc_def, ourmem) - zlib_filefunc_def* pzlib_filefunc_def; - ourmemory_t *ourmem; -{ - pzlib_filefunc_def->zopen_file = fopen_mem_func; - pzlib_filefunc_def->zopendisk_file = fopendisk_mem_func; - pzlib_filefunc_def->zread_file = fread_mem_func; - pzlib_filefunc_def->zwrite_file = fwrite_mem_func; - pzlib_filefunc_def->ztell_file = ftell_mem_func; - pzlib_filefunc_def->zseek_file = fseek_mem_func; - pzlib_filefunc_def->zclose_file = fclose_mem_func; - pzlib_filefunc_def->zerror_file = ferror_mem_func; - pzlib_filefunc_def->opaque = ourmem; -} - -// turn the warnings back on -#pragma GCC diagnostic pop diff --git a/include/minizip/ioapi_mem.h b/include/minizip/ioapi_mem.h deleted file mode 100644 index fdbcd1e..0000000 --- a/include/minizip/ioapi_mem.h +++ /dev/null @@ -1,51 +0,0 @@ -/* ioapi_mem.h -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - This version of ioapi is designed to access memory rather than files. - We do use a region of memory to put data in to and take it out of. - - Copyright (C) 1998-2003 Gilles Vollant - (C) 2003 Justin Fletcher - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef _IOAPI_MEM_H -#define _IOAPI_MEM_H - -#include -#include -#include - -#include "zlib.h" -#include "ioapi.h" - -#ifdef __cplusplus -extern "C" { -#endif - -voidpf ZCALLBACK fopen_mem_func OF((voidpf opaque,const char* filename,int mode)); -voidpf ZCALLBACK fopendisk_mem_func OF((voidpf opaque, voidpf stream, int number_disk, int mode)); -uLong ZCALLBACK fread_mem_func OF((voidpf opaque,voidpf stream,void* buf,uLong size)); -uLong ZCALLBACK fwrite_mem_func OF((voidpf opaque,voidpf stream,const void* buf,uLong size)); -long ZCALLBACK ftell_mem_func OF((voidpf opaque,voidpf stream)); -long ZCALLBACK fseek_mem_func OF((voidpf opaque,voidpf stream,uLong offset,int origin)); -int ZCALLBACK fclose_mem_func OF((voidpf opaque,voidpf stream)); -int ZCALLBACK ferror_mem_func OF((voidpf opaque,voidpf stream)); - -typedef struct ourmemory_s { - char *base; /* Base of the region of memory we're using */ - uLong size; /* Size of the region of memory we're using */ - uLong limit; /* Furthest we've written */ - uLong cur_offset; /* Current offset in the area */ - int grow; /* Growable memory buffer */ -} ourmemory_t; - -void fill_memory_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def, ourmemory_t *ourmem)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/minizip/unzip.c b/include/minizip/unzip.c deleted file mode 100644 index 6e2ddbc..0000000 --- a/include/minizip/unzip.c +++ /dev/null @@ -1,1962 +0,0 @@ -/* unzip.c -- IO for uncompress .zip files using zlib - Version 1.1, February 14h, 2010 - part of the MiniZip project - - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - Modifications of Unzip for Zip64 - Copyright (C) 2007-2008 Even Rouault - Modifications for Zip64 support on both zip and unzip - Copyright (C) 2009-2010 Mathias Svensson - http://result42.com - Modifications for AES, PKWARE disk spanning - Copyright (C) 2010-2014 Nathan Moinvaziri - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. - - Mar 8th, 2016 - Lucio Cosmo - Fixed support for 64bit builds for archives with "PKWARE" password. - Changed long, unsigned long, unsigned to unsigned int in - access functions to crctables and pkeys -*/ - -//taken and adapted from https://stackoverflow.com/a/13492589 - -// save diagnostic state -#pragma GCC diagnostic push - -// turn off the specific warning. Can also use "-Wall" -#pragma GCC diagnostic ignored "-Wtype-limits" - -#include -#include -#include - -/*#ifndef NOUNCRYPT -# define NOUNCRYPT -#endif*/ - -#include "unzip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - -#ifdef HAVE_AES -# define AES_METHOD (99) -# define AES_PWVERIFYSIZE (2) -# define AES_MAXSALTLENGTH (16) -# define AES_AUTHCODESIZE (10) -# define AES_HEADERSIZE (11) -# define AES_KEYSIZE(mode) (64 + (mode * 64)) - -# include "aes/aes.h" -# include "aes/fileenc.h" -#endif -#ifndef NOUNCRYPT -# include "crypt.h" -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -#define DISKHEADERMAGIC (0x08074b50) -#define LOCALHEADERMAGIC (0x04034b50) -#define CENTRALHEADERMAGIC (0x02014b50) -#define ENDHEADERMAGIC (0x06054b50) -#define ZIP64ENDHEADERMAGIC (0x06064b50) -#define ZIP64ENDLOCHEADERMAGIC (0x07064b50) - -#define SIZECENTRALDIRITEM (0x2e) -#define SIZECENTRALHEADERLOCATOR (0x14) /* 20 */ -#define SIZEZIPLOCALHEADER (0x1e) - -#ifndef BUFREADCOMMENT -# define BUFREADCOMMENT (0x400) -#endif - -#ifndef UNZ_BUFSIZE -# define UNZ_BUFSIZE (64 * 1024) -#endif -#ifndef UNZ_MAXFILENAMEINZIP -# define UNZ_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -const char unz_copyright[] = - " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - -/* unz_file_info_interntal contain internal info about a file in zipfile*/ -typedef struct unz_file_info64_internal_s -{ - ZPOS64_T offset_curfile; /* relative offset of local header 8 bytes */ - ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx) */ -#ifdef HAVE_AES - uLong aes_encryption_mode; - uLong aes_compression_method; - uLong aes_version; -#endif -} unz_file_info64_internal; - -/* file_in_zip_read_info_s contain internal information about a file in zipfile */ -typedef struct -{ - Bytef *read_buffer; /* internal buffer for compressed data */ - z_stream stream; /* zLib stream structure for inflate */ - -#ifdef HAVE_BZIP2 - bz_stream bstream; /* bzLib stream structure for bziped */ -#endif -#ifdef HAVE_AES - fcrypt_ctx aes_ctx; -#endif - - ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek */ - uLong stream_initialised; /* flag set if stream structure is initialised */ - - ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ - uInt size_local_extrafield; /* size of the local extra field */ - ZPOS64_T pos_local_extrafield; /* position in the local extra field in read */ - ZPOS64_T total_out_64; - - uLong crc32; /* crc32 of all data uncompressed */ - uLong crc32_wait; /* crc32 we must obtain after decompress all */ - ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ - ZPOS64_T rest_read_uncompressed; /* number of byte to be obtained after decomp */ - - zlib_filefunc64_32_def z_filefunc; - - voidpf filestream; /* io structore of the zipfile */ - uLong compression_method; /* compression method (0==store) */ - ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx) */ - int raw; -} file_in_zip64_read_info_s; - -/* unz64_s contain internal information about the zipfile */ -typedef struct -{ - zlib_filefunc64_32_def z_filefunc; - voidpf filestream; /* io structure of the current zipfile */ - voidpf filestream_with_CD; /* io structure of the disk with the central directory */ - unz_global_info64 gi; /* public global information */ - ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/ - ZPOS64_T num_file; /* number of the current file in the zipfile*/ - ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ - ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ - ZPOS64_T central_pos; /* position of the beginning of the central dir*/ - uLong number_disk; /* number of the current disk, used for spanning ZIP*/ - ZPOS64_T size_central_dir; /* size of the central directory */ - ZPOS64_T offset_central_dir; /* offset of start of central directory with - respect to the starting disk number */ - - unz_file_info64 cur_file_info; /* public info about the current file in zip*/ - unz_file_info64_internal cur_file_info_internal; - /* private info about it*/ - file_in_zip64_read_info_s* pfile_in_zip_read; - /* structure about the current file if we are decompressing it */ - int isZip64; /* is the current file zip64 */ -#ifndef NOUNCRYPT - unsigned int keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned int* pcrc_32_tab; -#endif -} unz64_s; - -/* Translate date/time from Dos format to tm_unz (readable more easily) */ -local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) -{ - ZPOS64_T uDate = (ZPOS64_T)(ulDosDate>>16); - - ptm->tm_mday = (uInt)(uDate&0x1f); - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1); - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980); - ptm->tm_hour = (uInt)((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt)((ulDosDate&0x7E0)/0x20); - ptm->tm_sec = (uInt)(2*(ulDosDate&0x1f)); - -#define unz64local_in_range(min, max, value) ((min) <= (value) && (value) <= (max)) - if (!unz64local_in_range(0, 11, ptm->tm_mon) || - !unz64local_in_range(1, 31, ptm->tm_mday) || - !unz64local_in_range(0, 23, ptm->tm_hour) || - !unz64local_in_range(0, 59, ptm->tm_min) || - !unz64local_in_range(0, 59, ptm->tm_sec)) - /* Invalid date stored, so don't return it. */ - memset(ptm, 0, sizeof(tm_unz)); -#undef unz64local_in_range -} - -/* Read a byte from a gz_stream; Return EOF for end of file. */ -local int unz64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); -local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) -{ - unsigned char c; - int err = (int)ZREAD64(*pzlib_filefunc_def, filestream, &c, 1); - if (err == 1) - { - *pi = (int)c; - return UNZ_OK; - } - *pi = 0; - if (ZERROR64(*pzlib_filefunc_def, filestream)) - return UNZ_ERRNO; - return UNZ_EOF; -} - -local int unz64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); -local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) -{ - uLong x; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x = (uLong)i; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((uLong)i)<<8; - - if (err == UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unz64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); -local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) -{ - uLong x; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x = (uLong)i; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((uLong)i)<<8; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((uLong)i)<<16; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((uLong)i)<<24; - - if (err == UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unz64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); -local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) -{ - ZPOS64_T x; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x = (ZPOS64_T)i; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<8; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<16; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<24; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<32; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<40; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<48; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<56; - - if (err == UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -/* Locate the Central directory of a zip file (at the end, just before the global comment) */ -local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); -local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ - unsigned char* buf; - ZPOS64_T file_size; - ZPOS64_T back_read = 4; - ZPOS64_T max_back = 0xffff; /* maximum size of global comment */ - ZPOS64_T pos_found = 0; - uLong read_size; - ZPOS64_T read_pos; - int i; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT + 4); - if (buf == NULL) - return 0; - - if (ZSEEK64(*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0) - { - TRYFREE(buf); - return 0; - } - - file_size = ZTELL64(*pzlib_filefunc_def, filestream); - - if (max_back > file_size) - max_back = file_size; - - while (back_read < max_back) - { - if (back_read + BUFREADCOMMENT > max_back) - back_read = max_back; - else - back_read += BUFREADCOMMENT; - - read_pos = file_size - back_read; - read_size = ((BUFREADCOMMENT + 4) < (file_size - read_pos)) ? - (BUFREADCOMMENT + 4) : (uLong)(file_size - read_pos); - - if (ZSEEK64(*pzlib_filefunc_def, filestream, read_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - break; - if (ZREAD64(*pzlib_filefunc_def, filestream, buf, read_size) != read_size) - break; - - for (i = (int)read_size-3; (i--) > 0;) - if (((*(buf+i)) == (ENDHEADERMAGIC & 0xff)) && - ((*(buf+i+1)) == (ENDHEADERMAGIC >> 8 & 0xff)) && - ((*(buf+i+2)) == (ENDHEADERMAGIC >> 16 & 0xff)) && - ((*(buf+i+3)) == (ENDHEADERMAGIC >> 24 & 0xff))) - { - pos_found = read_pos+i; - break; - } - - if (pos_found != 0) - break; - } - TRYFREE(buf); - return pos_found; -} - -/* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T unz64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - const ZPOS64_T endcentraloffset)); -local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - const ZPOS64_T endcentraloffset) -{ - ZPOS64_T offset; - uLong uL; - - /* Zip64 end of central directory locator */ - if (ZSEEK64(*pzlib_filefunc_def, filestream, endcentraloffset - SIZECENTRALHEADERLOCATOR, ZLIB_FILEFUNC_SEEK_SET) != 0) - return 0; - - /* read locator signature */ - if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK) - return 0; - if (uL != ZIP64ENDLOCHEADERMAGIC) - return 0; - /* number of the disk with the start of the zip64 end of central directory */ - if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK) - return 0; - /* relative offset of the zip64 end of central directory record */ - if (unz64local_getLong64(pzlib_filefunc_def, filestream, &offset) != UNZ_OK) - return 0; - /* total number of disks */ - if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK) - return 0; - /* Goto end of central directory record */ - if (ZSEEK64(*pzlib_filefunc_def, filestream, offset, ZLIB_FILEFUNC_SEEK_SET) != 0) - return 0; - /* the signature */ - if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK) - return 0; - if (uL != ZIP64ENDHEADERMAGIC) - return 0; - - return offset; -} - -local unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) -{ - unz64_s us; - unz64_s *s; - ZPOS64_T central_pos; - ZPOS64_T central_pos64; - uLong uL; - ZPOS64_T uL64; - voidpf filestream = NULL; - ZPOS64_T number_entry_CD; - int err = UNZ_OK; - - if (unz_copyright[0]!=' ') - return NULL; - - us.filestream = NULL; - us.filestream_with_CD = NULL; - us.z_filefunc.zseek32_file = NULL; - us.z_filefunc.ztell32_file = NULL; - if (pzlib_filefunc64_32_def == NULL) - fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); - else - us.z_filefunc = *pzlib_filefunc64_32_def; - - us.filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); - - if (us.filestream == NULL) - return NULL; - - us.filestream_with_CD = us.filestream; - us.isZip64 = 0; - - /* Search for end of central directory header */ - central_pos = unz64local_SearchCentralDir(&us.z_filefunc, us.filestream); - if (central_pos) - { - if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = UNZ_ERRNO; - - /* the signature, already checked */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* number of this disk */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - us.number_disk = uL; - /* number of the disk with the start of the central directory */ - if (unz64local_getShort(&us.z_filefunc, us.filestream,& uL) != UNZ_OK) - err = UNZ_ERRNO; - us.gi.number_disk_with_CD = uL; - /* total number of entries in the central directory on this disk */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - us.gi.number_entry = uL; - /* total number of entries in the central directory */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - number_entry_CD = uL; - if (number_entry_CD != us.gi.number_entry) - err = UNZ_BADZIPFILE; - /* size of the central directory */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - us.size_central_dir = uL; - /* offset of start of central directory with respect to the starting disk number */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - us.offset_central_dir = uL; - /* zipfile comment length */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &us.gi.size_comment) != UNZ_OK) - err = UNZ_ERRNO; - - if (err == UNZ_OK) - { - /* Search for Zip64 end of central directory header */ - central_pos64 = unz64local_SearchCentralDir64(&us.z_filefunc, us.filestream, central_pos); - if (central_pos64) - { - central_pos = central_pos64; - us.isZip64 = 1; - - if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = UNZ_ERRNO; - - /* the signature, already checked */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* size of zip64 end of central directory record */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &uL64) != UNZ_OK) - err = UNZ_ERRNO; - /* version made by */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* version needed to extract */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* number of this disk */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.number_disk) != UNZ_OK) - err = UNZ_ERRNO; - /* number of the disk with the start of the central directory */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.gi.number_disk_with_CD) != UNZ_OK) - err = UNZ_ERRNO; - /* total number of entries in the central directory on this disk */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.gi.number_entry) != UNZ_OK) - err = UNZ_ERRNO; - /* total number of entries in the central directory */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &number_entry_CD) != UNZ_OK) - err = UNZ_ERRNO; - if (number_entry_CD != us.gi.number_entry) - err = UNZ_BADZIPFILE; - /* size of the central directory */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.size_central_dir) != UNZ_OK) - err = UNZ_ERRNO; - /* offset of start of central directory with respect to the starting disk number */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.offset_central_dir) != UNZ_OK) - err = UNZ_ERRNO; - } - else if ((us.gi.number_entry == 0xffff) || (us.size_central_dir == 0xffff) || (us.offset_central_dir == 0xffffffff)) - err = UNZ_BADZIPFILE; - } - } - else - err = UNZ_ERRNO; - - if ((err == UNZ_OK) && (central_pos < us.offset_central_dir + us.size_central_dir)) - err = UNZ_BADZIPFILE; - - if (err != UNZ_OK) - { - ZCLOSE64(us.z_filefunc, us.filestream); - return NULL; - } - - if (us.gi.number_disk_with_CD == 0) - { - /* If there is only one disk open another stream so we don't have to seek between the CD - and the file headers constantly */ - filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); - if (filestream != NULL) - us.filestream = filestream; - } - - /* Hack for zip files that have no respect for zip64 - if ((central_pos > 0xffffffff) && (us.offset_central_dir < 0xffffffff)) - us.offset_central_dir = central_pos - us.size_central_dir;*/ - - us.byte_before_the_zipfile = central_pos - (us.offset_central_dir + us.size_central_dir); - us.central_pos = central_pos; - us.pfile_in_zip_read = NULL; - - s = (unz64_s*)ALLOC(sizeof(unz64_s)); - if (s != NULL) - { - *s = us; - unzGoToFirstFile((unzFile)s); - } - return (unzFile)s; -} - -extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def* pzlib_filefunc32_def) -{ - if (pzlib_filefunc32_def != NULL) - { - zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; - fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def); - return unzOpenInternal(path, &zlib_filefunc64_32_def_fill); - } - return unzOpenInternal(path, NULL); -} - -extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def* pzlib_filefunc_def) -{ - if (pzlib_filefunc_def != NULL) - { - zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; - zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; - zlib_filefunc64_32_def_fill.ztell32_file = NULL; - zlib_filefunc64_32_def_fill.zseek32_file = NULL; - return unzOpenInternal(path, &zlib_filefunc64_32_def_fill); - } - return unzOpenInternal(path, NULL); -} - -extern unzFile ZEXPORT unzOpen(const char *path) -{ - return unzOpenInternal(path, NULL); -} - -extern unzFile ZEXPORT unzOpen64(const void *path) -{ - return unzOpenInternal(path, NULL); -} - -extern int ZEXPORT unzClose(unzFile file) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD)) - ZCLOSE64(s->z_filefunc, s->filestream); - if (s->filestream_with_CD != NULL) - ZCLOSE64(s->z_filefunc, s->filestream_with_CD); - - s->filestream = NULL; - s->filestream_with_CD = NULL; - TRYFREE(s); - return UNZ_OK; -} - -/* Goto to the next available disk for spanned archives */ -local int unzGoToNextDisk OF((unzFile file)); -local int unzGoToNextDisk(unzFile file) -{ - unz64_s* s; - uLong number_disk_next = 0; - - s = (unz64_s*)file; - if (s == NULL) - return UNZ_PARAMERROR; - number_disk_next = s->number_disk; - - if ((s->pfile_in_zip_read != NULL) && (s->pfile_in_zip_read->rest_read_uncompressed > 0)) - /* We are currently reading a file and we need the next sequential disk */ - number_disk_next += 1; - else - /* Goto the disk for the current file */ - number_disk_next = s->cur_file_info.disk_num_start; - - if (number_disk_next != s->number_disk) - { - /* Switch disks */ - if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD)) - ZCLOSE64(s->z_filefunc, s->filestream); - - if (number_disk_next == s->gi.number_disk_with_CD) - { - s->filestream = s->filestream_with_CD; - } - else - { - s->filestream = ZOPENDISK64(s->z_filefunc, s->filestream_with_CD, number_disk_next, - ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); - } - - if (s->filestream == NULL) - return UNZ_ERRNO; - - s->number_disk = number_disk_next; - } - - return UNZ_OK; -} - -extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - /* to do : check if number_entry is not truncated */ - pglobal_info32->number_entry = (uLong)s->gi.number_entry; - pglobal_info32->size_comment = s->gi.size_comment; - pglobal_info32->number_disk_with_CD = s->gi.number_disk_with_CD; - return UNZ_OK; -} - -extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64* pglobal_info) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - *pglobal_info = s->gi; - return UNZ_OK; -} - -extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uLong comment_size) -{ - unz64_s* s; - uLong bytes_to_read = comment_size; - if (file == NULL) - return (int)UNZ_PARAMERROR; - s = (unz64_s*)file; - - if (bytes_to_read > s->gi.size_comment) - bytes_to_read = s->gi.size_comment; - - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, s->central_pos + 22, ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_ERRNO; - - if (bytes_to_read>0) - { - *comment = 0; - if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, bytes_to_read) != bytes_to_read) - return UNZ_ERRNO; - } - - if ((comment != NULL) && (comment_size > s->gi.size_comment)) - *(comment+s->gi.size_comment) = 0; - return (int)bytes_to_read; -} - -/* Get Info about the current file in the zipfile, with internal only info */ -local int unz64local_GetCurrentFileInfoInternal(unzFile file, unz_file_info64 *pfile_info, - unz_file_info64_internal *pfile_info_internal, char *filename, uLong filename_size, void *extrafield, - uLong extrafield_size, char *comment, uLong comment_size) -{ - unz64_s* s; - unz_file_info64 file_info; - unz_file_info64_internal file_info_internal; - ZPOS64_T bytes_to_read; - int err = UNZ_OK; - uLong uMagic; - long lSeek = 0; - ZPOS64_T current_pos = 0; - uLong acc = 0; - uLong uL; - ZPOS64_T uL64; - - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, - s->pos_in_central_dir + s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = UNZ_ERRNO; - - /* Check the magic */ - if (err == UNZ_OK) - { - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uMagic) != UNZ_OK) - err = UNZ_ERRNO; - else if (uMagic != CENTRALHEADERMAGIC) - err = UNZ_BADZIPFILE; - } - - /* Read central directory header */ - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version_needed) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.flag) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.compression_method) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.dosDate) != UNZ_OK) - err = UNZ_ERRNO; - unz64local_DosDateToTmuDate(file_info.dosDate, &file_info.tmu_date); - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.crc) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - file_info.compressed_size = uL; - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - file_info.uncompressed_size = uL; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_filename) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_extra) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_comment) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.internal_fa) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.external_fa) != UNZ_OK) - err = UNZ_ERRNO; - /* Relative offset of local header */ - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - - file_info.size_file_extra_internal = 0; - file_info.disk_offset = uL; - file_info_internal.offset_curfile = uL; -#ifdef HAVE_AES - file_info_internal.aes_compression_method = 0; - file_info_internal.aes_encryption_mode = 0; - file_info_internal.aes_version = 0; -#endif - - lSeek += file_info.size_filename; - - if ((err == UNZ_OK) && (filename != NULL)) - { - if (file_info.size_filename < filename_size) - { - *(filename+file_info.size_filename) = 0; - bytes_to_read = file_info.size_filename; - } - else - bytes_to_read = filename_size; - - if ((file_info.size_filename > 0) && (filename_size > 0)) - if (ZREAD64(s->z_filefunc, s->filestream_with_CD,filename, (uLong)bytes_to_read) != bytes_to_read) - err = UNZ_ERRNO; - lSeek -= (uLong)bytes_to_read; - } - - /* Read extrafield */ - if ((err == UNZ_OK) && (extrafield != NULL)) - { - if (file_info.size_file_extra < extrafield_size) - bytes_to_read = file_info.size_file_extra; - else - bytes_to_read = extrafield_size; - - if (lSeek != 0) - { - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0) - lSeek=0; - else - err = UNZ_ERRNO; - } - - if ((file_info.size_file_extra > 0) && (extrafield_size > 0)) - if (ZREAD64(s->z_filefunc, s->filestream_with_CD, extrafield, (uLong)bytes_to_read) != bytes_to_read) - err = UNZ_ERRNO; - lSeek += file_info.size_file_extra - (uLong)bytes_to_read; - } - else - lSeek += file_info.size_file_extra; - - if ((err == UNZ_OK) && (file_info.size_file_extra != 0)) - { - if (lSeek != 0) - { - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0) - lSeek=0; - else - err = UNZ_ERRNO; - } - - /* We are going to parse the extra field so we need to move back */ - current_pos = ZTELL64(s->z_filefunc, s->filestream_with_CD); - if (current_pos < file_info.size_file_extra) - err = UNZ_ERRNO; - current_pos -= file_info.size_file_extra; - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, current_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = UNZ_ERRNO; - - while((err != UNZ_ERRNO) && (acc < file_info.size_file_extra)) - { - uLong headerid; - uLong datasize; - - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &headerid) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &datasize) != UNZ_OK) - err = UNZ_ERRNO; - - /* ZIP64 extra fields */ - if (headerid == 0x0001) - { - /* Subtract size of ZIP64 field, since ZIP64 is handled internally */ - file_info.size_file_extra_internal += 2 + 2 + datasize; - - if (file_info.uncompressed_size == 0xffffffff) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.uncompressed_size) != UNZ_OK) - err = UNZ_ERRNO; - } - if (file_info.compressed_size == 0xffffffff) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.compressed_size) != UNZ_OK) - err = UNZ_ERRNO; - } - if (file_info_internal.offset_curfile == 0xffffffff) - { - /* Relative Header offset */ - if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &uL64) != UNZ_OK) - err = UNZ_ERRNO; - file_info_internal.offset_curfile = uL64; - file_info.disk_offset = uL64; - } - if (file_info.disk_num_start == 0xffffffff) - { - /* Disk Start Number */ - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK) - err = UNZ_ERRNO; - } - } -#ifdef HAVE_AES - /* AES header */ - else if (headerid == 0x9901) - { - /* Subtract size of AES field, since AES is handled internally */ - file_info.size_file_extra_internal += 2 + 2 + datasize; - - /* Verify version info */ - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* Support AE-1 and AE-2 */ - if (uL != 1 && uL != 2) - err = UNZ_ERRNO; - file_info_internal.aes_version = uL; - if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - if ((char)uL != 'A') - err = UNZ_ERRNO; - if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - if ((char)uL != 'E') - err = UNZ_ERRNO; - /* Get AES encryption strength and actual compression method */ - if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - file_info_internal.aes_encryption_mode = uL; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - file_info_internal.aes_compression_method = uL; - } -#endif - else - { - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD,datasize, ZLIB_FILEFUNC_SEEK_CUR) != 0) - err = UNZ_ERRNO; - } - - acc += 2 + 2 + datasize; - } - } - - if (file_info.disk_num_start == s->gi.number_disk_with_CD) - file_info_internal.byte_before_the_zipfile = s->byte_before_the_zipfile; - else - file_info_internal.byte_before_the_zipfile = 0; - - if ((err == UNZ_OK) && (comment != NULL)) - { - if (file_info.size_file_comment < comment_size) - { - *(comment+file_info.size_file_comment) = 0; - bytes_to_read = file_info.size_file_comment; - } - else - bytes_to_read = comment_size; - - if (lSeek != 0) - { - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) != 0) - err = UNZ_ERRNO; - } - - if ((file_info.size_file_comment > 0) && (comment_size > 0)) - if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, (uLong)bytes_to_read) != bytes_to_read) - err = UNZ_ERRNO; - lSeek += file_info.size_file_comment - (uLong)bytes_to_read; - } - else - lSeek += file_info.size_file_comment; - - if ((err == UNZ_OK) && (pfile_info != NULL)) - *pfile_info = file_info; - - if ((err == UNZ_OK) && (pfile_info_internal != NULL)) - *pfile_info_internal = file_info_internal; - - return err; -} - -extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info * pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char* comment, uLong comment_size) -{ - unz_file_info64 file_info64; - int err; - - err = unz64local_GetCurrentFileInfoInternal(file, &file_info64, NULL, filename, filename_size, - extrafield, extrafield_size, comment, comment_size); - - if ((err == UNZ_OK) && (pfile_info != NULL)) - { - pfile_info->version = file_info64.version; - pfile_info->version_needed = file_info64.version_needed; - pfile_info->flag = file_info64.flag; - pfile_info->compression_method = file_info64.compression_method; - pfile_info->dosDate = file_info64.dosDate; - pfile_info->crc = file_info64.crc; - - pfile_info->size_filename = file_info64.size_filename; - pfile_info->size_file_extra = file_info64.size_file_extra - file_info64.size_file_extra_internal; - pfile_info->size_file_comment = file_info64.size_file_comment; - - pfile_info->disk_num_start = file_info64.disk_num_start; - pfile_info->internal_fa = file_info64.internal_fa; - pfile_info->external_fa = file_info64.external_fa; - - pfile_info->tmu_date = file_info64.tmu_date, - - pfile_info->compressed_size = (uLong)file_info64.compressed_size; - pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; - - } - return err; -} - -extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 * pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char* comment, uLong comment_size) -{ - return unz64local_GetCurrentFileInfoInternal(file, pfile_info, NULL, filename, filename_size, - extrafield, extrafield_size, comment,comment_size); -} - -/* Read the local header of the current zipfile. Check the coherency of the local header and info in the - end of central directory about this file store in *piSizeVar the size of extra info in local header - (filename and size of extra field data) */ -local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s* s, uInt* piSizeVar, ZPOS64_T *poffset_local_extrafield, - uInt *psize_local_extrafield) -{ - uLong uMagic, uL, uFlags; - uLong size_filename; - uLong size_extra_field; - int err = UNZ_OK; - int compression_method = 0; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - err = unzGoToNextDisk((unzFile)s); - if (err != UNZ_OK) - return err; - - if (ZSEEK64(s->z_filefunc, s->filestream, s->cur_file_info_internal.offset_curfile + - s->cur_file_info_internal.byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_ERRNO; - - if (err == UNZ_OK) - { - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK) - err = UNZ_ERRNO; - else if (uMagic != LOCALHEADERMAGIC) - err = UNZ_BADZIPFILE; - } - - if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream, &uFlags) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - else if ((err == UNZ_OK) && (uL != s->cur_file_info.compression_method)) - err = UNZ_BADZIPFILE; - - compression_method = (int)s->cur_file_info.compression_method; -#ifdef HAVE_AES - if (compression_method == AES_METHOD) - compression_method = (int)s->cur_file_info_internal.aes_compression_method; -#endif - - if ((err == UNZ_OK) && (compression_method != 0) && -#ifdef HAVE_BZIP2 - (compression_method != Z_BZIP2ED) && -#endif - (compression_method != Z_DEFLATED)) - err = UNZ_BADZIPFILE; - - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* date/time */ - err = UNZ_ERRNO; - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* crc */ - err = UNZ_ERRNO; - else if ((err == UNZ_OK) && (uL != s->cur_file_info.crc) && ((uFlags & 8) == 0)) - err = UNZ_BADZIPFILE; - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size compr */ - err = UNZ_ERRNO; - else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.compressed_size) && ((uFlags & 8) == 0)) - err = UNZ_BADZIPFILE; - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size uncompr */ - err = UNZ_ERRNO; - else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.uncompressed_size) && ((uFlags & 8) == 0)) - err = UNZ_BADZIPFILE; - if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_filename) != UNZ_OK) - err = UNZ_ERRNO; - else if ((err == UNZ_OK) && (size_filename != s->cur_file_info.size_filename)) - err = UNZ_BADZIPFILE; - - *piSizeVar += (uInt)size_filename; - - if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_extra_field) != UNZ_OK) - err = UNZ_ERRNO; - *poffset_local_extrafield = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; - *psize_local_extrafield = (uInt)size_extra_field; - - *piSizeVar += (uInt)size_extra_field; - - return err; -} - -/* - Open for reading data the current file in the zipfile. - If there is no error and the file is opened, the return value is UNZ_OK. -*/ -extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int* method, int* level, int raw, const char* password) -{ - int err = UNZ_OK; - int compression_method; - uInt iSizeVar; - unz64_s* s; - file_in_zip64_read_info_s* pfile_in_zip_read_info; - ZPOS64_T offset_local_extrafield; - uInt size_local_extrafield; -#ifndef NOUNCRYPT - char source[12]; -#else - if (password != NULL) - return UNZ_PARAMERROR; -#endif - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (!s->current_file_ok) - return UNZ_PARAMERROR; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if (unz64local_CheckCurrentFileCoherencyHeader(s, &iSizeVar, &offset_local_extrafield, &size_local_extrafield) != UNZ_OK) - return UNZ_BADZIPFILE; - - pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); - if (pfile_in_zip_read_info == NULL) - return UNZ_INTERNALERROR; - - pfile_in_zip_read_info->read_buffer = (Bytef*)ALLOC(UNZ_BUFSIZE); - pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; - pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; - pfile_in_zip_read_info->pos_local_extrafield = 0; - pfile_in_zip_read_info->raw = raw; - - if (pfile_in_zip_read_info->read_buffer == NULL) - { - TRYFREE(pfile_in_zip_read_info); - return UNZ_INTERNALERROR; - } - - pfile_in_zip_read_info->stream_initialised = 0; - - compression_method = (int)s->cur_file_info.compression_method; -#ifdef HAVE_AES - if (compression_method == AES_METHOD) - compression_method = (int)s->cur_file_info_internal.aes_compression_method; -#endif - - if (method != NULL) - *method = compression_method; - - if (level != NULL) - { - *level = 6; - switch (s->cur_file_info.flag & 0x06) - { - case 6 : *level = 1; break; - case 4 : *level = 2; break; - case 2 : *level = 9; break; - } - } - - if ((compression_method != 0) && -#ifdef HAVE_BZIP2 - (compression_method != Z_BZIP2ED) && -#endif - (compression_method != Z_DEFLATED)) - err = UNZ_BADZIPFILE; - - pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc; - pfile_in_zip_read_info->crc32 = 0; - pfile_in_zip_read_info->total_out_64 = 0; - pfile_in_zip_read_info->compression_method = compression_method; - pfile_in_zip_read_info->filestream = s->filestream; - pfile_in_zip_read_info->z_filefunc = s->z_filefunc; - if (s->number_disk == s->gi.number_disk_with_CD) - pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile; - else - pfile_in_zip_read_info->byte_before_the_zipfile = 0; - pfile_in_zip_read_info->stream.total_out = 0; - pfile_in_zip_read_info->stream.total_in = 0; - pfile_in_zip_read_info->stream.next_in = NULL; - - if (!raw) - { - if (compression_method == Z_BZIP2ED) - { -#ifdef HAVE_BZIP2 - pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; - pfile_in_zip_read_info->bstream.bzfree = (free_func)0; - pfile_in_zip_read_info->bstream.opaque = (voidpf)0; - pfile_in_zip_read_info->bstream.state = (voidpf)0; - - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)0; - pfile_in_zip_read_info->stream.next_in = (voidpf)0; - pfile_in_zip_read_info->stream.avail_in = 0; - - err = BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; - else - { - TRYFREE(pfile_in_zip_read_info); - return err; - } -#else - pfile_in_zip_read_info->raw = 1; -#endif - } - else if (compression_method == Z_DEFLATED) - { - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)s; - pfile_in_zip_read_info->stream.next_in = 0; - pfile_in_zip_read_info->stream.avail_in = 0; - - err = inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised = Z_DEFLATED; - else - { - TRYFREE(pfile_in_zip_read_info); - return err; - } - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - * In unzip, i don't wait absolutely Z_STREAM_END because I known the - * size of both compressed and uncompressed data - */ - } - } - - pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size; - pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size; - pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; - pfile_in_zip_read_info->stream.avail_in = (uInt)0; - - s->pfile_in_zip_read = pfile_in_zip_read_info; - -#ifndef NOUNCRYPT - s->pcrc_32_tab = NULL; - - if ((password != NULL) && ((s->cur_file_info.flag & 1) != 0)) - { - if (ZSEEK64(s->z_filefunc, s->filestream, - s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_INTERNALERROR; -#ifdef HAVE_AES - if (s->cur_file_info.compression_method == AES_METHOD) - { - unsigned char passverify[AES_PWVERIFYSIZE]; - unsigned char saltvalue[AES_MAXSALTLENGTH]; - uInt saltlength; - - if ((s->cur_file_info_internal.aes_encryption_mode < 1) || - (s->cur_file_info_internal.aes_encryption_mode > 3)) - return UNZ_INTERNALERROR; - - saltlength = SALT_LENGTH(s->cur_file_info_internal.aes_encryption_mode); - - if (ZREAD64(s->z_filefunc, s->filestream, saltvalue, saltlength) != saltlength) - return UNZ_INTERNALERROR; - if (ZREAD64(s->z_filefunc, s->filestream, passverify, AES_PWVERIFYSIZE) != AES_PWVERIFYSIZE) - return UNZ_INTERNALERROR; - - fcrypt_init(s->cur_file_info_internal.aes_encryption_mode, password, strlen(password), saltvalue, - passverify, &s->pfile_in_zip_read->aes_ctx); - - s->pfile_in_zip_read->rest_read_compressed -= saltlength + AES_PWVERIFYSIZE; - s->pfile_in_zip_read->rest_read_compressed -= AES_AUTHCODESIZE; - - s->pfile_in_zip_read->pos_in_zipfile += saltlength + AES_PWVERIFYSIZE; - } - else -#endif - { - int i; - s->pcrc_32_tab = (const unsigned int*)get_crc_table(); - init_keys(password, s->keys, s->pcrc_32_tab); - - if (ZREAD64(s->z_filefunc, s->filestream, source, 12) < 12) - return UNZ_INTERNALERROR; - - for (i = 0; i < 12; i++) - zdecode(s->keys, s->pcrc_32_tab, source[i]); - - s->pfile_in_zip_read->rest_read_compressed -= 12; - - s->pfile_in_zip_read->pos_in_zipfile += 12; - } - } -#endif - - return UNZ_OK; -} - -extern int ZEXPORT unzOpenCurrentFile(unzFile file) -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); -} - -extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char* password) -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, password); -} - -extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int* method, int* level, int raw) -{ - return unzOpenCurrentFile3(file, method, level, raw, NULL); -} - -/* Read bytes from the current file. - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if some bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ -extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len) -{ - int err = UNZ_OK; - uInt read = 0; - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - - if (s->pfile_in_zip_read == NULL) - return UNZ_PARAMERROR; - if (s->pfile_in_zip_read->read_buffer == NULL) - return UNZ_END_OF_LIST_OF_FILE; - if (len == 0) - return 0; - - s->pfile_in_zip_read->stream.next_out = (Bytef*)buf; - s->pfile_in_zip_read->stream.avail_out = (uInt)len; - - if (s->pfile_in_zip_read->raw) - { - if (len > s->pfile_in_zip_read->rest_read_compressed + s->pfile_in_zip_read->stream.avail_in) - s->pfile_in_zip_read->stream.avail_out = (uInt)s->pfile_in_zip_read->rest_read_compressed + - s->pfile_in_zip_read->stream.avail_in; - } - else - { - if (len > s->pfile_in_zip_read->rest_read_uncompressed) - s->pfile_in_zip_read->stream.avail_out = (uInt)s->pfile_in_zip_read->rest_read_uncompressed; - } - - while (s->pfile_in_zip_read->stream.avail_out > 0) - { - if (s->pfile_in_zip_read->stream.avail_in == 0) - { - uLong bytes_to_read = UNZ_BUFSIZE; - uLong bytes_not_read = 0; - uLong bytes_read = 0; - uLong total_bytes_read = 0; - - if (s->pfile_in_zip_read->stream.next_in != NULL) - bytes_not_read = s->pfile_in_zip_read->read_buffer + UNZ_BUFSIZE - - s->pfile_in_zip_read->stream.next_in; - bytes_to_read -= bytes_not_read; - if (bytes_not_read > 0) - memcpy(s->pfile_in_zip_read->read_buffer, s->pfile_in_zip_read->stream.next_in, bytes_not_read); - if (s->pfile_in_zip_read->rest_read_compressed < bytes_to_read) - bytes_to_read = (uInt)s->pfile_in_zip_read->rest_read_compressed; - - while (total_bytes_read != bytes_to_read) - { - if (ZSEEK64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream, - s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_ERRNO; - - bytes_read = ZREAD64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream, - s->pfile_in_zip_read->read_buffer + bytes_not_read + total_bytes_read, - bytes_to_read - total_bytes_read); - - total_bytes_read += bytes_read; - s->pfile_in_zip_read->pos_in_zipfile += bytes_read; - - if (bytes_read == 0) - { - if (ZERROR64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream)) - return UNZ_ERRNO; - - err = unzGoToNextDisk(file); - if (err != UNZ_OK) - return err; - - s->pfile_in_zip_read->pos_in_zipfile = 0; - s->pfile_in_zip_read->filestream = s->filestream; - } - } - -#ifndef NOUNCRYPT - if ((s->cur_file_info.flag & 1) != 0) - { -#ifdef HAVE_AES - if (s->cur_file_info.compression_method == AES_METHOD) - { - fcrypt_decrypt(s->pfile_in_zip_read->read_buffer, bytes_to_read, &s->pfile_in_zip_read->aes_ctx); - } - else -#endif - if (s->pcrc_32_tab != NULL) - { - uInt i; - for(i = 0; i < total_bytes_read; i++) - s->pfile_in_zip_read->read_buffer[i] = - zdecode(s->keys, s->pcrc_32_tab, s->pfile_in_zip_read->read_buffer[i]); - } - } -#endif - - s->pfile_in_zip_read->rest_read_compressed -= total_bytes_read; - s->pfile_in_zip_read->stream.next_in = (Bytef*)s->pfile_in_zip_read->read_buffer; - s->pfile_in_zip_read->stream.avail_in = (uInt)(bytes_not_read + total_bytes_read); - } - - if ((s->pfile_in_zip_read->compression_method == 0) || (s->pfile_in_zip_read->raw)) - { - uInt copy, i; - - if ((s->pfile_in_zip_read->stream.avail_in == 0) && - (s->pfile_in_zip_read->rest_read_compressed == 0)) - return (read == 0) ? UNZ_EOF : read; - - if (s->pfile_in_zip_read->stream.avail_out < s->pfile_in_zip_read->stream.avail_in) - copy = s->pfile_in_zip_read->stream.avail_out; - else - copy = s->pfile_in_zip_read->stream.avail_in; - - for (i = 0; i < copy; i++) - *(s->pfile_in_zip_read->stream.next_out+i) = - *(s->pfile_in_zip_read->stream.next_in+i); - - s->pfile_in_zip_read->total_out_64 = s->pfile_in_zip_read->total_out_64 + copy; - s->pfile_in_zip_read->rest_read_uncompressed -= copy; - s->pfile_in_zip_read->crc32 = crc32(s->pfile_in_zip_read->crc32, - s->pfile_in_zip_read->stream.next_out, copy); - - s->pfile_in_zip_read->stream.avail_in -= copy; - s->pfile_in_zip_read->stream.avail_out -= copy; - s->pfile_in_zip_read->stream.next_out += copy; - s->pfile_in_zip_read->stream.next_in += copy; - s->pfile_in_zip_read->stream.total_out += copy; - read += copy; - } - else if (s->pfile_in_zip_read->compression_method == Z_BZIP2ED) - { -#ifdef HAVE_BZIP2 - uLong total_out_before, total_out_after; - const Bytef *buf_before; - uLong out_bytes; - - s->pfile_in_zip_read->bstream.next_in = (char*)s->pfile_in_zip_read->stream.next_in; - s->pfile_in_zip_read->bstream.avail_in = s->pfile_in_zip_read->stream.avail_in; - s->pfile_in_zip_read->bstream.total_in_lo32 = (uInt)s->pfile_in_zip_read->stream.total_in; - s->pfile_in_zip_read->bstream.total_in_hi32 = s->pfile_in_zip_read->stream.total_in >> 32; - - s->pfile_in_zip_read->bstream.next_out = (char*)s->pfile_in_zip_read->stream.next_out; - s->pfile_in_zip_read->bstream.avail_out = s->pfile_in_zip_read->stream.avail_out; - s->pfile_in_zip_read->bstream.total_out_lo32 = (uInt)s->pfile_in_zip_read->stream.total_out; - s->pfile_in_zip_read->bstream.total_out_hi32 = s->pfile_in_zip_read->stream.total_out >> 32; - - total_out_before = s->pfile_in_zip_read->bstream.total_out_lo32 + - (((uLong)s->pfile_in_zip_read->bstream.total_out_hi32) << 32); - buf_before = (const Bytef *)s->pfile_in_zip_read->bstream.next_out; - - err = BZ2_bzDecompress(&s->pfile_in_zip_read->bstream); - - total_out_after = s->pfile_in_zip_read->bstream.total_out_lo32 + - (((uLong)s->pfile_in_zip_read->bstream.total_out_hi32) << 32); - - out_bytes = total_out_after-total_out_before; - - s->pfile_in_zip_read->total_out_64 = s->pfile_in_zip_read->total_out_64 + out_bytes; - s->pfile_in_zip_read->rest_read_uncompressed -= out_bytes; - s->pfile_in_zip_read->crc32 = crc32(s->pfile_in_zip_read->crc32,buf_before, (uInt)(out_bytes)); - - read += (uInt)(total_out_after - total_out_before); - - s->pfile_in_zip_read->stream.next_in = (Bytef*)s->pfile_in_zip_read->bstream.next_in; - s->pfile_in_zip_read->stream.avail_in = s->pfile_in_zip_read->bstream.avail_in; - s->pfile_in_zip_read->stream.total_in = s->pfile_in_zip_read->bstream.total_in_lo32; - s->pfile_in_zip_read->stream.next_out = (Bytef*)s->pfile_in_zip_read->bstream.next_out; - s->pfile_in_zip_read->stream.avail_out = s->pfile_in_zip_read->bstream.avail_out; - s->pfile_in_zip_read->stream.total_out = s->pfile_in_zip_read->bstream.total_out_lo32; - - if (err == BZ_STREAM_END) - return (read == 0) ? UNZ_EOF : read; - if (err != BZ_OK) - break; -#endif - } - else - { - ZPOS64_T total_out_before, total_out_after; - const Bytef *buf_before; - ZPOS64_T out_bytes; - int flush=Z_SYNC_FLUSH; - - total_out_before = s->pfile_in_zip_read->stream.total_out; - buf_before = s->pfile_in_zip_read->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err = inflate(&s->pfile_in_zip_read->stream,flush); - - if ((err >= 0) && (s->pfile_in_zip_read->stream.msg != NULL)) - err = Z_DATA_ERROR; - - total_out_after = s->pfile_in_zip_read->stream.total_out; - out_bytes = total_out_after-total_out_before; - - s->pfile_in_zip_read->total_out_64 += out_bytes; - s->pfile_in_zip_read->rest_read_uncompressed -= out_bytes; - s->pfile_in_zip_read->crc32 = - crc32(s->pfile_in_zip_read->crc32,buf_before, (uInt)(out_bytes)); - - read += (uInt)(total_out_after - total_out_before); - - if (err == Z_STREAM_END) - return (read == 0) ? UNZ_EOF : read; - if (err != Z_OK) - break; - } - } - - if (err == Z_OK) - return read; - return err; -} - -extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file) -{ - unz64_s* s; - s = (unz64_s*)file; - if (file == NULL) - return 0; /* UNZ_PARAMERROR */ - if (s->pfile_in_zip_read == NULL) - return 0; /* UNZ_PARAMERROR */ - return s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile; -} - -extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, unsigned len) -{ - unz64_s* s; - uInt read_now; - ZPOS64_T size_to_read; - - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (s->pfile_in_zip_read == NULL) - return UNZ_PARAMERROR; - - size_to_read = s->pfile_in_zip_read->size_local_extrafield - s->pfile_in_zip_read->pos_local_extrafield; - - if (buf == NULL) - return (int)size_to_read; - - if (len > size_to_read) - read_now = (uInt)size_to_read; - else - read_now = (uInt)len ; - - if (read_now == 0) - return 0; - - if (ZSEEK64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream, - s->pfile_in_zip_read->offset_local_extrafield + s->pfile_in_zip_read->pos_local_extrafield, - ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_ERRNO; - - if (ZREAD64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream, buf, read_now) != read_now) - return UNZ_ERRNO; - - return (int)read_now; -} - -extern int ZEXPORT unzCloseCurrentFile(unzFile file) -{ - int err = UNZ_OK; - - unz64_s* s; - file_in_zip64_read_info_s* pfile_in_zip_read_info; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info == NULL) - return UNZ_PARAMERROR; - -#ifdef HAVE_AES - if (s->cur_file_info.compression_method == AES_METHOD) - { - unsigned char authcode[AES_AUTHCODESIZE]; - unsigned char rauthcode[AES_AUTHCODESIZE]; - - if (ZREAD64(s->z_filefunc, s->filestream, authcode, AES_AUTHCODESIZE) != AES_AUTHCODESIZE) - return UNZ_ERRNO; - - if (fcrypt_end(rauthcode, &s->pfile_in_zip_read->aes_ctx) != AES_AUTHCODESIZE) - err = UNZ_CRCERROR; - if (memcmp(authcode, rauthcode, AES_AUTHCODESIZE) != 0) - err = UNZ_CRCERROR; - } - /* AES zip version AE-1 will expect a valid crc as well */ - if ((s->cur_file_info.compression_method != AES_METHOD) || - (s->cur_file_info_internal.aes_version == 0x0001)) -#endif - { - if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && - (!pfile_in_zip_read_info->raw)) - { - if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) - err = UNZ_CRCERROR; - } - } - - TRYFREE(pfile_in_zip_read_info->read_buffer); - pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) - inflateEnd(&pfile_in_zip_read_info->stream); -#ifdef HAVE_BZIP2 - else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) - BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); -#endif - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); - - s->pfile_in_zip_read = NULL; - - return err; -} - -extern int ZEXPORT unzGoToFirstFile2(unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size) -{ - int err = UNZ_OK; - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - s->pos_in_central_dir = s->offset_central_dir; - s->num_file = 0; - err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, - filename,filename_size, extrafield,extrafield_size, comment,comment_size); - s->current_file_ok = (err == UNZ_OK); - if ((err == UNZ_OK) && (pfile_info != NULL)) - memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64)); - return err; -} - -extern int ZEXPORT unzGoToFirstFile(unzFile file) -{ - return unzGoToFirstFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0); -} - -extern int ZEXPORT unzGoToNextFile2(unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size) -{ - unz64_s* s; - int err; - - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ - if (s->num_file+1 == s->gi.number_entry) - return UNZ_END_OF_LIST_OF_FILE; - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment; - s->num_file++; - err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, - filename, filename_size, extrafield,extrafield_size, comment,comment_size); - s->current_file_ok = (err == UNZ_OK); - if ((err == UNZ_OK) && (pfile_info != NULL)) - memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64)); - return err; -} - -extern int ZEXPORT unzGoToNextFile(unzFile file) -{ - return unzGoToNextFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0); -} - -extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func) -{ - unz64_s* s; - int err; - unz_file_info64 cur_file_info_saved; - unz_file_info64_internal cur_file_info_internal_saved; - ZPOS64_T num_file_saved; - ZPOS64_T pos_in_central_dir_saved; - char current_filename[UNZ_MAXFILENAMEINZIP+1]; - - if (file == NULL) - return UNZ_PARAMERROR; - if (strlen(filename) >= UNZ_MAXFILENAMEINZIP) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - /* Save the current state */ - num_file_saved = s->num_file; - pos_in_central_dir_saved = s->pos_in_central_dir; - cur_file_info_saved = s->cur_file_info; - cur_file_info_internal_saved = s->cur_file_info_internal; - - err = unzGoToFirstFile2(file, NULL, current_filename, sizeof(current_filename)-1, NULL, 0, NULL, 0); - - while (err == UNZ_OK) - { - if (filename_compare_func != NULL) - err = filename_compare_func(file, current_filename, filename); - else - err = strcmp(current_filename, filename); - if (err == 0) - return UNZ_OK; - err = unzGoToNextFile2(file, NULL, current_filename, sizeof(current_filename)-1, NULL, 0, NULL, 0); - } - - /* We failed, so restore the state of the 'current file' to where we were. */ - s->num_file = num_file_saved; - s->pos_in_central_dir = pos_in_central_dir_saved; - s->cur_file_info = cur_file_info_saved; - s->cur_file_info_internal = cur_file_info_internal_saved; - return err; -} - -extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos* file_pos) -{ - unz64_file_pos file_pos64; - int err = unzGetFilePos64(file,&file_pos64); - if (err == UNZ_OK) - { - file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; - file_pos->num_of_file = (uLong)file_pos64.num_of_file; - } - return err; -} - -extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos* file_pos) -{ - unz64_file_pos file_pos64; - - if (file_pos == NULL) - return UNZ_PARAMERROR; - file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; - file_pos64.num_of_file = file_pos->num_of_file; - return unzGoToFilePos64(file,&file_pos64); -} - -extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) -{ - unz64_s* s; - - if (file == NULL || file_pos == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - file_pos->pos_in_zip_directory = s->pos_in_central_dir; - file_pos->num_of_file = s->num_file; - - return UNZ_OK; -} - -extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) -{ - unz64_s* s; - int err; - - if (file == NULL || file_pos == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - - /* jump to the right spot */ - s->pos_in_central_dir = file_pos->pos_in_zip_directory; - s->num_file = file_pos->num_of_file; - - /* set the current file */ - err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal,NULL,0,NULL,0,NULL,0); - /* return results */ - s->current_file_ok = (err == UNZ_OK); - return err; -} - -extern uLong ZEXPORT unzGetOffset(unzFile file) -{ - ZPOS64_T offset64; - - if (file == NULL) - return 0; /* UNZ_PARAMERROR; */ - offset64 = unzGetOffset64(file); - return (uLong)offset64; -} - -extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) -{ - unz64_s* s; - - if (file == NULL) - return 0; /* UNZ_PARAMERROR; */ - s = (unz64_s*)file; - if (!s->current_file_ok) - return 0; - if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) - if (s->num_file == s->gi.number_entry) - return 0; - return s->pos_in_central_dir; -} - -extern int ZEXPORT unzSetOffset(unzFile file, uLong pos) -{ - return unzSetOffset64(file, pos); -} - -extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) -{ - unz64_s* s; - int err; - - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - s->pos_in_central_dir = pos; - s->num_file = s->gi.number_entry; /* hack */ - - err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0); - - s->current_file_ok = (err == UNZ_OK); - return err; -} - -extern z_off_t ZEXPORT unztell(unzFile file) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (s->pfile_in_zip_read == NULL) - return UNZ_PARAMERROR; - return (z_off_t)s->pfile_in_zip_read->stream.total_out; -} - -extern ZPOS64_T ZEXPORT unztell64(unzFile file) -{ - unz64_s* s; - if (file == NULL) - return (ZPOS64_T)-1; - s = (unz64_s*)file; - if (s->pfile_in_zip_read == NULL) - return (ZPOS64_T)-1; - return s->pfile_in_zip_read->total_out_64; -} - -extern int ZEXPORT unzseek(unzFile file, z_off_t offset, int origin) -{ - return unzseek64(file, (ZPOS64_T)offset, origin); -} - -extern int ZEXPORT unzseek64(unzFile file, ZPOS64_T offset, int origin) -{ - unz64_s* s; - ZPOS64_T stream_pos_begin; - ZPOS64_T stream_pos_end; - int isWithinBuffer; - ZPOS64_T position; - - if (file == NULL) - return UNZ_PARAMERROR; - - s = (unz64_s*)file; - - if (s->pfile_in_zip_read == NULL) - return UNZ_ERRNO; - if (s->pfile_in_zip_read->compression_method != 0) - return UNZ_ERRNO; - - if (origin == SEEK_SET) - position = offset; - else if (origin == SEEK_CUR) - position = s->pfile_in_zip_read->total_out_64 + offset; - else if (origin == SEEK_END) - position = s->cur_file_info.compressed_size + offset; - else - return UNZ_PARAMERROR; - - if (position > s->cur_file_info.compressed_size) - return UNZ_PARAMERROR; - - stream_pos_end = s->pfile_in_zip_read->pos_in_zipfile; - stream_pos_begin = stream_pos_end; - - if (stream_pos_begin > UNZ_BUFSIZE) - stream_pos_begin -= UNZ_BUFSIZE; - else - stream_pos_begin = 0; - - isWithinBuffer = s->pfile_in_zip_read->stream.avail_in != 0 && - (s->pfile_in_zip_read->rest_read_compressed != 0 || s->cur_file_info.compressed_size < UNZ_BUFSIZE) && - position >= stream_pos_begin && position < stream_pos_end; - - if (isWithinBuffer) - { - s->pfile_in_zip_read->stream.next_in += position - s->pfile_in_zip_read->total_out_64; - s->pfile_in_zip_read->stream.avail_in = (uInt)(stream_pos_end - position); - } - else - { - s->pfile_in_zip_read->stream.avail_in = 0; - s->pfile_in_zip_read->stream.next_in = 0; - - s->pfile_in_zip_read->pos_in_zipfile = s->pfile_in_zip_read->offset_local_extrafield + position; - s->pfile_in_zip_read->rest_read_compressed = s->cur_file_info.compressed_size - position; - } - - s->pfile_in_zip_read->rest_read_uncompressed -= (position - s->pfile_in_zip_read->total_out_64); - s->pfile_in_zip_read->stream.total_out = (uLong)position; - s->pfile_in_zip_read->total_out_64 = position; - - return UNZ_OK; -} - -extern int ZEXPORT unzeof(unzFile file) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (s->pfile_in_zip_read == NULL) - return UNZ_PARAMERROR; - if (s->pfile_in_zip_read->rest_read_uncompressed == 0) - return 1; - return 0; -} - -// turn the warnings back on -#pragma GCC diagnostic pop diff --git a/include/minizip/unzip.h b/include/minizip/unzip.h deleted file mode 100644 index 7c03fe9..0000000 --- a/include/minizip/unzip.h +++ /dev/null @@ -1,320 +0,0 @@ -/* unzip.h -- IO for uncompress .zip files using zlib - Version 1.1, February 14h, 2010 - part of the MiniZip project - - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - Modifications of Unzip for Zip64 - Copyright (C) 2007-2008 Even Rouault - Modifications for Zip64 support on both zip and unzip - Copyright (C) 2009-2010 Mathias Svensson - http://result42.com - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef _UNZ_H -#define _UNZ_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include -#endif - -#ifndef _ZLIBIOAPI_H -#include "ioapi.h" -#endif - -#ifdef HAVE_BZIP2 -#include "bzlib.h" -#endif - -#define Z_BZIP2ED 12 - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ { int unused; } unzFile__; -typedef unzFile__ *unzFile; -#else -typedef voidp unzFile; -#endif - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (Z_ERRNO) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) - -/* tm_unz contain date/time info */ -typedef struct tm_unz_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_unz; - -/* unz_global_info structure contain global data about the ZIPfile - These data comes from the end of central dir */ -typedef struct unz_global_info64_s -{ - ZPOS64_T number_entry; /* total number of entries in the central dir on this disk */ - uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info64; - -typedef struct unz_global_info_s -{ - uLong number_entry; /* total number of entries in the central dir on this disk */ - uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info; - -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_info64_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - ZPOS64_T compressed_size; /* compressed size 8 bytes */ - ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; - ZPOS64_T disk_offset; - uLong size_file_extra_internal; -} unz_file_info64; - -typedef struct unz_file_info_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - uLong compressed_size; /* compressed size 4 bytes */ - uLong uncompressed_size; /* uncompressed size 4 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; - uLong disk_offset; -} unz_file_info; - -/***************************************************************************/ -/* Opening and close a zip file */ - -extern unzFile ZEXPORT unzOpen OF((const char *path)); -extern unzFile ZEXPORT unzOpen64 OF((const void *path)); -/* Open a Zip file. - - path should contain the full pathname (by example, on a Windows XP computer - "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". - return NULL if zipfile cannot be opened or doesn't exist - return unzFile handle if no error - - NOTE: The "64" function take a const void* pointer, because the path is just the value passed to the - open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path - is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* does not describe the reality */ - -extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def)); -/* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write operations */ -extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, zlib_filefunc64_def* pzlib_filefunc_def)); -/* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write 64-bit operations */ - -extern int ZEXPORT unzClose OF((unzFile file)); -/* Close a ZipFile opened with unzOpen. If there is files inside the .Zip opened with unzOpenCurrentFile, - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - - return UNZ_OK if there is no error */ - -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); -extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, unz_global_info64 *pglobal_info)); -/* Write info about the ZipFile in the *pglobal_info structure. - - return UNZ_OK if no error */ - -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *comment, uLong comment_size)); -/* Get the global comment string of the ZipFile, in the comment buffer. - - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 */ - -/***************************************************************************/ -/* Reading the content of the current zipfile, you can open it, read data from it, and close it - (you can close it before reading all the file) */ - -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); -/* Open for reading data the current file in the zipfile. - - return UNZ_OK if no error */ - -extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password)); -/* Open for reading data the current file in the zipfile. - password is a crypting password - - return UNZ_OK if no error */ - -extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw)); -/* Same as unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 *method will receive method of compression, *level will receive level of compression - - NOTE: you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL */ - -extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password)); -/* Same as unzOpenCurrentFile, but takes extra parameter password for encrypted files */ - -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); -/* Read bytes from the current file (opened by unzOpenCurrentFile) - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)); -extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)); -/* Get Info about the current file - - pfile_info if != NULL, the *pfile_info structure will contain somes info about the current file - filename if != NULL, the file name string will be copied in filename - filename_size is the size of the filename buffer - extrafield if != NULL, the extra field information from the central header will be copied in to - extrafield_size is the size of the extraField buffer - comment if != NULL, the comment string of the file will be copied in to - comment_size is the size of the comment buffer */ - -extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); - -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); -/* Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf == NULL, it return the size of the local extra field - if buf != NULL, len is the size of the buffer, the extra header is copied in buf. - - return number of bytes copied in buf, or (if <0) the error code */ - -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); -/* Close the file in zip opened with unzOpenCurrentFile - - return UNZ_CRCERROR if all the file was read but the CRC is not good */ - -/***************************************************************************/ -/* Browse the directory of the zipfile */ - -typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2); -typedef int (*unzIteratorFunction)(unzFile file); -typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size); - -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); -/* Set the current file of the zipfile to the first file. - - return UNZ_OK if no error */ - -extern int ZEXPORT unzGoToFirstFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)); -/* Set the current file of the zipfile to the first file and retrieves the current info on success. - Not as seek intensive as unzGoToFirstFile + unzGetCurrentFileInfo. - - return UNZ_OK if no error */ - -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); -/* Set the current file of the zipfile to the next file. - - return UNZ_OK if no error - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */ - -extern int ZEXPORT unzGoToNextFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)); -/* Set the current file of the zipfile to the next file and retrieves the current - info on success. Does less seeking around than unzGotoNextFile + unzGetCurrentFileInfo. - - return UNZ_OK if no error - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */ - -extern int ZEXPORT unzLocateFile OF((unzFile file, const char *filename, unzFileNameComparer filename_compare_func)); -/* Try locate the file szFileName in the zipfile. For custom filename comparison pass in comparison function. - - return UNZ_OK if the file is found (it becomes the current file) - return UNZ_END_OF_LIST_OF_FILE if the file is not found */ - -/***************************************************************************/ -/* Raw access to zip file */ - -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; /* offset in zip file directory */ - uLong num_of_file; /* # of file */ -} unz_file_pos; - -extern int ZEXPORT unzGetFilePos OF((unzFile file, unz_file_pos* file_pos)); -extern int ZEXPORT unzGoToFilePos OF((unzFile file, unz_file_pos* file_pos)); - -typedef struct unz64_file_pos_s -{ - ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ - ZPOS64_T num_of_file; /* # of file */ -} unz64_file_pos; - -extern int ZEXPORT unzGetFilePos64 OF((unzFile file, unz64_file_pos* file_pos)); -extern int ZEXPORT unzGoToFilePos64 OF((unzFile file, const unz64_file_pos* file_pos)); - -extern uLong ZEXPORT unzGetOffset OF((unzFile file)); -extern ZPOS64_T ZEXPORT unzGetOffset64 OF((unzFile file)); -/* Get the current file offset */ - -extern int ZEXPORT unzSetOffset OF((unzFile file, uLong pos)); -extern int ZEXPORT unzSetOffset64 OF((unzFile file, ZPOS64_T pos)); -/* Set the current file offset */ - -extern z_off_t ZEXPORT unztell OF((unzFile file)); -extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); -/* return current position in uncompressed data */ - -extern int ZEXPORT unzseek OF((unzFile file, z_off_t offset, int origin)); -extern int ZEXPORT unzseek64 OF((unzFile file, ZPOS64_T offset, int origin)); -/* Seek within the uncompressed data if compression method is storage */ - -extern int ZEXPORT unzeof OF((unzFile file)); -/* return 1 if the end of file was reached, 0 elsewhere */ - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif /* _UNZ_H */ diff --git a/include/minizip/zip.c b/include/minizip/zip.c deleted file mode 100644 index 83bedb2..0000000 --- a/include/minizip/zip.c +++ /dev/null @@ -1,2029 +0,0 @@ -/* zip.c -- IO on .zip files using zlib - Version 1.1, February 14h, 2010 - part of the MiniZip project - - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - Modifications for Zip64 support - Copyright (C) 2009-2010 Mathias Svensson - http://result42.com - Modifications for AES, PKWARE disk spanning - Copyright (C) 2010-2014 Nathan Moinvaziri - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -// save diagnostic state -#pragma GCC diagnostic push - -// turn off the specific warning. Can also use "-Wall" -#pragma GCC diagnostic ignored "-Wtype-limits" - -#include -#include -#include -#include -#include "zlib.h" -#include "zip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - -#ifdef HAVE_AES -# define AES_METHOD (99) -# define AES_PWVERIFYSIZE (2) -# define AES_AUTHCODESIZE (10) -# define AES_MAXSALTLENGTH (16) -# define AES_VERSION (0x0001) -# define AES_ENCRYPTIONMODE (0x03) - -# include "aes/aes.h" -# include "aes/fileenc.h" -# include "aes/prng.h" -# include "aes/entropy.h" -#endif - -#ifndef NOCRYPT -# define INCLUDECRYPTINGCODE_IFCRYPTALLOWED -# include "crypt.h" -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -#define SIZEDATA_INDATABLOCK (4096-(4*4)) - -#define DISKHEADERMAGIC (0x08074b50) -#define LOCALHEADERMAGIC (0x04034b50) -#define CENTRALHEADERMAGIC (0x02014b50) -#define ENDHEADERMAGIC (0x06054b50) -#define ZIP64ENDHEADERMAGIC (0x06064b50) -#define ZIP64ENDLOCHEADERMAGIC (0x07064b50) - -#define FLAG_LOCALHEADER_OFFSET (0x06) -#define CRC_LOCALHEADER_OFFSET (0x0e) - -#define SIZECENTRALHEADER (0x2e) /* 46 */ -#define SIZECENTRALHEADERLOCATOR (0x14) /* 20 */ -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) - -#ifndef BUFREADCOMMENT -# define BUFREADCOMMENT (0x400) -#endif -#ifndef VERSIONMADEBY -# define VERSIONMADEBY (0x0) /* platform dependent */ -#endif - -#ifndef Z_BUFSIZE -# define Z_BUFSIZE (64*1024) -#endif -#ifndef Z_MAXFILENAMEINZIP -# define Z_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -/* NOT sure that this work on ALL platform */ -#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32)) - -#ifndef DEF_MEM_LEVEL -# if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -# else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -# endif -#endif - -const char zip_copyright[] = " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - -typedef struct linkedlist_datablock_internal_s -{ - struct linkedlist_datablock_internal_s* next_datablock; - uLong avail_in_this_block; - uLong filled_in_this_block; - uLong unused; /* for future use and alignment */ - unsigned char data[SIZEDATA_INDATABLOCK]; -} linkedlist_datablock_internal; - -typedef struct linkedlist_data_s -{ - linkedlist_datablock_internal* first_block; - linkedlist_datablock_internal* last_block; -} linkedlist_data; - -typedef struct -{ - z_stream stream; /* zLib stream structure for inflate */ -#ifdef HAVE_BZIP2 - bz_stream bstream; /* bzLib stream structure for bziped */ -#endif -#ifdef HAVE_AES - fcrypt_ctx aes_ctx; - prng_ctx aes_rng[1]; -#endif - int stream_initialised; /* 1 is stream is initialized */ - uInt pos_in_buffered_data; /* last written byte in buffered_data */ - - ZPOS64_T pos_local_header; /* offset of the local header of the file currently writing */ - char* central_header; /* central header data for the current file */ - uLong size_centralextra; - uLong size_centralheader; /* size of the central header for cur file */ - uLong size_centralextrafree; /* Extra bytes allocated to the central header but that are not used */ - uLong size_comment; - uLong flag; /* flag of the file currently writing */ - - int method; /* compression method written to file.*/ - int compression_method; /* compression method to use */ - int raw; /* 1 for directly writing raw data */ - Byte buffered_data[Z_BUFSIZE]; /* buffer contain compressed data to be writ*/ - uLong dosDate; - uLong crc32; - int zip64; /* Add ZIP64 extended information in the extra field */ - uLong number_disk; /* number of current disk used for spanning ZIP */ - ZPOS64_T pos_zip64extrainfo; - ZPOS64_T total_compressed; - ZPOS64_T total_uncompressed; -#ifndef NOCRYPT - unsigned long keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned long* pcrc_32_tab; - int crypt_header_size; -#endif -} curfile64_info; - -typedef struct -{ - zlib_filefunc64_32_def z_filefunc; - voidpf filestream; /* io structure of the zipfile */ - voidpf filestream_with_CD; /* io structure of the zipfile with the central dir */ - linkedlist_data central_dir; /* datablock with central dir in construction*/ - int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ - int append; /* append mode */ - curfile64_info ci; /* info on the file currently writing */ - - ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ - ZPOS64_T add_position_when_writting_offset; - ZPOS64_T number_entry; - ZPOS64_T disk_size; /* size of each disk */ - uLong number_disk; /* number of the current disk, used for spanning ZIP */ - uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP */ -#ifndef NO_ADDFILEINEXISTINGZIP - char *globalcomment; -#endif -} zip64_internal; - -/* Allocate a new data block */ -local linkedlist_datablock_internal* allocate_new_datablock OF(()); -local linkedlist_datablock_internal* allocate_new_datablock() -{ - linkedlist_datablock_internal* ldi; - - ldi = (linkedlist_datablock_internal*)ALLOC(sizeof(linkedlist_datablock_internal)); - - if (ldi != NULL) - { - ldi->next_datablock = NULL; - ldi->filled_in_this_block = 0; - ldi->avail_in_this_block = SIZEDATA_INDATABLOCK; - } - return ldi; -} - -/* Free data block in linked list */ -local void free_datablock OF((linkedlist_datablock_internal* ldi)); -local void free_datablock(linkedlist_datablock_internal* ldi) -{ - while (ldi != NULL) - { - linkedlist_datablock_internal* ldinext = ldi->next_datablock; - TRYFREE(ldi); - ldi = ldinext; - } -} - -/* Initialize linked list */ -local void init_linkedlist OF((linkedlist_data* ll)); -local void init_linkedlist(linkedlist_data* ll) -{ - ll->first_block = ll->last_block = NULL; -} - -/* Free entire linked list and all data blocks */ -local void free_linkedlist OF((linkedlist_data* ll)); -local void free_linkedlist(linkedlist_data* ll) -{ - free_datablock(ll->first_block); - ll->first_block = ll->last_block = NULL; -} - -/* Add data to linked list data block */ -local int add_data_in_datablock OF((linkedlist_data* ll, const void* buf, uLong len)); -local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) -{ - linkedlist_datablock_internal* ldi; - const unsigned char* from_copy; - - if (ll == NULL) - return ZIP_INTERNALERROR; - - if (ll->last_block == NULL) - { - ll->first_block = ll->last_block = allocate_new_datablock(); - if (ll->first_block == NULL) - return ZIP_INTERNALERROR; - } - - ldi = ll->last_block; - from_copy = (unsigned char*)buf; - - while (len>0) - { - uInt copy_this; - uInt i; - unsigned char* to_copy; - - if (ldi->avail_in_this_block == 0) - { - ldi->next_datablock = allocate_new_datablock(); - if (ldi->next_datablock == NULL) - return ZIP_INTERNALERROR; - ldi = ldi->next_datablock ; - ll->last_block = ldi; - } - - if (ldi->avail_in_this_block < len) - copy_this = (uInt)ldi->avail_in_this_block; - else - copy_this = (uInt)len; - - to_copy = &(ldi->data[ldi->filled_in_this_block]); - - for (i=0;ifilled_in_this_block += copy_this; - ldi->avail_in_this_block -= copy_this; - from_copy += copy_this ; - len -= copy_this; - } - return ZIP_OK; -} - -local uLong zip64local_TmzDateToDosDate OF((const tm_zip* ptm)); -local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) -{ - uLong year; -#define zip64local_in_range(min, max, value) ((min) <= (value) && (value) <= (max)) - /* Years supported: - * [00, 79] (assumed to be between 2000 and 2079) - * [80, 207] (assumed to be between 1980 and 2107, typical output of old - software that does 'year-1900' to get a double digit year) - * [1980, 2107] - Due to the date format limitations, only years between 1980 and 2107 can be stored. - */ - if (!(zip64local_in_range(1980, 2107, ptm->tm_year) || zip64local_in_range(0, 207, ptm->tm_year)) || - !zip64local_in_range(0, 11, ptm->tm_mon) || - !zip64local_in_range(1, 31, ptm->tm_mday) || - !zip64local_in_range(0, 23, ptm->tm_hour) || - !zip64local_in_range(0, 59, ptm->tm_min) || - !zip64local_in_range(0, 59, ptm->tm_sec)) - return 0; -#undef zip64local_in_range - - year = (uLong)ptm->tm_year; - if (year >= 1980) /* range [1980, 2107] */ - year -= 1980; - else if (year >= 80) /* range [80, 99] */ - year -= 80; - else /* range [00, 79] */ - year += 20; - - return - (uLong)(((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | - ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); -} - -/* Inputs a long in LSB order to the given file: nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) */ -local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - ZPOS64_T x, int nbByte)); -local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - ZPOS64_T x, int nbByte) -{ - unsigned char buf[8]; - int n; - for (n = 0; n < nbByte; n++) - { - buf[n] = (unsigned char)(x & 0xff); - x >>= 8; - } - if (x != 0) - { - /* data overflow - hack for ZIP64 (X Roche) */ - for (n = 0; n < nbByte; n++) - { - buf[n] = 0xff; - } - } - - if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) - return ZIP_ERRNO; - - return ZIP_OK; -} - -local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); -local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) -{ - unsigned char* buf =(unsigned char*)dest; - int n; - for (n = 0; n < nbByte; n++) { - buf[n] = (unsigned char)(x & 0xff); - x >>= 8; - } - - if (x != 0) - { - /* data overflow - hack for ZIP64 */ - for (n = 0; n < nbByte; n++) - { - buf[n] = 0xff; - } - } -} - -local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); -local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) -{ - unsigned char c; - int err = (int)ZREAD64(*pzlib_filefunc_def, filestream, &c,1); - if (err == 1) - { - *pi = (int)c; - return ZIP_OK; - } - if (ZERROR64(*pzlib_filefunc_def, filestream)) - return ZIP_ERRNO; - return ZIP_EOF; -} - -local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); -local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) -{ - uLong x; - int i = 0; - int err; - - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x = (uLong)i; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((uLong)i) << 8; - - if (err == ZIP_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); -local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) -{ - uLong x; - int i = 0; - int err; - - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x = (uLong)i; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((uLong)i)<<8; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((uLong)i)<<16; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((uLong)i)<<24; - - if (err == ZIP_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); -local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) -{ - ZPOS64_T x; - int i = 0; - int err; - - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x = (ZPOS64_T)i; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((ZPOS64_T)i)<<8; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((ZPOS64_T)i)<<16; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((ZPOS64_T)i)<<24; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((ZPOS64_T)i)<<32; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((ZPOS64_T)i)<<40; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((ZPOS64_T)i)<<48; - if (err == ZIP_OK) - err = zip64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((ZPOS64_T)i)<<56; - - if (err == ZIP_OK) - *pX = x; - else - *pX = 0; - - return err; -} - -/* Gets the amount of bytes left to write to the current disk for spanning archives */ -local int zipGetDiskSizeAvailable OF((zipFile file, ZPOS64_T *size_available)); -local int zipGetDiskSizeAvailable(zipFile file, ZPOS64_T *size_available) -{ - zip64_internal* zi; - ZPOS64_T current_disk_size; - - zi = (zip64_internal*)file; - ZSEEK64(zi->z_filefunc, zi->filestream, 0, ZLIB_FILEFUNC_SEEK_END); - current_disk_size = ZTELL64(zi->z_filefunc, zi->filestream); - *size_available = zi->disk_size - current_disk_size; - return ZIP_OK; -} - -/* Goes to a specific disk number for spanning archives */ -local int zipGoToSpecificDisk OF((zipFile file, int number_disk, int open_existing)); -local int zipGoToSpecificDisk(zipFile file, int number_disk, int open_existing) -{ - zip64_internal* zi; - int err = ZIP_OK; - - zi = (zip64_internal*)file; - if (zi->disk_size == 0) - return err; - - if ((zi->filestream != NULL) && (zi->filestream != zi->filestream_with_CD)) - ZCLOSE64(zi->z_filefunc, zi->filestream); - - zi->filestream = ZOPENDISK64(zi->z_filefunc, zi->filestream_with_CD, number_disk, (open_existing == 1) ? - (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING) : - (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE)); - - if (zi->filestream == NULL) - err = ZIP_ERRNO; - - return err; -} - -/* Goes to the first disk in a spanned archive */ -local int zipGoToFirstDisk OF((zipFile file)); -local int zipGoToFirstDisk(zipFile file) -{ - zip64_internal* zi; - int number_disk_next; - int err = ZIP_OK; - - zi = (zip64_internal*)file; - - if (zi->disk_size == 0) - return err; - number_disk_next = 0; - if (zi->number_disk_with_CD > 0) - number_disk_next = zi->number_disk_with_CD - 1; - err = zipGoToSpecificDisk(file, number_disk_next, (zi->append == APPEND_STATUS_ADDINZIP)); - if ((err == ZIP_ERRNO) && (zi->append == APPEND_STATUS_ADDINZIP)) - err = zipGoToSpecificDisk(file, number_disk_next, 0); - if (err == ZIP_OK) - zi->number_disk = number_disk_next; - ZSEEK64(zi->z_filefunc, zi->filestream, 0, ZLIB_FILEFUNC_SEEK_END); - return err; -} - -/* Goes to the next disk in a spanned archive */ -local int zipGoToNextDisk OF((zipFile file)); -local int zipGoToNextDisk(zipFile file) -{ - zip64_internal* zi; - ZPOS64_T size_available_in_disk; - int err = ZIP_OK; - int number_disk_next; - - zi = (zip64_internal*)file; - - if (zi->disk_size == 0) - return err; - - number_disk_next = zi->number_disk + 1; - - do - { - err = zipGoToSpecificDisk(file, number_disk_next, (zi->append == APPEND_STATUS_ADDINZIP)); - if ((err == ZIP_ERRNO) && (zi->append == APPEND_STATUS_ADDINZIP)) - err = zipGoToSpecificDisk(file, number_disk_next, 0); - if (err != ZIP_OK) - break; - err = zipGetDiskSizeAvailable(file, &size_available_in_disk); - if (err != ZIP_OK) - break; - zi->number_disk = number_disk_next; - zi->number_disk_with_CD = zi->number_disk + 1; - - number_disk_next += 1; - } - while (size_available_in_disk <= 0); - - return err; -} - -/* Locate the Central directory of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); -local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ - unsigned char* buf; - ZPOS64_T file_size; - ZPOS64_T back_read = 4; - ZPOS64_T max_back=0xffff; /* maximum size of global comment */ - ZPOS64_T pos_found=0; - uLong read_size; - ZPOS64_T read_pos; - int i; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); - if (buf == NULL) - return 0; - - if (ZSEEK64(*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0) - { - TRYFREE(buf); - return 0; - } - - file_size = ZTELL64(*pzlib_filefunc_def, filestream); - - if (max_back > file_size) - max_back = file_size; - - while (back_read < max_back) - { - if (back_read + BUFREADCOMMENT > max_back) - back_read = max_back; - else - back_read += BUFREADCOMMENT; - - read_pos = file_size-back_read; - read_size = ((BUFREADCOMMENT+4) < (file_size-read_pos)) ? - (BUFREADCOMMENT+4) : (uLong)(file_size-read_pos); - - if (ZSEEK64(*pzlib_filefunc_def, filestream, read_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - break; - if (ZREAD64(*pzlib_filefunc_def, filestream, buf, read_size) != read_size) - break; - - for (i = (int)read_size-3; (i--) > 0;) - if ((*(buf+i)) == (ENDHEADERMAGIC & 0xff) && - (*(buf+i+1)) == (ENDHEADERMAGIC >> 8 & 0xff) && - (*(buf+i+2)) == (ENDHEADERMAGIC >> 16 & 0xff) && - (*(buf+i+3)) == (ENDHEADERMAGIC >> 24 & 0xff)) - { - pos_found = read_pos+i; - break; - } - - if (pos_found != 0) - break; - } - TRYFREE(buf); - return pos_found; -} - -/* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - const ZPOS64_T endcentraloffset)); -local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - const ZPOS64_T endcentraloffset) -{ - ZPOS64_T offset; - uLong uL; - - /* Zip64 end of central directory locator */ - if (ZSEEK64(*pzlib_filefunc_def, filestream, endcentraloffset - SIZECENTRALHEADERLOCATOR, ZLIB_FILEFUNC_SEEK_SET) != 0) - return 0; - - /* read locator signature */ - if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK) - return 0; - if (uL != ZIP64ENDLOCHEADERMAGIC) - return 0; - /* number of the disk with the start of the zip64 end of central directory */ - if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK) - return 0; - /* relative offset of the zip64 end of central directory record */ - if (zip64local_getLong64(pzlib_filefunc_def, filestream, &offset) != ZIP_OK) - return 0; - /* total number of disks */ - if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK) - return 0; - /* Goto end of central directory record */ - if (ZSEEK64(*pzlib_filefunc_def,filestream, offset, ZLIB_FILEFUNC_SEEK_SET) != 0) - return 0; - /* the signature */ - if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK) - return 0; - if (uL != ZIP64ENDHEADERMAGIC) - return 0; - - return offset; -} - -extern zipFile ZEXPORT zipOpen4(const void *pathname, int append, ZPOS64_T disk_size, zipcharpc* globalcomment, - zlib_filefunc64_32_def* pzlib_filefunc64_32_def) -{ - zip64_internal ziinit; - zip64_internal* zi; -#ifndef NO_ADDFILEINEXISTINGZIP - ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/ - ZPOS64_T size_central_dir; /* size of the central directory */ - ZPOS64_T offset_central_dir; /* offset of start of central directory */ - ZPOS64_T number_entry_CD; /* total number of entries in the central dir */ - ZPOS64_T number_entry; - ZPOS64_T central_pos; - ZPOS64_T size_central_dir_to_read; - uLong uL; - uLong size_comment; - size_t buf_size = SIZEDATA_INDATABLOCK; - void* buf_read; -#endif - int err = ZIP_OK; - int mode; - - ziinit.z_filefunc.zseek32_file = NULL; - ziinit.z_filefunc.ztell32_file = NULL; - if (pzlib_filefunc64_32_def == NULL) - fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); - else - ziinit.z_filefunc = *pzlib_filefunc64_32_def; - - if (append == APPEND_STATUS_CREATE) - mode = (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE); - else - mode = (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING); - - ziinit.filestream = ZOPEN64(ziinit.z_filefunc, pathname, mode); - if (ziinit.filestream == NULL) - return NULL; - - if (append == APPEND_STATUS_CREATEAFTER) - { - /* Don't support spanning ZIP with APPEND_STATUS_CREATEAFTER */ - if (disk_size > 0) - return NULL; - - ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); - } - - ziinit.filestream_with_CD = ziinit.filestream; - ziinit.append = append; - ziinit.number_disk = 0; - ziinit.number_disk_with_CD = 0; - ziinit.disk_size = disk_size; - ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); - ziinit.in_opened_file_inzip = 0; - ziinit.ci.stream_initialised = 0; - ziinit.number_entry = 0; - ziinit.add_position_when_writting_offset = 0; - init_linkedlist(&(ziinit.central_dir)); - - zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); - if (zi == NULL) - { - ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); - return NULL; - } - -#ifndef NO_ADDFILEINEXISTINGZIP - /* Add file in a zipfile */ - ziinit.globalcomment = NULL; - if (append == APPEND_STATUS_ADDINZIP) - { - /* Read and Cache Central Directory Records */ - central_pos = zip64local_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); - /* disable to allow appending to empty ZIP archive (must be standard zip, not zip64) - if (central_pos == 0) - err = ZIP_ERRNO; - */ - - if (err == ZIP_OK) - { - /* read end of central directory info */ - if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET) != 0) - err = ZIP_ERRNO; - - /* the signature, already checked */ - if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK) - err = ZIP_ERRNO; - /* number of this disk */ - if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk) != ZIP_OK) - err = ZIP_ERRNO; - /* number of the disk with the start of the central directory */ - if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk_with_CD) != ZIP_OK) - err = ZIP_ERRNO; - /* total number of entries in the central dir on this disk */ - number_entry = 0; - if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK) - err = ZIP_ERRNO; - else - number_entry = uL; - /* total number of entries in the central dir */ - number_entry_CD = 0; - if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK) - err = ZIP_ERRNO; - else - number_entry_CD = uL; - if (number_entry_CD!=number_entry) - err = ZIP_BADZIPFILE; - /* size of the central directory */ - size_central_dir = 0; - if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK) - err = ZIP_ERRNO; - else - size_central_dir = uL; - /* offset of start of central directory with respect to the starting disk number */ - offset_central_dir = 0; - if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK) - err = ZIP_ERRNO; - else - offset_central_dir = uL; - /* zipfile global comment length */ - if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &size_comment) != ZIP_OK) - err = ZIP_ERRNO; - - if ((err == ZIP_OK) && ((number_entry_CD == 0xffff) || (offset_central_dir == 0xffffffff))) - { - /* Format should be Zip64, as the central directory or file size is too large */ - central_pos = zip64local_SearchCentralDir64(&ziinit.z_filefunc, ziinit.filestream, central_pos); - - if (central_pos) - { - ZPOS64_T sizeEndOfCentralDirectory; - - if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = ZIP_ERRNO; - - /* the signature, already checked */ - if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK) - err = ZIP_ERRNO; - /* size of zip64 end of central directory record */ - if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &sizeEndOfCentralDirectory) != ZIP_OK) - err = ZIP_ERRNO; - /* version made by */ - if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK) - err = ZIP_ERRNO; - /* version needed to extract */ - if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK) - err = ZIP_ERRNO; - /* number of this disk */ - if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk) != ZIP_OK) - err = ZIP_ERRNO; - /* number of the disk with the start of the central directory */ - if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk_with_CD) != ZIP_OK) - err = ZIP_ERRNO; - /* total number of entries in the central directory on this disk */ - if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &number_entry) != ZIP_OK) - err = ZIP_ERRNO; - /* total number of entries in the central directory */ - if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &number_entry_CD) != ZIP_OK) - err = ZIP_ERRNO; - if (number_entry_CD!=number_entry) - err = ZIP_BADZIPFILE; - /* size of the central directory */ - if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &size_central_dir) != ZIP_OK) - err = ZIP_ERRNO; - /* offset of start of central directory with respect to the starting disk number */ - if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &offset_central_dir) != ZIP_OK) - err = ZIP_ERRNO; - } - else - err = ZIP_BADZIPFILE; - } - } - - if ((err == ZIP_OK) && (central_pos 0) - { - ziinit.globalcomment = (char*)ALLOC(size_comment+1); - if (ziinit.globalcomment) - { - size_comment = ZREAD64(ziinit.z_filefunc, ziinit.filestream, ziinit.globalcomment, size_comment); - ziinit.globalcomment[size_comment] = 0; - } - } - - byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); - ziinit.add_position_when_writting_offset = byte_before_the_zipfile; - - /* Store central directory in memory */ - size_central_dir_to_read = size_central_dir; - buf_size = SIZEDATA_INDATABLOCK; - buf_read = (void*)ALLOC(buf_size); - - if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, - offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = ZIP_ERRNO; - - while ((size_central_dir_to_read > 0) && (err == ZIP_OK)) - { - ZPOS64_T read_this = SIZEDATA_INDATABLOCK; - if (read_this > size_central_dir_to_read) - read_this = size_central_dir_to_read; - - if (ZREAD64(ziinit.z_filefunc, ziinit.filestream, buf_read, (uLong)read_this) != read_this) - err = ZIP_ERRNO; - - if (err == ZIP_OK) - err = add_data_in_datablock(&ziinit.central_dir, buf_read, (uLong)read_this); - - size_central_dir_to_read -= read_this; - } - TRYFREE(buf_read); - - ziinit.begin_pos = byte_before_the_zipfile; - ziinit.number_entry = number_entry_CD; - - if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, - offset_central_dir+byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = ZIP_ERRNO; - } - - if (globalcomment) - *globalcomment = ziinit.globalcomment; -#endif - - if (err != ZIP_OK) - { -#ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(ziinit.globalcomment); -#endif - TRYFREE(zi); - return NULL; - } - - *zi = ziinit; - zipGoToFirstDisk((zipFile)zi); - return(zipFile)zi; -} - -extern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcharpc* globalcomment, - zlib_filefunc_def* pzlib_filefunc32_def) -{ - if (pzlib_filefunc32_def != NULL) - { - zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; - fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); - return zipOpen4(pathname, append, 0, globalcomment, &zlib_filefunc64_32_def_fill); - } - return zipOpen4(pathname, append, 0, globalcomment, NULL); -} - -extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc* globalcomment, - zlib_filefunc64_def* pzlib_filefunc_def) -{ - if (pzlib_filefunc_def != NULL) - { - zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; - zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; - zlib_filefunc64_32_def_fill.ztell32_file = NULL; - zlib_filefunc64_32_def_fill.zseek32_file = NULL; - return zipOpen4(pathname, append, 0, globalcomment, &zlib_filefunc64_32_def_fill); - } - return zipOpen4(pathname, append, 0, globalcomment, NULL); -} - -extern zipFile ZEXPORT zipOpen3(const char *pathname, int append, ZPOS64_T disk_size, zipcharpc* globalcomment, - zlib_filefunc_def* pzlib_filefunc32_def) -{ - if (pzlib_filefunc32_def != NULL) - { - zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; - fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); - return zipOpen4(pathname, append, disk_size, globalcomment, &zlib_filefunc64_32_def_fill); - } - return zipOpen4(pathname, append, disk_size, globalcomment, NULL); -} - -extern zipFile ZEXPORT zipOpen3_64(const void *pathname, int append, ZPOS64_T disk_size, zipcharpc* globalcomment, - zlib_filefunc64_def* pzlib_filefunc_def) -{ - if (pzlib_filefunc_def != NULL) - { - zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; - zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; - zlib_filefunc64_32_def_fill.ztell32_file = NULL; - zlib_filefunc64_32_def_fill.zseek32_file = NULL; - return zipOpen4(pathname, append, disk_size, globalcomment, &zlib_filefunc64_32_def_fill); - } - return zipOpen4(pathname, append, disk_size, globalcomment, NULL); -} - -extern zipFile ZEXPORT zipOpen(const char* pathname, int append) -{ - return zipOpen3((const void*)pathname,append,0,NULL,NULL); -} - -extern zipFile ZEXPORT zipOpen64(const void* pathname, int append) -{ - return zipOpen3(pathname,append,0,NULL,NULL); -} - -extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, - int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase, int zip64) -{ - zip64_internal* zi; - uInt size_filename; - uInt size_comment = 0; - uInt i; - int err = ZIP_OK; - ZPOS64_T size_available; - ZPOS64_T size_needed; - -#ifdef NOCRYPT - (crcForCrypting); - if (password != NULL) - return ZIP_PARAMERROR; -#endif - - if (file == NULL) - return ZIP_PARAMERROR; - - if ((method != 0) && -#ifdef HAVE_BZIP2 - (method != Z_BZIP2ED) && -#endif - (method != Z_DEFLATED)) - return ZIP_PARAMERROR; - - zi = (zip64_internal*)file; - - if (zi->in_opened_file_inzip == 1) - { - err = zipCloseFileInZip (file); - if (err != ZIP_OK) - return err; - } - - if (filename == NULL) - filename = "-"; - if (comment != NULL) - size_comment = (uInt)strlen(comment); - - size_filename = (uInt)strlen(filename); - - if (zipfi == NULL) - zi->ci.dosDate = 0; - else - { - if (zipfi->dosDate != 0) - zi->ci.dosDate = zipfi->dosDate; - else - zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date); - } - - zi->ci.method = method; - zi->ci.compression_method = method; - zi->ci.crc32 = 0; - zi->ci.stream_initialised = 0; - zi->ci.pos_in_buffered_data = 0; - zi->ci.raw = raw; - zi->ci.flag = flagBase; - if ((level == 8) || (level == 9)) - zi->ci.flag |= 2; - if (level == 2) - zi->ci.flag |= 4; - if (level == 1) - zi->ci.flag |= 6; - if (password != NULL) - { - zi->ci.flag |= 1; -#ifdef HAVE_AES - zi->ci.method = AES_METHOD; -#endif - } - - if (zi->disk_size > 0) - { - if ((zi->number_disk == 0) && (zi->number_entry == 0)) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)DISKHEADERMAGIC, 4); - - /* Make sure enough space available on current disk for local header */ - zipGetDiskSizeAvailable((zipFile)zi, &size_available); - size_needed = 30 + size_filename + size_extrafield_local; - if (zi->ci.zip64) - size_needed += 20; -#ifdef HAVE_AES - if (zi->ci.method == AES_METHOD) - size_needed += 11; -#endif - if (size_available < size_needed) - zipGoToNextDisk((zipFile)zi); - } - - zi->ci.pos_local_header = ZTELL64(zi->z_filefunc, zi->filestream); - zi->ci.size_comment = size_comment; - zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global; - zi->ci.size_centralextra = size_extrafield_global; - zi->ci.size_centralextrafree = 32; /* Extra space reserved for ZIP64 extra info */ -#ifdef HAVE_AES - if (zi->ci.method == AES_METHOD) - zi->ci.size_centralextrafree += 11; /* Extra space reserved for AES extra info */ -#endif - zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralextrafree + size_comment); - zi->ci.number_disk = zi->number_disk; - - /* Write central directory header */ - zip64local_putValue_inmemory(zi->ci.central_header, (uLong)CENTRALHEADERMAGIC, 4); - zip64local_putValue_inmemory(zi->ci.central_header+4, (uLong)versionMadeBy, 2); - zip64local_putValue_inmemory(zi->ci.central_header+6, (uLong)20, 2); - zip64local_putValue_inmemory(zi->ci.central_header+8, (uLong)zi->ci.flag, 2); - zip64local_putValue_inmemory(zi->ci.central_header+10, (uLong)zi->ci.method, 2); - zip64local_putValue_inmemory(zi->ci.central_header+12, (uLong)zi->ci.dosDate, 4); - zip64local_putValue_inmemory(zi->ci.central_header+16, (uLong)0, 4); /*crc*/ - zip64local_putValue_inmemory(zi->ci.central_header+20, (uLong)0, 4); /*compr size*/ - zip64local_putValue_inmemory(zi->ci.central_header+24, (uLong)0, 4); /*uncompr size*/ - zip64local_putValue_inmemory(zi->ci.central_header+28, (uLong)size_filename, 2); - zip64local_putValue_inmemory(zi->ci.central_header+30, (uLong)size_extrafield_global, 2); - zip64local_putValue_inmemory(zi->ci.central_header+32, (uLong)size_comment, 2); - zip64local_putValue_inmemory(zi->ci.central_header+34, (uLong)zi->ci.number_disk, 2); /*disk nm start*/ - - if (zipfi == NULL) - zip64local_putValue_inmemory(zi->ci.central_header+36, (uLong)0, 2); - else - zip64local_putValue_inmemory(zi->ci.central_header+36, (uLong)zipfi->internal_fa, 2); - if (zipfi == NULL) - zip64local_putValue_inmemory(zi->ci.central_header+38, (uLong)0, 4); - else - zip64local_putValue_inmemory(zi->ci.central_header+38, (uLong)zipfi->external_fa, 4); - if (zi->ci.pos_local_header >= 0xffffffff) - zip64local_putValue_inmemory(zi->ci.central_header+42, (uLong)0xffffffff, 4); - else - zip64local_putValue_inmemory(zi->ci.central_header+42, - (uLong)zi->ci.pos_local_header - zi->add_position_when_writting_offset, 4); - - for (i = 0; i < size_filename; i++) - zi->ci.central_header[SIZECENTRALHEADER+i] = filename[i]; - for (i = 0; i < size_extrafield_global; i++) - zi->ci.central_header[SIZECENTRALHEADER+size_filename+i] = - ((const char*)extrafield_global)[i]; - /* Store comment at the end for later repositioning */ - for (i = 0; i < size_comment; i++) - zi->ci.central_header[zi->ci.size_centralheader+ - zi->ci.size_centralextrafree+i] = comment[i]; - - if (zi->ci.central_header == NULL) - return ZIP_INTERNALERROR; - - zi->ci.zip64 = zip64; - zi->ci.total_compressed = 0; - zi->ci.total_uncompressed = 0; - zi->ci.pos_zip64extrainfo = 0; - - /* Write the local header */ - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)LOCALHEADERMAGIC, 4); - - if (err == ZIP_OK) - { - if (zi->ci.zip64) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2); /* version needed to extract */ - else - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)20, 2); /* version needed to extract */ - } - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.flag, 2); - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.method, 2); - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.dosDate, 4); - - /* CRC & compressed size & uncompressed size will be filled in later and rewritten later */ - - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4); /* crc 32, unknown */ - if (err == ZIP_OK) - { - if (zi->ci.zip64) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4); /* compressed size, unknown */ - else - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4); /* compressed size, unknown */ - } - if (err == ZIP_OK) - { - if (zi->ci.zip64) /* uncompressed size, unknown */ - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4); - else /* uncompressed size, unknown */ - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4); - } - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_filename, 2); - if (err == ZIP_OK) - { - ZPOS64_T size_extrafield = size_extrafield_local; - if (zi->ci.zip64) - size_extrafield += 20; -#ifdef HAVE_AES - if (zi->ci.method == AES_METHOD) - size_extrafield += 11; -#endif - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_extrafield,2); - } - if ((err == ZIP_OK) && (size_filename > 0)) - { - if (ZWRITE64(zi->z_filefunc, zi->filestream, filename, size_filename) != size_filename) - err = ZIP_ERRNO; - } - if ((err == ZIP_OK) && (size_extrafield_local > 0)) - { - if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local) - err = ZIP_ERRNO; - } - - /* Write the Zip64 extended info */ - if ((err == ZIP_OK) && (zi->ci.zip64)) - { - short headerid = 1; - short datasize = 16; - ZPOS64_T compressed_size = 0; - ZPOS64_T uncompressed_size = 0; - - /* Remember position of Zip64 extended info for the local file header. - (needed when we update size after done with file) */ - zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc, zi->filestream); - - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)headerid, 2); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)datasize, 2); - - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)uncompressed_size, 8); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)compressed_size, 8); - } -#ifdef HAVE_AES - /* Write the AES extended info */ - if ((err == ZIP_OK) && (zi->ci.method == AES_METHOD)) - { - int headerid = 0x9901; - short datasize = 7; - - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, headerid, 2); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, datasize, 2); - - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, AES_VERSION, 2); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, 'A', 1); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, 'E', 1); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, AES_ENCRYPTIONMODE, 1); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->ci.compression_method, 2); - } -#endif - -#ifdef HAVE_BZIP2 - zi->ci.bstream.avail_in = (uInt)0; - zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; - zi->ci.bstream.total_in_hi32 = 0; - zi->ci.bstream.total_in_lo32 = 0; - zi->ci.bstream.total_out_hi32 = 0; - zi->ci.bstream.total_out_lo32 = 0; -#endif - - zi->ci.stream.avail_in = (uInt)0; - zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - zi->ci.stream.total_in = 0; - zi->ci.stream.total_out = 0; - zi->ci.stream.data_type = Z_BINARY; - - if ((err == ZIP_OK) && (!zi->ci.raw)) - { - if (method == Z_DEFLATED) - { - zi->ci.stream.zalloc = (alloc_func)0; - zi->ci.stream.zfree = (free_func)0; - zi->ci.stream.opaque = (voidpf)zi; - - if (windowBits > 0) - windowBits = -windowBits; - - err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); - - if (err == Z_OK) - zi->ci.stream_initialised = Z_DEFLATED; - } - else if (method == Z_BZIP2ED) - { -#ifdef HAVE_BZIP2 - zi->ci.bstream.bzalloc = 0; - zi->ci.bstream.bzfree = 0; - zi->ci.bstream.opaque = (voidpf)0; - - err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0, 35); - if (err == BZ_OK) - zi->ci.stream_initialised = Z_BZIP2ED; -#endif - } - } - -#ifndef NOCRYPT - zi->ci.crypt_header_size = 0; - if ((err == Z_OK) && ((zi->ci.flag & 1) != 0)) - { -#ifdef HAVE_AES - if (zi->ci.method == AES_METHOD) - { - unsigned char passverify[AES_PWVERIFYSIZE]; - unsigned char saltvalue[AES_MAXSALTLENGTH]; - uInt saltlength; - - if ((AES_ENCRYPTIONMODE < 1) || (AES_ENCRYPTIONMODE > 3)) - return Z_ERRNO; - - saltlength = SALT_LENGTH(AES_ENCRYPTIONMODE); - - prng_init(entropy_fun, zi->ci.aes_rng); - prng_rand(saltvalue, saltlength, zi->ci.aes_rng); - prng_end(zi->ci.aes_rng); - - fcrypt_init(AES_ENCRYPTIONMODE, password, strlen(password), saltvalue, passverify, &zi->ci.aes_ctx); - - if (ZWRITE64(zi->z_filefunc, zi->filestream, saltvalue, saltlength) != saltlength) - err = ZIP_ERRNO; - if (ZWRITE64(zi->z_filefunc, zi->filestream, passverify, AES_PWVERIFYSIZE) != AES_PWVERIFYSIZE) - err = ZIP_ERRNO; - - zi->ci.crypt_header_size = saltlength + AES_PWVERIFYSIZE + AES_AUTHCODESIZE; - } - else -#endif - { - unsigned char bufHead[RAND_HEAD_LEN]; - unsigned int sizeHead; - - zi->ci.pcrc_32_tab = (const unsigned long *)get_crc_table(); - /*init_keys(password, zi->ci.keys, zi->ci.pcrc_32_tab);*/ - - sizeHead = crypthead(password, bufHead, RAND_HEAD_LEN, zi->ci.keys, zi->ci.pcrc_32_tab, crcForCrypting); - zi->ci.crypt_header_size = sizeHead; - - if (ZWRITE64(zi->z_filefunc, zi->filestream, bufHead, sizeHead) != sizeHead) - err = ZIP_ERRNO; - } - } -#endif - - if (err == Z_OK) - zi->in_opened_file_inzip = 1; - return err; -} - -extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, - int memLevel, int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel, - strategy, password, crcForCrypting, versionMadeBy, flagBase, 0); -} - -extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, - int memLevel, int strategy, const char* password, uLong crcForCrypting) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel, - strategy, password, crcForCrypting, VERSIONMADEBY, 0, 0); -} - -extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, - int memLevel, int strategy, const char* password, uLong crcForCrypting, int zip64) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel, strategy, - password, crcForCrypting, VERSIONMADEBY, 0, zip64); -} - -extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0); -} - -extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int zip64) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64); -} - -extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void*extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int zip64) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64); -} - -extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void*extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0); -} - -/* Flushes the write buffer to disk */ -local int zip64FlushWriteBuffer OF((zip64_internal* zi)); -local int zip64FlushWriteBuffer(zip64_internal* zi) -{ - int err = ZIP_OK; - uInt written = 0; - uInt total_written = 0; - uInt write = 0; - uInt max_write = 0; - ZPOS64_T size_available = 0; - - if ((zi->ci.flag & 1) != 0) - { -#ifndef NOCRYPT -#ifdef HAVE_AES - if (zi->ci.method == AES_METHOD) - { - fcrypt_encrypt(zi->ci.buffered_data, zi->ci.pos_in_buffered_data, &zi->ci.aes_ctx); - } - else -#endif - { - uInt i; - int t; - for (i = 0;i < zi->ci.pos_in_buffered_data; i++) - zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); - } -#endif - } - - write = zi->ci.pos_in_buffered_data; - - do - { - max_write = write; - - if (zi->disk_size > 0) - { - err = zipGetDiskSizeAvailable((zipFile)zi, &size_available); - if (err != ZIP_OK) - return err; - - if (size_available == 0) - { - err = zipGoToNextDisk((zipFile)zi); - if (err != ZIP_OK) - return err; - } - - if (size_available < (ZPOS64_T)max_write) - max_write = (uInt)size_available; - } - - written = ZWRITE64(zi->z_filefunc, zi->filestream, zi->ci.buffered_data + total_written, max_write); - - if (ZERROR64(zi->z_filefunc, zi->filestream)) - { - err = ZIP_ERRNO; - break; - } - - total_written += written; - write -= written; - } - while (write > 0); - - zi->ci.total_compressed += zi->ci.pos_in_buffered_data; - -#ifdef HAVE_BZIP2 - if (zi->ci.compression_method == Z_BZIP2ED) - { - zi->ci.total_uncompressed += zi->ci.bstream.total_in_lo32; - zi->ci.bstream.total_in_lo32 = 0; - zi->ci.bstream.total_in_hi32 = 0; - } - else -#endif - { - zi->ci.total_uncompressed += zi->ci.stream.total_in; - zi->ci.stream.total_in = 0; - } - - zi->ci.pos_in_buffered_data = 0; - - return err; -} - -extern int ZEXPORT zipWriteInFileInZip(zipFile file,const void* buf,unsigned int len) -{ - zip64_internal* zi; - int err = ZIP_OK; - - if (file == NULL) - return ZIP_PARAMERROR; - zi = (zip64_internal*)file; - - if (zi->in_opened_file_inzip == 0) - return ZIP_PARAMERROR; - - zi->ci.crc32 = crc32(zi->ci.crc32, buf, (uInt)len); - -#ifdef HAVE_BZIP2 - if ((zi->ci.compression_method == Z_BZIP2ED) && (!zi->ci.raw)) - { - zi->ci.bstream.next_in = (void*)buf; - zi->ci.bstream.avail_in = len; - err = BZ_RUN_OK; - - while ((err == BZ_RUN_OK) && (zi->ci.bstream.avail_in > 0)) - { - if (zi->ci.bstream.avail_out == 0) - { - if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) - err = ZIP_ERRNO; - zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; - } - else - { - uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32; - uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32; - - err = BZ2_bzCompress(&zi->ci.bstream, BZ_RUN); - - zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo); - } - } - - if (err == BZ_RUN_OK) - err = ZIP_OK; - } - else -#endif - { - zi->ci.stream.next_in = (Bytef*)buf; - zi->ci.stream.avail_in = len; - - while ((err == ZIP_OK) && (zi->ci.stream.avail_in > 0)) - { - if (zi->ci.stream.avail_out == 0) - { - if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) - err = ZIP_ERRNO; - zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - } - - if (err != ZIP_OK) - break; - - if ((zi->ci.compression_method == Z_DEFLATED) && (!zi->ci.raw)) - { - uLong total_out_before = zi->ci.stream.total_out; - err = deflate(&zi->ci.stream, Z_NO_FLUSH); - zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - total_out_before); - } - else - { - uInt copy_this,i; - if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) - copy_this = zi->ci.stream.avail_in; - else - copy_this = zi->ci.stream.avail_out; - - for (i = 0; i < copy_this; i++) - *(((char*)zi->ci.stream.next_out)+i) = - *(((const char*)zi->ci.stream.next_in)+i); - - zi->ci.stream.avail_in -= copy_this; - zi->ci.stream.avail_out -= copy_this; - zi->ci.stream.next_in += copy_this; - zi->ci.stream.next_out += copy_this; - zi->ci.stream.total_in += copy_this; - zi->ci.stream.total_out += copy_this; - zi->ci.pos_in_buffered_data += copy_this; - } - } - } - - return err; -} - -extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32) -{ - return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); -} - -extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_size, uLong crc32) -{ - zip64_internal* zi; - ZPOS64_T compressed_size; - uLong invalidValue = 0xffffffff; - uLong i = 0; - short datasize = 0; - int err = ZIP_OK; - - if (file == NULL) - return ZIP_PARAMERROR; - zi = (zip64_internal*)file; - - if (zi->in_opened_file_inzip == 0) - return ZIP_PARAMERROR; - zi->ci.stream.avail_in = 0; - - if (!zi->ci.raw) - { - if (zi->ci.compression_method == Z_DEFLATED) - { - while (err == ZIP_OK) - { - uLong total_out_before; - if (zi->ci.stream.avail_out == 0) - { - if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) - err = ZIP_ERRNO; - zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - } - total_out_before = zi->ci.stream.total_out; - err = deflate(&zi->ci.stream, Z_FINISH); - zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - total_out_before); - } - } - else if (zi->ci.compression_method == Z_BZIP2ED) - { -#ifdef HAVE_BZIP2 - err = BZ_FINISH_OK; - while (err == BZ_FINISH_OK) - { - uLong total_out_before; - if (zi->ci.bstream.avail_out == 0) - { - if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) - err = ZIP_ERRNO; - zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; - } - total_out_before = zi->ci.bstream.total_out_lo32; - err = BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH); - if (err == BZ_STREAM_END) - err = Z_STREAM_END; - zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - total_out_before); - } - - if (err == BZ_FINISH_OK) - err = ZIP_OK; -#endif - } - } - - if (err == Z_STREAM_END) - err = ZIP_OK; /* this is normal */ - - if ((zi->ci.pos_in_buffered_data>0) && (err == ZIP_OK)) - { - if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) - err = ZIP_ERRNO; - } - -#ifdef HAVE_AES - if (zi->ci.method == AES_METHOD) - { - unsigned char authcode[AES_AUTHCODESIZE]; - - fcrypt_end(authcode, &zi->ci.aes_ctx); - - if (ZWRITE64(zi->z_filefunc, zi->filestream, authcode, AES_AUTHCODESIZE) != AES_AUTHCODESIZE) - err = ZIP_ERRNO; - } -#endif - - if (!zi->ci.raw) - { - if (zi->ci.compression_method == Z_DEFLATED) - { - int tmp_err = deflateEnd(&zi->ci.stream); - if (err == ZIP_OK) - err = tmp_err; - zi->ci.stream_initialised = 0; - } -#ifdef HAVE_BZIP2 - else if (zi->ci.compression_method == Z_BZIP2ED) - { - int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream); - if (err == ZIP_OK) - err = tmperr; - zi->ci.stream_initialised = 0; - } -#endif - - crc32 = (uLong)zi->ci.crc32; - uncompressed_size = zi->ci.total_uncompressed; - } - - compressed_size = zi->ci.total_compressed; -#ifndef NOCRYPT - compressed_size += zi->ci.crypt_header_size; -#endif - - /* Update current item crc and sizes */ - if (compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) - { - zip64local_putValue_inmemory(zi->ci.central_header+4, (uLong)45, 2); /* version made by */ - zip64local_putValue_inmemory(zi->ci.central_header+6, (uLong)45, 2); /* version needed */ - } - zip64local_putValue_inmemory(zi->ci.central_header+16, crc32, 4); /* crc */ - if (compressed_size >= 0xffffffff) - zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue, 4); /* compr size */ - else - zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size, 4); /* compr size */ - if (zi->ci.stream.data_type == Z_ASCII) - zip64local_putValue_inmemory(zi->ci.central_header+36, (uLong)Z_ASCII, 2); /* internal file attrib */ - if (uncompressed_size >= 0xffffffff) - zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue, 4); /* uncompr size */ - else - zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size, 4); /* uncompr size */ - - /* Add ZIP64 extra info field for uncompressed size */ - if (uncompressed_size >= 0xffffffff) - datasize += 8; - /* Add ZIP64 extra info field for compressed size */ - if (compressed_size >= 0xffffffff) - datasize += 8; - /* Add ZIP64 extra info field for relative offset to local file header of current file */ - if (zi->ci.pos_local_header >= 0xffffffff) - datasize += 8; - - /* Add Extra Information Header for 'ZIP64 information' */ - if (datasize > 0) - { - char* p = zi->ci.central_header + zi->ci.size_centralheader; - - if ((uLong)(datasize + 4) > zi->ci.size_centralextrafree) - return ZIP_BADZIPFILE; - - zip64local_putValue_inmemory(p, 0x0001, 2); - p += 2; - zip64local_putValue_inmemory(p, datasize, 2); - p += 2; - - if (uncompressed_size >= 0xffffffff) - { - zip64local_putValue_inmemory(p, uncompressed_size, 8); - p += 8; - } - if (compressed_size >= 0xffffffff) - { - zip64local_putValue_inmemory(p, compressed_size, 8); - p += 8; - } - if (zi->ci.pos_local_header >= 0xffffffff) - { - zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8); - p += 8; - } - - zi->ci.size_centralextrafree -= datasize + 4; - zi->ci.size_centralheader += datasize + 4; - zi->ci.size_centralextra += datasize + 4; - - zip64local_putValue_inmemory(zi->ci.central_header+30, (uLong)zi->ci.size_centralextra, 2); - } - -#ifdef HAVE_AES - /* Write the AES extended info */ - if (zi->ci.method == AES_METHOD) - { - char* p = zi->ci.central_header + zi->ci.size_centralheader; - - datasize = 7; - - if ((uLong)(datasize + 4) > zi->ci.size_centralextrafree) - return ZIP_BADZIPFILE; - - zip64local_putValue_inmemory(p, 0x9901, 2); - p += 2; - zip64local_putValue_inmemory(p, datasize, 2); - p += 2; - zip64local_putValue_inmemory(p, AES_VERSION, 2); - p += 2; - zip64local_putValue_inmemory(p, 'A', 1); - p += 1; - zip64local_putValue_inmemory(p, 'E', 1); - p += 1; - zip64local_putValue_inmemory(p, AES_ENCRYPTIONMODE, 1); - p += 1; - zip64local_putValue_inmemory(p, zi->ci.compression_method, 2); - p += 2; - - zi->ci.size_centralextrafree -= datasize + 4; - zi->ci.size_centralheader += datasize + 4; - zi->ci.size_centralextra += datasize + 4; - - zip64local_putValue_inmemory(zi->ci.central_header+30, (uLong)zi->ci.size_centralextra, 2); - } -#endif - /* Restore comment to correct position */ - for (i = 0; i < zi->ci.size_comment; i++) - zi->ci.central_header[zi->ci.size_centralheader+i] = - zi->ci.central_header[zi->ci.size_centralheader+zi->ci.size_centralextrafree+i]; - zi->ci.size_centralheader += zi->ci.size_comment; - - if (err == ZIP_OK) - err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader); - - free(zi->ci.central_header); - - if (err == ZIP_OK) - { - /* Update the LocalFileHeader with the new values. */ - ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream); - uLong cur_number_disk = zi->number_disk; - - /* Local file header is stored on previous disk, switch to make edits */ - if (zi->ci.number_disk != cur_number_disk) - err = zipGoToSpecificDisk(file, zi->ci.number_disk, 1); - - if (ZSEEK64(zi->z_filefunc, zi->filestream, zi->ci.pos_local_header + 14, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = ZIP_ERRNO; - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream,crc32,4); /* crc 32, unknown */ - - if (uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff) - { - if (zi->ci.pos_zip64extrainfo > 0) - { - /* Update the size in the ZIP64 extended field. */ - if (ZSEEK64(zi->z_filefunc, zi->filestream, zi->ci.pos_zip64extrainfo + 4, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = ZIP_ERRNO; - - if (err == ZIP_OK) /* compressed size, unknown */ - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8); - if (err == ZIP_OK) /* uncompressed size, unknown */ - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8); - } - else - err = ZIP_BADZIPFILE; /* Caller passed zip64 = 0, so no room for zip64 info -> fatal */ - } - else - { - if (err == ZIP_OK) /* compressed size, unknown */ - err = zip64local_putValue(&zi->z_filefunc, zi->filestream,compressed_size, 4); - if (err == ZIP_OK) /* uncompressed size, unknown */ - err = zip64local_putValue(&zi->z_filefunc, zi->filestream,uncompressed_size, 4); - } - - /* Now switch back again to the disk we were on before */ - if (zi->ci.number_disk != cur_number_disk) - err = zipGoToSpecificDisk(file, cur_number_disk, 1); - - if (ZSEEK64(zi->z_filefunc, zi->filestream, cur_pos_inzip, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = ZIP_ERRNO; - } - - zi->number_entry++; - zi->in_opened_file_inzip = 0; - - return err; -} - -extern int ZEXPORT zipCloseFileInZip(zipFile file) -{ - return zipCloseFileInZipRaw(file, 0, 0); -} - -extern int ZEXPORT zipClose(zipFile file, const char* global_comment) -{ - zip64_internal* zi; - int err = 0; - uLong size_centraldir = 0; - uInt size_global_comment = 0; - ZPOS64_T centraldir_pos_inzip; - ZPOS64_T pos = 0; - uLong write = 0; - - if (file == NULL) - return ZIP_PARAMERROR; - - zi = (zip64_internal*)file; - - if (zi->in_opened_file_inzip == 1) - err = zipCloseFileInZip(file); - -#ifndef NO_ADDFILEINEXISTINGZIP - if (global_comment == NULL) - global_comment = zi->globalcomment; -#endif - - if (zi->filestream != zi->filestream_with_CD) - { - if (ZCLOSE64(zi->z_filefunc, zi->filestream) != 0) - if (err == ZIP_OK) - err = ZIP_ERRNO; - if (zi->disk_size > 0) - zi->number_disk_with_CD = zi->number_disk + 1; - zi->filestream = zi->filestream_with_CD; - } - - centraldir_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream); - - if (err == ZIP_OK) - { - linkedlist_datablock_internal* ldi = zi->central_dir.first_block; - while (ldi!= NULL) - { - if ((err == ZIP_OK) && (ldi->filled_in_this_block > 0)) - { - write = ZWRITE64(zi->z_filefunc, zi->filestream, ldi->data, ldi->filled_in_this_block); - if (write != ldi->filled_in_this_block) - err = ZIP_ERRNO; - } - - size_centraldir += ldi->filled_in_this_block; - ldi = ldi->next_datablock; - } - } - - free_linkedlist(&(zi->central_dir)); - - pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; - - /* Write the ZIP64 central directory header */ - if (pos >= 0xffffffff || zi->number_entry > 0xffff) - { - ZPOS64_T zip64eocd_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream); - uLong zip64datasize = 44; - - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDHEADERMAGIC, 4); - - /* size of this 'zip64 end of central directory' */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)zip64datasize, 8); - /* version made by */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2); - /* version needed */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2); - /* number of this disk */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4); - /* number of the disk with the start of the central directory */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4); - /* total number of entries in the central dir on this disk */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); - /* total number of entries in the central dir */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); - /* size of the central directory */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)size_centraldir, 8); - - if (err == ZIP_OK) - { - /* offset of start of central directory with respect to the starting disk number */ - ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)pos, 8); - } - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDLOCHEADERMAGIC, 4); - - /* number of the disk with the start of the central directory */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4); - /*relative offset to the Zip64EndOfCentralDirectory */ - if (err == ZIP_OK) - { - ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writting_offset; - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, pos, 8); - } - /* number of the disk with the start of the central directory */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD+1, 4); - } - - /* Write the central directory header */ - - /* signature */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ENDHEADERMAGIC, 4); - /* number of this disk */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 2); - /* number of the disk with the start of the central directory */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 2); - /* total number of entries in the central dir on this disk */ - if (err == ZIP_OK) - { - if (zi->number_entry >= 0xffff) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2); /* use value in ZIP64 record */ - else - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2); - } - /* total number of entries in the central dir */ - if (err == ZIP_OK) - { - if (zi->number_entry >= 0xffff) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2); /* use value in ZIP64 record */ - else - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2); - } - /* size of the central directory */ - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_centraldir,4); - /* offset of start of central directory with respect to the starting disk number */ - if (err == ZIP_OK) - { - ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; - if (pos >= 0xffffffff) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffffffff, 4); - else - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)pos, 4); - } - - /* Write global comment */ - - if (global_comment != NULL) - size_global_comment = (uInt)strlen(global_comment); - if (err == ZIP_OK) - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_global_comment, 2); - if (err == ZIP_OK && size_global_comment > 0) - { - if (ZWRITE64(zi->z_filefunc, zi->filestream, global_comment, size_global_comment) != size_global_comment) - err = ZIP_ERRNO; - } - - if ((ZCLOSE64(zi->z_filefunc, zi->filestream) != 0) && (err == ZIP_OK)) - err = ZIP_ERRNO; - -#ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(zi->globalcomment); -#endif - TRYFREE(zi); - - return err; -} - -#pragma GCC diagnostic pop \ No newline at end of file diff --git a/include/minizip/zip.h b/include/minizip/zip.h deleted file mode 100644 index 3f3a30b..0000000 --- a/include/minizip/zip.h +++ /dev/null @@ -1,200 +0,0 @@ -/* zip.h -- IO on .zip files using zlib - Version 1.1, February 14h, 2010 - part of the MiniZip project - - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - Modifications for Zip64 support - Copyright (C) 2009-2010 Mathias Svensson - http://result42.com - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef _ZIP_H -#define _ZIP_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -# include "zlib.h" -#endif - -#ifndef _ZLIBIOAPI_H -# include "ioapi.h" -#endif - -#ifdef HAVE_BZIP2 -# include "bzlib.h" -#endif - -#define Z_BZIP2ED 12 - -#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagzipFile__ { int unused; } zipFile__; -typedef zipFile__ *zipFile; -#else -typedef voidp zipFile; -#endif - -#define ZIP_OK (0) -#define ZIP_EOF (0) -#define ZIP_ERRNO (Z_ERRNO) -#define ZIP_PARAMERROR (-102) -#define ZIP_BADZIPFILE (-103) -#define ZIP_INTERNALERROR (-104) - -#ifndef DEF_MEM_LEVEL -# if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -# else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -# endif -#endif -/* default memLevel */ - -/* tm_zip contain date/time info */ -typedef struct tm_zip_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_zip; - -typedef struct -{ - tm_zip tmz_date; /* date in understandable format */ - uLong dosDate; /* if dos_date == 0, tmu_date is used */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ -} zip_fileinfo; - -typedef const char* zipcharpc; - -#define APPEND_STATUS_CREATE (0) -#define APPEND_STATUS_CREATEAFTER (1) -#define APPEND_STATUS_ADDINZIP (2) - -/***************************************************************************/ -/* Writing a zip file */ - -extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); -extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); -/* Create a zipfile. - - pathname should contain the full pathname (by example, on a Windows XP computer - "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". - - return NULL if zipfile cannot be opened - return zipFile handle if no error - - If the file pathname exist and append == APPEND_STATUS_CREATEAFTER, the zip - will be created at the end of the file. (useful if the file contain a self extractor code) - If the file pathname exist and append == APPEND_STATUS_ADDINZIP, we will add files in existing - zip (be sure you don't add file that doesn't exist) - - NOTE: There is no delete function into a zipfile. If you want delete file into a zipfile, - you must open a zipfile, and create another. Of course, you can use RAW reading and writing to copy - the file you did not want delete. */ - -extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, int append, zipcharpc* globalcomment, - zlib_filefunc_def* pzlib_filefunc_def)); - -extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, int append, zipcharpc* globalcomment, - zlib_filefunc64_def* pzlib_filefunc_def)); - -extern zipFile ZEXPORT zipOpen3 OF((const char *pathname, int append, ZPOS64_T disk_size, - zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc_def)); -/* Same as zipOpen2 but allows specification of spanned zip size */ - -extern zipFile ZEXPORT zipOpen3_64 OF((const void *pathname, int append, ZPOS64_T disk_size, - zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def)); - -extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level)); -/* Open a file in the ZIP for writing. - - filename : the filename in zip (if NULL, '-' without quote will be used - *zipfi contain supplemental information - extrafield_local buffer to store the local header extra field data, can be NULL - size_extrafield_local size of extrafield_local buffer - extrafield_global buffer to store the global header extra field data, can be NULL - size_extrafield_global size of extrafield_local buffer - comment buffer for comment string - method contain the compression method (0 for store, Z_DEFLATED for deflate) - level contain the level of compression (can be Z_DEFAULT_COMPRESSION) - zip64 is set to 1 if a zip64 extended information block should be added to the local file header. - this MUST be '1' if the uncompressed size is >= 0xffffffff. */ - -extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int zip64)); -/* Same as zipOpenNewFileInZip with zip64 support */ - -extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw)); -/* Same as zipOpenNewFileInZip, except if raw=1, we write raw file */ - -extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int zip64)); -/* Same as zipOpenNewFileInZip3 with zip64 support */ - -extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, - int strategy, const char* password, uLong crcForCrypting)); -/* Same as zipOpenNewFileInZip2, except - windowBits, memLevel, strategy : see parameter strategy in deflateInit2 - password : crypting password (NULL for no crypting) - crcForCrypting : crc of file to compress (needed for crypting) */ - -extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, - int strategy, const char* password, uLong crcForCrypting, int zip64)); -/* Same as zipOpenNewFileInZip3 with zip64 support */ - -extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, - int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase)); -/* Same as zipOpenNewFileInZip3 except versionMadeBy & flag fields */ - -extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, - uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, - int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase, int zip64)); -/* Same as zipOpenNewFileInZip4 with zip64 support */ - -extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, const void* buf, unsigned len)); -/* Write data in the zipfile */ - -extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); -/* Close the current file in the zipfile */ - -extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, uLong uncompressed_size, uLong crc32)); -extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, ZPOS64_T uncompressed_size, uLong crc32)); -/* Close the current file in the zipfile, for file opened with parameter raw=1 in zipOpenNewFileInZip2 - uncompressed_size and crc32 are value for the uncompressed size */ - -extern int ZEXPORT zipClose OF((zipFile file, const char* global_comment)); -/* Close the zipfile */ - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif /* _ZIP_H */ diff --git a/include/status_bar.h b/include/status_bar.h deleted file mode 100644 index 810acc2..0000000 --- a/include/status_bar.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef NX_SHELL_STATUS_BAR_H -#define NX_SHELL_STATUS_BAR_H - -void StatusBar_DisplayTime(void); - -#endif \ No newline at end of file diff --git a/include/touch_helper.h b/include/touch_helper.h deleted file mode 100644 index b6ee2eb..0000000 --- a/include/touch_helper.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef NX_SHELL_TOUCH_HELPER_H -#define NX_SHELL_TOUCH_HELPER_H - -#include -#include - -#define tapped_inside(touchInfo, x1, y1, x2, y2) (touchInfo.firstTouch.px >= x1 && touchInfo.firstTouch.px <= x2 && touchInfo.firstTouch.py >= y1 && touchInfo.firstTouch.py <= y2) -#define tapped_outside(touchInfo, x1, y1, x2, y2) (touchInfo.firstTouch.px < x1 || touchInfo.firstTouch.px > x2 || touchInfo.firstTouch.py < y1 || touchInfo.firstTouch.py > y2) - -typedef enum TouchState -{ - TouchNone, - TouchStart, - TouchMoving, - TouchEnded -} TouchState; - -typedef enum TapType -{ - TapNone, - TapShort, - TapLong -} TapType; - -typedef struct TouchInfo -{ - TouchState state; - touchPosition firstTouch; - touchPosition prevTouch; - TapType tapType; - u64 touchStart; -} TouchInfo; - -void Touch_Init(TouchInfo * touchInfo); -void Touch_Process(TouchInfo * touchInfo); - -#endif \ No newline at end of file diff --git a/source/BLUnZip.cpp b/source/BLUnZip.cpp deleted file mode 100644 index 1e1a3e6..0000000 --- a/source/BLUnZip.cpp +++ /dev/null @@ -1,300 +0,0 @@ -/* BLUnZip - * C++ class for doing basic zip extraction to strings - * Scott Lawrence yorgle@gmail.com - * - * This code is HEAVILY based on the "minizip" code included with zlib - * also available here: http://www.winimage.com/zLibDll/minizip.html - * - * v1.0 2013-June-05 - Initial release - */ - -/* This code is provided under an MIT license: - -The MIT License (MIT) - -Copyright (c) 2013 Scott Lawrence - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ - - -#include - -extern "C" -{ -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -# include -# include -#else -# include -# include -#endif - - -#include "minizip/zip.h" -#include "minizip/unzip.h" - -#define CASESENSITIVITY (0) -#define WRITEBUFFERSIZE (8192) -#define MAXFILENAME (256) - -#ifdef _WIN32 -#define USEWIN32IOAPI -#include "minizip/iowin32.h" -#endif -} - - -#include "BLUnZip.h" - - -BLUnZip::BLUnZip( std::string _filename ) - : filename( _filename ) - , valid( false ) -{ - // make sure it exists - //if( !ZipFileExists( (char *) _filename.c_str() )) return; - - // open it - this->zf = this->Open( _filename ); //, ZipFlag_Append ); - if( !this->zf ) return; - - // we're AOK - valid = true; -} - -void BLUnZip::Close( void ) -{ - unzClose( this->zf ); - this->zf = NULL; - this->valid = false; -} - -zipFile BLUnZip::Open( std::string zipfilename ) -{ - char filename_try[MAXFILENAME+16] = ""; - zipFile zf = NULL; - - -# ifdef USEWIN32IOAPI - zlib_filefunc64_def ffunc; -# endif - - strncpy(filename_try, zipfilename.c_str(),MAXFILENAME-1); - /* strncpy doesnt append the trailing NULL, of the string is too long. */ - filename_try[ MAXFILENAME ] = '\0'; - -# ifdef USEWIN32IOAPI - fill_win32_filefunc64A(&ffunc); - zf = unzOpen2_64(zipfilename.c_str(),&ffunc); -# else - zf = unzOpen64(zipfilename.c_str()); -# endif - if (zf==NULL) - { - strcat(filename_try,".zip"); -# ifdef USEWIN32IOAPI - zf = unzOpen2_64(filename_try,&ffunc); -# else - zf = unzOpen64(filename_try); -# endif - } - - return zf; - -} - -BLUnZip::~BLUnZip( void ) -{ - this->Close(); -} - - -//////////////////////////////////////////////////////////////////////////////// - -int BLUnZip::ItemCount( void ) -{ - int i = 0; - unzGoToFirstFile( zf ); - - do { - i++; - } while( (unzGoToNextFile( zf )) == UNZ_OK ); - - return i; -} - -void BLUnZip::List( void ) -{ - int i = 0; - - std::cout << "Listing:" << std::endl; - for( i=0 ; iItemCount() ; i++ ) { - std::string n = this->NameOfItem( i ); - long sz = this->SizeOfItem( i ); - - std::cout << " " << i << ": " << n << " " << sz << std::endl; - - } -} - -int BLUnZip::IndexOfItem( std::string itemName ) -{ - int i = 0; - - for( i=0 ; iItemCount() ; i++ ) { - std::string n = this->NameOfItem( i ); - - if( !n.compare( itemName )) return i; - } - return -1; -} - -void BLUnZip::ListOfItems( std::vector& listing ) -{ - unzGoToFirstFile( zf ); - - listing.clear(); - do { - char filename_inzip[256]; - unz_file_info64 file_info; - int err; - - err = unzGetCurrentFileInfo64(zf, &file_info, - filename_inzip,sizeof(filename_inzip), - //buf, bufsz, - NULL,0,NULL,0); - if (err!=UNZ_OK) return; - - std::string s( filename_inzip ); - listing.push_back( s ); - } while( (unzGoToNextFile( zf )) == UNZ_OK ); -} - -std::string BLUnZip::NameOfItem( int idx ) -{ - std::string ret( "" ); - int i = 0; - unzGoToFirstFile( zf ); - - do { - char filename_inzip[256]; - unz_file_info64 file_info; - int err; - - err = unzGetCurrentFileInfo64(zf,&file_info, - filename_inzip,sizeof(filename_inzip), - //buf, bufsz, - NULL,0,NULL,0); - if (err!=UNZ_OK) - { - return ret; - } - if( i == idx ) { - ret.assign( filename_inzip ); - return ret; - } - i++; - } while( (unzGoToNextFile( zf )) == UNZ_OK ); - - return ret; -} - -long BLUnZip::SizeOfItem( int idx ) -{ - int i = 0; - unzGoToFirstFile( this->zf ); - - do { - char filename_inzip[256]; - unz_file_info64 file_info; - int err; - - err = unzGetCurrentFileInfo64(this->zf,&file_info, - filename_inzip,sizeof(filename_inzip), - NULL,0,NULL,0); - if (err!=UNZ_OK) - { - return 0; - } - if( i == idx ) { - return file_info.uncompressed_size; - } - i++; - } while( (unzGoToNextFile( this->zf )) == UNZ_OK ); - - return 0; -} - - -//////////////////////////////////////////////////////////////////////////////// -// get the content to RAM -int BLUnZip::ExtractToRAM( int idx, char * buf, long bufsz, std::string pw ) -{ - const char * password = NULL; // TODO: password! - int i = 0; - int err = 0; - - if( !buf ) return -1; - buf[0] = '\0'; - - if( pw.compare( "" ) ) { - password = pw.c_str(); - } - - unzGoToFirstFile( this->zf ); - - do { - if( i == idx ) { - //err = unzOpenCurrentFile( this->zf ); - err = unzOpenCurrentFilePassword(this->zf,password); - err = unzReadCurrentFile(this->zf,buf,bufsz); - unzCloseCurrentFile( this->zf ); - return err; - } - i++; - } while( (unzGoToNextFile( this->zf )) == UNZ_OK ); - - return 0; -} - -std::string BLUnZip::ExtractToString( int idx, std::string password ) -{ - long sz = this->SizeOfItem( idx ); - if( sz == 0 ) return ""; - - sz++; // for null - sz *= sizeof( char ); - char * buf = (char *)malloc( sz ); - - this->ExtractToRAM( idx, buf, sz, password ); - buf[ sz-1 ] = '\0'; // force. - - std::string ret( buf ); - return ret; -} - diff --git a/source/BLZip.cpp b/source/BLZip.cpp deleted file mode 100644 index 6001c34..0000000 --- a/source/BLZip.cpp +++ /dev/null @@ -1,300 +0,0 @@ -/* BLZip - * C++ class for doing basic zip compression - * Scott Lawrence yorgle@gmail.com - * - * This code is HEAVILY based on the "minizip" code included with zlib - * also available here: http://www.winimage.com/zLibDll/minizip.html - * - * v1.0 2013-June-05 - Initial release - */ - -/* This code is provided under an MIT license: - -The MIT License (MIT) - -Copyright (c) 2013 Scott Lawrence - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ - - -#include - -extern "C" -{ -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -# include -# include -#else -# include -# include -#endif - - -#include "minizip/zip.h" -#include "minizip/unzip.h" - -#define CASESENSITIVITY (0) -#define WRITEBUFFERSIZE (8192) -#define MAXFILENAME (256) - -#ifdef _WIN32 -#define USEWIN32IOAPI -#include "minizip/iowin32.h" -#endif -} - -#include "BLZip.h" - - -BLZip::BLZip( std::string _filename ) - : filename( _filename ) - , valid( false ) -{ - // make sure it exists - //if( !ZipFileExists( (char *) _filename.c_str() )) return; - - // open it - this->zf = this->Open( _filename ); //, ZipFlag_Append ); - if( !this->zf ) return; - - // we're AOK - valid = true; -} - -void BLZip::Close( void ) -{ - zipClose( this->zf, NULL ); - this->zf = NULL; - this->valid = false; -} - - -#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) - #ifndef __USE_FILE_OFFSET64 - #define __USE_FILE_OFFSET64 - #endif - #ifndef __USE_LARGEFILE64 - #define __USE_LARGEFILE64 - #endif - #ifndef _LARGEFILE64_SOURCE - #define _LARGEFILE64_SOURCE - #endif - #ifndef _FILE_OFFSET_BIT - #define _FILE_OFFSET_BIT 64 - #endif -#endif - -#ifdef __APPLE__ -// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions -#define FOPEN_FUNC(filename, mode) fopen(filename, mode) -#define FTELLO_FUNC(stream) ftello(stream) -#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) -#else -#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) -#define FTELLO_FUNC(stream) ftello64(stream) -#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) -#endif - -/* calculate the CRC32 of a file, - because to encrypt a file, we need known the CRC32 of the file before */ -int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) -{ - unsigned long calculate_crc=0; - int err=ZIP_OK; - FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); - - unsigned long size_read = 0; - unsigned long total_read = 0; - if (fin==NULL) - { - err = ZIP_ERRNO; - } - - if (err == ZIP_OK) - do - { - err = ZIP_OK; - size_read = (int)fread(buf,1,size_buf,fin); - if (size_read < size_buf) - if (feof(fin)==0) - { - printf("error in reading %s\n",filenameinzip); - err = ZIP_ERRNO; - } - - if (size_read>0) - calculate_crc = crc32(calculate_crc,(const Bytef *)buf,size_read); - total_read += size_read; - - } while ((err == ZIP_OK) && (size_read>0)); - - if (fin) - fclose(fin); - - *result_crc=calculate_crc; - return err; -} - -int isLargeFile(const char* filename) -{ - int largeFile = 0; - ZPOS64_T pos = 0; - FILE* pFile = FOPEN_FUNC(filename, "rb"); - - if(pFile != NULL) - { - int n = FSEEKO_FUNC(pFile, 0, SEEK_END); - pos = FTELLO_FUNC(pFile); - - if(pos >= 0xffffffff) - largeFile = 1; - - fclose(pFile); - } - - return largeFile; -} - - -zipFile BLZip::Open( std::string zipfilename ) -{ - zipFile zf = NULL; - int fileExists = 0; /*check_exist_file( zipfilename.c_str() ); */ - int creat = 0; - int err = ZIP_OK; - int flags = ZipFlag_Overwrite; - - /* open the zip file for output */ - if( fileExists ) { - creat = (flags & ZipFlag_Overwrite)? APPEND_STATUS_CREATE : APPEND_STATUS_ADDINZIP; - } else { - creat = APPEND_STATUS_CREATE; - } - zf = zipOpen64( zipfilename.c_str(), creat ); - if ( err != ZIP_OK ) return zf; - - return zf; -} - -BLZip::~BLZip( void ) -{ - this->Close(); -} - - - -int BLZip::Add( std::string contentPath, std::string zipPath, int flags ) -{ - int compressLevel = 0; - int zip64 = 0; - char * password = NULL; - zip_fileinfo zi; - FILE * fin = NULL; - int size_read; - int size_buf=0; - void* buf=NULL; - int err; - unsigned long crcFile=0; - - if( !this->zf ) return ZIP_PARAMERROR; - - size_buf = WRITEBUFFERSIZE; - buf = (void*)malloc(size_buf); - if (buf==NULL) - { - printf("Error allocating memory\n"); - return ZIP_INTERNALERROR; - } - - if( !zipPath.compare( "" ) ) { - zipPath.assign( contentPath ); - } - - if( flags & ZipFlag_Faster ) compressLevel = 1; - if( flags & ZipFlag_Better ) compressLevel = 9; - - err = getFileCrc( contentPath.c_str(), buf, size_buf, &crcFile ); - zip64 = isLargeFile( contentPath.c_str() ); - - err = zipOpenNewFileInZip3_64(this->zf,zipPath.c_str(),&zi, - NULL,0,NULL,0,NULL /* comment*/, - (compressLevel != 0) ? Z_DEFLATED : 0, - compressLevel,0, - /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - password,crcFile, zip64); - - if (err != ZIP_OK) - printf("error in opening %s in zipfile\n", contentPath.c_str() ); - else - { - fin = FOPEN_FUNC( (char *)contentPath.c_str(), "rb" ); - if (fin==NULL) - { - err=ZIP_ERRNO; - printf("error in opening %s for reading\n", contentPath.c_str()); - } - } - - if (err == ZIP_OK) - do - { - err = ZIP_OK; - size_read = (int)fread(buf,1,size_buf,fin); - if (size_read < size_buf) - if (feof(fin)==0) - { - printf("error in reading %s\n", contentPath.c_str() ); - err = ZIP_ERRNO; - } - - if (size_read>0) - { - err = zipWriteInFileInZip (this->zf,buf,size_read); - if (err<0) - { - printf("error in writing %s in the zipfile\n", contentPath.c_str() ); - } - - } - } while ((err == ZIP_OK) && (size_read>0)); - - if (fin) - fclose(fin); - - /* and close the file */ - if( err == ZIP_OK ) { - err = zipCloseFileInZip(this->zf); - } - - free( buf ); - - return ZIP_OK; -} - - diff --git a/source/menu_book_reader/BookReader.cpp b/source/BookReader.cpp similarity index 89% rename from source/menu_book_reader/BookReader.cpp rename to source/BookReader.cpp index 9fe7b25..6d6357c 100644 --- a/source/menu_book_reader/BookReader.cpp +++ b/source/BookReader.cpp @@ -3,8 +3,8 @@ extern "C" { #include "SDL_helper.h" -#include "status_bar.h" -#include "common.h" +//#include "status_bar.h" +//#include "common.h" //#include "config.h" } @@ -17,7 +17,8 @@ static inline void FreeTextureIfNeeded(SDL_Texture **texture) { } } -BookReader::BookReader(const char *path) { +BookReader::BookReader(SDL_Renderer *renderer, const char *path) { + RENDERER = renderer; if (ctx == NULL) { ctx = fz_new_context(NULL, NULL, 128 << 10); fz_register_document_handlers(ctx); @@ -29,7 +30,7 @@ BookReader::BookReader(const char *path) { pages_count = fz_count_pages(ctx, doc); SDL_Rect viewport; - SDL_RenderGetViewport(RENDERER, &viewport); + SDL_RenderGetViewport(renderer, &viewport); screen_bounds = fz_make_rect(0, 0, viewport.w, viewport.h); load_page(0); @@ -78,7 +79,7 @@ void BookReader::reset_page() { set_zoom(min_zoom); } -void BookReader::draw() { +void BookReader::draw(SDL_Surface *window_surface, TTF_Font *font) { float w = page_bounds.x1 * zoom, h = page_bounds.y1 * zoom; SDL_Rect rect; @@ -97,14 +98,14 @@ void BookReader::draw() { sprintf(title, "%i/%i, %.2f%%", current_page + 1, pages_count, zoom * 100); int title_width = 0, title_height = 0; - TTF_SizeText(Roboto, title, &title_width, &title_height); + TTF_SizeText(font, title, &title_width, &title_height); SDL_Color color = STATUS_BAR_LIGHT; SDL_DrawRect(RENDERER, 0, 0, 1280, 40, SDL_MakeColour(color.r, color.g, color.b , 128)); - SDL_DrawText(Roboto, (screen_bounds.x1 - title_width) / 2, (44 - title_height) / 2, WHITE, title); + SDL_DrawText(window_surface, font, (screen_bounds.x1 - title_width) / 2, (44 - title_height) / 2, WHITE, title); - StatusBar_DisplayTime(); + //StatusBar_DisplayTime(); } SDL_RenderPresent(RENDERER); diff --git a/source/menu_book_reader/BookReader.hpp b/source/BookReader.hpp similarity index 75% rename from source/menu_book_reader/BookReader.hpp rename to source/BookReader.hpp index 61392f1..20a2266 100644 --- a/source/menu_book_reader/BookReader.hpp +++ b/source/BookReader.hpp @@ -1,13 +1,15 @@ -#ifndef NX_SHELL_BOOK_READER_HPP -#define NX_SHELL_BOOK_READER_HPP +#ifndef EBOOK_READER_BOOK_READER_HPP +#define EBOOK_READER_BOOK_READER_HPP #include +#include +#include struct SDL_Texture; class BookReader { public: - BookReader(const char *path); + BookReader(SDL_Renderer *renderer, const char *path); ~BookReader(); void previous_page(); @@ -19,7 +21,7 @@ public: void move_page_left(); void move_page_right(); void reset_page(); - void draw(); + void draw(SDL_Surface *window_surface, TTF_Font *font); private: void load_page(int num); @@ -34,7 +36,8 @@ private: fz_point page_center = fz_make_point(0, 0); SDL_Texture *page_texture = NULL; - + SDL_Renderer *RENDERER = NULL; + int current_page = -1, pages_count = 0; float min_zoom = 1, max_zoom = 1, zoom = 1; diff --git a/source/SDL_helper.c b/source/SDL_helper.c index 5538a51..6615e39 100644 --- a/source/SDL_helper.c +++ b/source/SDL_helper.c @@ -1,4 +1,3 @@ -#include "common.h" #include "SDL_helper.h" void SDL_ClearScreen(SDL_Renderer *renderer, SDL_Color colour) @@ -11,8 +10,8 @@ void SDL_DrawRect(SDL_Renderer *renderer, int x, int y, int w, int h, SDL_Color { SDL_Rect rect; rect.x = x; rect.y = y; rect.w = w; rect.h = h; - SDL_SetRenderDrawColor(RENDERER, colour.r, colour.g, colour.b, colour.a); - SDL_RenderFillRect(RENDERER, &rect); + SDL_SetRenderDrawColor(renderer, colour.r, colour.g, colour.b, colour.a); + SDL_RenderFillRect(renderer, &rect); } void SDL_DrawCircle(SDL_Renderer *renderer, int x, int y, int r, SDL_Color colour) @@ -21,22 +20,22 @@ void SDL_DrawCircle(SDL_Renderer *renderer, int x, int y, int r, SDL_Color colou return; } -void SDL_DrawText(TTF_Font *font, int x, int y, SDL_Color colour, const char *text) +void SDL_DrawText(SDL_Surface* window_surface, TTF_Font *font, int x, int y, SDL_Color colour, const char *text) { SDL_Surface *surface = TTF_RenderText_Blended_Wrapped(font, text, colour, 1280); SDL_SetSurfaceAlphaMod(surface, colour.a); SDL_Rect position = {x, y, surface->w, surface->h}; - SDL_BlitSurface(surface, NULL, WINDOW_SURFACE, &position); + SDL_BlitSurface(surface, NULL, window_surface, &position); SDL_FreeSurface(surface); } -void SDL_DrawTextf(TTF_Font *font, int x, int y, SDL_Color colour, const char* text, ...) +void SDL_DrawTextf(SDL_Surface* window_surface, TTF_Font *font, int x, int y, SDL_Color colour, const char* text, ...) { char buffer[256]; va_list args; va_start(args, text); vsnprintf(buffer, 256, text, args); - SDL_DrawText(font, x, y, colour, buffer); + SDL_DrawText(window_surface, font, x, y, colour, buffer); va_end(args); } diff --git a/source/fs.c b/source/fs.c deleted file mode 100644 index 89a5f16..0000000 --- a/source/fs.c +++ /dev/null @@ -1,99 +0,0 @@ -#include -#include -#include - -#include "fs.h" - -int FS_MakeDir(const char *path) -{ - if (!path) - return -1; - - return mkdir(path, 0777); -} - -int FS_RecursiveMakeDir(const char * dir) -{ - int ret = 0; - char buf[256]; - char *p = NULL; - size_t len; - - snprintf(buf, sizeof(buf), "%s",dir); - len = strlen(buf); - - if (buf[len - 1] == '/') - buf[len - 1] = 0; - - for (p = buf + 1; *p; p++) - { - if (*p == '/') - { - *p = 0; - - ret = FS_MakeDir(buf); - - *p = '/'; - } - - ret = FS_MakeDir(buf); - } - - return ret; -} - -bool FS_FileExists(const char *path) -{ - FILE *temp = fopen(path, "r"); - - if (temp == NULL) - return false; - - fclose(temp); - return true; -} - -bool FS_DirExists(const char *path) -{ - struct stat info; - - if (stat( path, &info ) != 0) - return false; - else if (info.st_mode & S_IFDIR) - return true; - else - return false; -} - -const char *FS_GetFileExt(const char *filename) -{ - const char *dot = strrchr(filename, '.'); - - if (!dot || dot == filename) - return ""; - - return dot + 1; -} - -char *FS_GetFileModifiedTime(const char *filename) -{ - struct stat attr; - stat(filename, &attr); - - return ctime(&attr.st_mtime); -} - -Result FS_GetFileSize(const char *path, u64 *size) -{ - FsFile file; - Result ret = 0; - - if (R_FAILED(ret = fsFsOpenFile(&fs, path, FS_OPEN_READ, &file))) - return ret; - - if (R_FAILED(ret = fsFileGetSize(&file, size))) - return ret; - - fsFileClose(&file); - return 0; -} diff --git a/source/main.cpp b/source/main.cpp index 8d02fc5..a6feb8f 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,108 +1,73 @@ -#include #include #include -#include #include #include -#include "fs.h" -#include "common.h" +//#include "menu_book_reader.h" -#include "menu_book_reader.h" +int main(int argc, char *argv[]) { + SDL_Event event; + SDL_Window *window; + SDL_Renderer *renderer; + int done = 0; -using namespace std; + //romfsInit(); -static void Term_Services(void) { - - TTF_CloseFont(Roboto_OSK); - TTF_CloseFont(Roboto_small); - TTF_CloseFont(Roboto); - TTF_CloseFont(Roboto_large); - TTF_Quit(); - - Mix_CloseAudio(); - Mix_Quit(); - - IMG_Quit(); - - SDL_DestroyRenderer(RENDERER); - SDL_FreeSurface(WINDOW_SURFACE); - SDL_DestroyWindow(WINDOW); - - //#ifdef DEBUG - socketExit(); - //#endif - - timeExit(); - SDL_Quit(); - romfsExit(); -} - -static void Init_Services(void) { - romfsInit(); - // mandatory at least on switch, else gfx is not properly closed + // mandatory at least on switch, else gfx is not properly closed if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) { SDL_Log("SDL_Init: %s\n", SDL_GetError()); - Term_Services(); + return -1; } - timeInitialize(); - /*#ifdef DEBUG - socketInitializeDefault();*/ - nxlinkStdio(); - //#endif - - printf("Init Services"); - - //SDL_CreateWindowAndRenderer(1280, 720, 0, &WINDOW, &RENDERER); - - WINDOW = SDL_CreateWindow("sdl2_gles2", 0, 0, 1920, 1080, 0); - if (!WINDOW) { + // create an SDL window (OpenGL ES2 always enabled) + // when SDL_FULLSCREEN flag is not set, viewport is automatically handled by SDL (use SDL_SetWindowSize to "change resolution") + // available switch SDL2 video modes : + // 1920 x 1080 @ 32 bpp (SDL_PIXELFORMAT_RGBA8888) + // 1280 x 720 @ 32 bpp (SDL_PIXELFORMAT_RGBA8888) + window = SDL_CreateWindow("sdl2_gles2", 0, 0, 1920, 1080, 0); + if (!window) { SDL_Log("SDL_CreateWindow: %s\n", SDL_GetError()); SDL_Quit(); - Term_Services(); + return -1; } - WINDOW_SURFACE = SDL_GetWindowSurface(WINDOW); - - RENDERER = SDL_CreateRenderer(WINDOW, 0, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); - if (!RENDERER) { + // create a renderer (OpenGL ES2) + renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + if (!renderer) { SDL_Log("SDL_CreateRenderer: %s\n", SDL_GetError()); SDL_Quit(); - Term_Services(); + return -1; } - /*SDL_SetRenderDrawBlendMode(RENDERER, SDL_BLENDMODE_BLEND); + /*TTF_Init(); + TTF_Font *arialUnicode = TTF_OpenFont("RomFs:/arial-unicode-ms.ttf", 30); + if (!arialUnicode) { + SDL_Quit(); + return -1; + }*/ - SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2"); + // open CONTROLLER_PLAYER_1 and CONTROLLER_PLAYER_2 + // when railed, both joycons are mapped to joystick #0, + // else joycons are individually mapped to joystick #0, joystick #1, ... + // https://github.com/devkitPro/SDL/blob/switch-sdl2/src/joystick/switch/SDL_sysjoystick.c#L45 + for (int i = 0; i < 2; i++) { + if (SDL_JoystickOpen(i) == NULL) { + SDL_Log("SDL_JoystickOpen: %s\n", SDL_GetError()); + SDL_Quit(); + return -1; + } + } - IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG); + //Menu_OpenBook("/switch/eBookReader/books/test.epub"); - Mix_Init(MIX_INIT_FLAC | MIX_INIT_MOD | MIX_INIT_MP3 | MIX_INIT_OGG); - Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 4096);*/ + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); - TTF_Init(); - Roboto_large = TTF_OpenFont("romfs:/arial-unicode-ms.tff", 30); - Roboto = TTF_OpenFont("romfs:/arial-unicode-ms.tff", 25); - Roboto_small = TTF_OpenFont("romfs:/arial-unicode-ms.tff", 20); - Roboto_OSK = TTF_OpenFont("romfs:/arial-unicode-ms.tff", 50); - if (!Roboto_large || !Roboto || !Roboto_small || !Roboto_OSK) - Term_Services(); + //TTF_CloseFont(arialUnicode); + //TTF_Quit(); + //romfsExit(); + SDL_Quit(); - FS_RecursiveMakeDir("/switch/eBookReader/"); - FS_RecursiveMakeDir("/switch/eBookReader/books"); + return 0; } - -int main(int argc, char **argv) { - //Init_Services(); - printf("AFTER INIT"); - - /*if (setjmp(exitJmp)) { - Term_Services(); - return 0; - } - - //Menu_OpenBook("/switch/eBookReader/books/test.epub"); - Term_Services();*/ -} \ No newline at end of file diff --git a/source/menu_book_reader/menu_book_reader.cpp b/source/menu_book_reader.cpp similarity index 73% rename from source/menu_book_reader/menu_book_reader.cpp rename to source/menu_book_reader.cpp index 2fdb742..05d13aa 100644 --- a/source/menu_book_reader/menu_book_reader.cpp +++ b/source/menu_book_reader.cpp @@ -1,23 +1,25 @@ extern "C" { #include "menu_book_reader.h" - #include "touch_helper.h" + //#include "touch_helper.h" } #include "BookReader.hpp" +#include +#include -void Menu_OpenBook(char *path) +void Menu_OpenBook(SDL_Renderer *renderer, SDL_Surface* window_surface, TTF_Font *font, char *path) { - BookReader *reader = new BookReader(path); + BookReader *reader = new BookReader(renderer, path); - TouchInfo touchInfo; - Touch_Init(&touchInfo); + /*TouchInfo touchInfo; + Touch_Init(&touchInfo);*/ while(appletMainLoop()) { - reader->draw(); + reader->draw(window_surface, font); hidScanInput(); - Touch_Process(&touchInfo); + //Touch_Process(&touchInfo); u64 kDown = hidKeysDown(CONTROLLER_P1_AUTO); u64 kHeld = hidKeysHeld(CONTROLLER_P1_AUTO); @@ -51,13 +53,13 @@ void Menu_OpenBook(char *path) if (kHeld & KEY_LSTICK_RIGHT) reader->move_page_right(); - if (touchInfo.state == TouchEnded && touchInfo.tapType != TapNone) + /*if (touchInfo.state == TouchEnded && touchInfo.tapType != TapNone) { if (tapped_inside(touchInfo, 0, 0, 120, 720)) reader->previous_page(); else if (tapped_inside(touchInfo, 1160, 0, 1280, 720)) reader->next_page(); - } + }*/ } delete reader; diff --git a/source/menu_book_reader/mupdf-fitz-stream-open.c b/source/menu_book_reader/mupdf-fitz-stream-open.c deleted file mode 100644 index d317509..0000000 --- a/source/menu_book_reader/mupdf-fitz-stream-open.c +++ /dev/null @@ -1,236 +0,0 @@ -#define _LARGEFILE_SOURCE -#ifndef _FILE_OFFSET_BITS -#define _FILE_OFFSET_BITS 64 -#endif - -#include -#include - -#include -#include -#include - -int -fz_file_exists(fz_context *ctx, const char *path) { - FILE *file; -#ifdef _WIN32 - file = fz_fopen_utf8(path, "rb"); -#else - file = fopen(path, "rb"); -#endif - if (file) - fclose(file); - return !!file; -} - -fz_stream * -fz_new_stream(fz_context *ctx, void *state, fz_stream_next_fn *next, fz_stream_drop_fn *drop) { - fz_stream *stm = NULL; - - fz_try(ctx) - { - stm = fz_malloc_struct(ctx, fz_stream); - } - fz_catch(ctx) - { - drop(ctx, state); - fz_rethrow(ctx); - } - - stm->refs = 1; - stm->error = 0; - stm->eof = 0; - stm->pos = 0; - - stm->bits = 0; - stm->avail = 0; - - stm->rp = NULL; - stm->wp = NULL; - - stm->state = state; - stm->next = next; - stm->drop = drop; - stm->seek = NULL; - - return stm; -} - -fz_stream * -fz_keep_stream(fz_context *ctx, fz_stream *stm) { - return fz_keep_imp(ctx, stm, &stm->refs); -} - -void -fz_drop_stream(fz_context *ctx, fz_stream *stm) { - if (fz_drop_imp(ctx, stm, &stm->refs)) - { - if (stm->drop) - stm->drop(ctx, stm->state); - fz_free(ctx, stm); - } -} - -/* File stream */ - -// TODO: WIN32: HANDLE CreateFileW(), etc. -// TODO: POSIX: int creat(), read(), write(), lseeko, etc. - -typedef struct fz_file_stream_s { - FILE *file; - unsigned char buffer[4096]; - char file_name[512]; -} fz_file_stream; - -static int next_file(fz_context *ctx, fz_stream *stm, size_t n) { - fz_file_stream *state = stm->state; - - /* Switch hack: for some reason multiple calls fseek/fread return incorrect part of file, so close/open/fseek */ - if (state->file_name[0]) { - fclose(state->file); - state->file = fopen(state->file_name, "rb"); - fseek(state->file, stm->pos, 0); - } - - /* n is only a hint, that we can safely ignore */ - n = fread(state->buffer, 1, sizeof(state->buffer), state->file); - if (n < sizeof(state->buffer) && ferror(state->file)) - fz_throw(ctx, FZ_ERROR_GENERIC, "read error: %s", strerror(errno)); - stm->rp = state->buffer; - stm->wp = state->buffer + n; - stm->pos += (int64_t)n; - - if (n == 0) - return EOF; - return *stm->rp++; -} - -static void seek_file(fz_context *ctx, fz_stream *stm, int64_t offset, int whence) { - fz_file_stream *state = stm->state; -#ifdef _WIN32 - int64_t n = _fseeki64(state->file, offset, whence); -#else - int64_t n = fseeko(state->file, offset, whence); -#endif - if (n < 0) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot seek: %s", strerror(errno)); -#ifdef _WIN32 - stm->pos = _ftelli64(state->file); -#else - stm->pos = ftello(state->file); -#endif - stm->rp = state->buffer; - stm->wp = state->buffer; -} - -static void drop_file(fz_context *ctx, void *state_) { - fz_file_stream *state = state_; - int n = fclose(state->file); - if (n < 0) - fz_warn(ctx, "close error: %s", strerror(errno)); - fz_free(ctx, state); -} - -static fz_stream * -fz_open_file_ptr(fz_context *ctx, FILE *file, const char* file_name) { - fz_stream *stm; - fz_file_stream *state = fz_malloc_struct(ctx, fz_file_stream); - state->file = file; - strcpy(state->file_name, file_name); - - stm = fz_new_stream(ctx, state, next_file, drop_file); - stm->seek = seek_file; - - return stm; -} - -fz_stream *fz_open_file_ptr_no_close(fz_context *ctx, FILE *file) { - fz_stream *stm = fz_open_file_ptr(ctx, file, 0); - /* We don't own the file ptr. Ensure we don't close it */ - stm->drop = NULL; - return stm; -} - -fz_stream * -fz_open_file(fz_context *ctx, const char *name) { - FILE *file; -#ifdef _WIN32 - file = fz_fopen_utf8(name, "rb"); -#else - file = fopen(name, "rb"); -#endif - if (file == NULL) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open %s: %s", name, strerror(errno)); - return fz_open_file_ptr(ctx, file, name); -} - -#ifdef _WIN32 -fz_stream * -fz_open_file_w(fz_context *ctx, const wchar_t *name) { - FILE *file = _wfopen(name, L"rb"); - if (file == NULL) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open file %ls: %s", name, strerror(errno)); - return fz_open_file_ptr(ctx, file); -} -#endif - -/* Memory stream */ - -static int next_buffer(fz_context *ctx, fz_stream *stm, size_t max) { - return EOF; -} - -static void seek_buffer(fz_context *ctx, fz_stream *stm, int64_t offset, int whence) { - int64_t pos = stm->pos - (stm->wp - stm->rp); - /* Convert to absolute pos */ - if (whence == 1) - { - offset += pos; /* Was relative to current pos */ - } - else if (whence == 2) - { - offset += stm->pos; /* Was relative to end */ - } - - if (offset < 0) - offset = 0; - if (offset > stm->pos) - offset = stm->pos; - stm->rp += (int)(offset - pos); -} - -static void drop_buffer(fz_context *ctx, void *state_) { - fz_buffer *state = (fz_buffer *)state_; - fz_drop_buffer(ctx, state); -} - -fz_stream * -fz_open_buffer(fz_context *ctx, fz_buffer *buf) { - fz_stream *stm; - - fz_keep_buffer(ctx, buf); - stm = fz_new_stream(ctx, buf, next_buffer, drop_buffer); - stm->seek = seek_buffer; - - stm->rp = buf->data; - stm->wp = buf->data + buf->len; - - stm->pos = (int64_t)buf->len; - - return stm; -} - -fz_stream * -fz_open_memory(fz_context *ctx, const unsigned char *data, size_t len) { - fz_stream *stm; - - stm = fz_new_stream(ctx, NULL, next_buffer, NULL); - stm->seek = seek_buffer; - - stm->rp = (unsigned char *)data; - stm->wp = (unsigned char *)data + len; - - stm->pos = (int64_t)len; - - return stm; -} diff --git a/source/status_bar.c b/source/status_bar.c deleted file mode 100644 index 269b211..0000000 --- a/source/status_bar.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include - -#include "common.h" -#include "SDL_helper.h" -#include "status_bar.h" - -static char *Clock_GetCurrentTime(bool _12hour) -{ - static char buffer[10]; - - u64 current_time; - timeGetCurrentTime(TimeType_UserSystemClock, ¤t_time); - struct tm* time_struct = gmtime((const time_t *)¤t_time); - int hours = time_struct->tm_hour; - int minutes = time_struct->tm_min; - int amOrPm = 0; - - if (_12hour) - { - if (hours < 12) - amOrPm = 1; - if (hours == 0) - hours = 12; - else if (hours > 12) - hours = hours - 12; - - if ((hours >= 1) && (hours < 10)) - snprintf(buffer, 10, "%2i:%02i %s", hours, minutes, amOrPm ? "AM" : "PM"); - else - snprintf(buffer, 10, "%2i:%02i %s", hours, minutes, amOrPm ? "AM" : "PM"); - } - - return buffer; -} - -void StatusBar_DisplayTime(void) -{ - int width = 0, height = 0; - TTF_SizeText(Roboto, Clock_GetCurrentTime(true), &width, &height); - - SDL_DrawText(Roboto, 1260 - width, (40 - height)/2, WHITE, Clock_GetCurrentTime(true)); -} \ No newline at end of file