summaryrefslogtreecommitdiff
path: root/contrib/minizip/iowin32.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/minizip/iowin32.c')
-rw-r--r--contrib/minizip/iowin32.c309
1 files changed, 214 insertions, 95 deletions
diff --git a/contrib/minizip/iowin32.c b/contrib/minizip/iowin32.c
index a9b5f78..92b9352 100644
--- a/contrib/minizip/iowin32.c
+++ b/contrib/minizip/iowin32.c
@@ -1,10 +1,14 @@
1/* iowin32.c -- IO base function header for compress/uncompress .zip 1/* iowin32.c -- IO base function header for compress/uncompress .zip
2 files using zlib + zip or unzip API 2 Version 1.1, January 7th, 2010
3 This IO API version uses the Win32 API (for Microsoft Windows) 3 part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
4 4
5 Version 1.01e, February 12th, 2005 5 Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
6
7 Modifications for Zip64 support
8 Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
9
10 For more info read MiniZip_info.txt
6 11
7 Copyright (C) 1998-2005 Gilles Vollant
8*/ 12*/
9 13
10#include <stdlib.h> 14#include <stdlib.h>
@@ -21,40 +25,13 @@
21#define INVALID_SET_FILE_POINTER ((DWORD)-1) 25#define INVALID_SET_FILE_POINTER ((DWORD)-1)
22#endif 26#endif
23 27
24voidpf ZCALLBACK win32_open_file_func OF(( 28voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode));
25 voidpf opaque, 29uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
26 const char* filename, 30uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
27 int mode)); 31ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream));
28 32long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
29uLong ZCALLBACK win32_read_file_func OF(( 33int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream));
30 voidpf opaque, 34int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream));
31 voidpf stream,
32 void* buf,
33 uLong size));
34
35uLong ZCALLBACK win32_write_file_func OF((
36 voidpf opaque,
37 voidpf stream,
38 const void* buf,
39 uLong size));
40
41long ZCALLBACK win32_tell_file_func OF((
42 voidpf opaque,
43 voidpf stream));
44
45long ZCALLBACK win32_seek_file_func OF((
46 voidpf opaque,
47 voidpf stream,
48 uLong offset,
49 int origin));
50
51int ZCALLBACK win32_close_file_func OF((
52 voidpf opaque,
53 voidpf stream));
54
55int ZCALLBACK win32_error_file_func OF((
56 voidpf opaque,
57 voidpf stream));
58 35
59typedef struct 36typedef struct
60{ 37{
@@ -62,69 +39,121 @@ typedef struct
62 int error; 39 int error;
63} WIN32FILE_IOWIN; 40} WIN32FILE_IOWIN;
64 41
65voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
66 voidpf opaque;
67 const char* filename;
68 int mode;
69{
70 const char* mode_fopen = NULL;
71 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
72 HANDLE hFile = 0;
73 voidpf ret=NULL;
74 42
75 dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0; 43static void win32_translate_open_mode(int mode,
44 DWORD* lpdwDesiredAccess,
45 DWORD* lpdwCreationDisposition,
46 DWORD* lpdwShareMode,
47 DWORD* lpdwFlagsAndAttributes)
48{
49 *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0;
76 50
77 if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) 51 if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
78 { 52 {
79 dwDesiredAccess = GENERIC_READ; 53 *lpdwDesiredAccess = GENERIC_READ;
80 dwCreationDisposition = OPEN_EXISTING; 54 *lpdwCreationDisposition = OPEN_EXISTING;
81 dwShareMode = FILE_SHARE_READ; 55 *lpdwShareMode = FILE_SHARE_READ;
82 } 56 }
83 else 57 else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
84 if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
85 { 58 {
86 dwDesiredAccess = GENERIC_WRITE | GENERIC_READ; 59 *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
87 dwCreationDisposition = OPEN_EXISTING; 60 *lpdwCreationDisposition = OPEN_EXISTING;
88 } 61 }
89 else 62 else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
90 if (mode & ZLIB_FILEFUNC_MODE_CREATE)
91 { 63 {
92 dwDesiredAccess = GENERIC_WRITE | GENERIC_READ; 64 *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
93 dwCreationDisposition = CREATE_ALWAYS; 65 *lpdwCreationDisposition = CREATE_ALWAYS;
94 } 66 }
67}
95 68
96 if ((filename!=NULL) && (dwDesiredAccess != 0)) 69static voidpf win32_build_iowin(HANDLE hFile)
97 hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, 70{
98 dwCreationDisposition, dwFlagsAndAttributes, NULL); 71 voidpf ret=NULL;
99
100 if (hFile == INVALID_HANDLE_VALUE)
101 hFile = NULL;
102 72
103 if (hFile != NULL) 73 if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
104 { 74 {
105 WIN32FILE_IOWIN w32fiow; 75 WIN32FILE_IOWIN w32fiow;
106 w32fiow.hf = hFile; 76 w32fiow.hf = hFile;
107 w32fiow.error = 0; 77 w32fiow.error = 0;
108 ret = malloc(sizeof(WIN32FILE_IOWIN)); 78 ret = malloc(sizeof(WIN32FILE_IOWIN));
79
109 if (ret==NULL) 80 if (ret==NULL)
110 CloseHandle(hFile); 81 CloseHandle(hFile);
111 else *((WIN32FILE_IOWIN*)ret) = w32fiow; 82 else
83 *((WIN32FILE_IOWIN*)ret) = w32fiow;
112 } 84 }
113 return ret; 85 return ret;
114} 86}
115 87
88voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode)
89{
90 const char* mode_fopen = NULL;
91 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
92 HANDLE hFile = NULL;
93
94 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
95
96 if ((filename!=NULL) && (dwDesiredAccess != 0))
97 hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
98
99 return win32_build_iowin(hFile);
100}
101
116 102
117uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size) 103voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode)
118 voidpf opaque; 104{
119 voidpf stream; 105 const char* mode_fopen = NULL;
120 void* buf; 106 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
121 uLong size; 107 HANDLE hFile = NULL;
108
109 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
110
111 if ((filename!=NULL) && (dwDesiredAccess != 0))
112 hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
113
114 return win32_build_iowin(hFile);
115}
116
117
118voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode)
119{
120 const char* mode_fopen = NULL;
121 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
122 HANDLE hFile = NULL;
123
124 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
125
126 if ((filename!=NULL) && (dwDesiredAccess != 0))
127 hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
128
129 return win32_build_iowin(hFile);
130}
131
132
133voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode)
134{
135 const char* mode_fopen = NULL;
136 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
137 HANDLE hFile = NULL;
138
139 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
140
141 if ((filename!=NULL) && (dwDesiredAccess != 0))
142 hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
143
144 return win32_build_iowin(hFile);
145}
146
147
148uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size)
122{ 149{
123 uLong ret=0; 150 uLong ret=0;
124 HANDLE hFile = NULL; 151 HANDLE hFile = NULL;
125 if (stream!=NULL) 152 if (stream!=NULL)
126 hFile = ((WIN32FILE_IOWIN*)stream) -> hf; 153 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
154
127 if (hFile != NULL) 155 if (hFile != NULL)
156 {
128 if (!ReadFile(hFile, buf, size, &ret, NULL)) 157 if (!ReadFile(hFile, buf, size, &ret, NULL))
129 { 158 {
130 DWORD dwErr = GetLastError(); 159 DWORD dwErr = GetLastError();
@@ -132,23 +161,21 @@ uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
132 dwErr = 0; 161 dwErr = 0;
133 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; 162 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
134 } 163 }
164 }
135 165
136 return ret; 166 return ret;
137} 167}
138 168
139 169
140uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size) 170uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size)
141 voidpf opaque;
142 voidpf stream;
143 const void* buf;
144 uLong size;
145{ 171{
146 uLong ret=0; 172 uLong ret=0;
147 HANDLE hFile = NULL; 173 HANDLE hFile = NULL;
148 if (stream!=NULL) 174 if (stream!=NULL)
149 hFile = ((WIN32FILE_IOWIN*)stream) -> hf; 175 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
150 176
151 if (hFile !=NULL) 177 if (hFile != NULL)
178 {
152 if (!WriteFile(hFile, buf, size, &ret, NULL)) 179 if (!WriteFile(hFile, buf, size, &ret, NULL))
153 { 180 {
154 DWORD dwErr = GetLastError(); 181 DWORD dwErr = GetLastError();
@@ -156,13 +183,12 @@ uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
156 dwErr = 0; 183 dwErr = 0;
157 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; 184 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
158 } 185 }
186 }
159 187
160 return ret; 188 return ret;
161} 189}
162 190
163long ZCALLBACK win32_tell_file_func (opaque, stream) 191long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream)
164 voidpf opaque;
165 voidpf stream;
166{ 192{
167 long ret=-1; 193 long ret=-1;
168 HANDLE hFile = NULL; 194 HANDLE hFile = NULL;
@@ -183,11 +209,32 @@ long ZCALLBACK win32_tell_file_func (opaque, stream)
183 return ret; 209 return ret;
184} 210}
185 211
186long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin) 212ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream)
187 voidpf opaque; 213{
188 voidpf stream; 214 ZPOS64_T ret= (ZPOS64_T)-1;
189 uLong offset; 215 HANDLE hFile = NULL;
190 int origin; 216 if (stream!=NULL)
217 hFile = ((WIN32FILE_IOWIN*)stream)->hf;
218
219 if (hFile)
220 {
221 LARGE_INTEGER li;
222 li.QuadPart = 0;
223 li.u.LowPart = SetFilePointer(hFile, li.u.LowPart, &li.u.HighPart, FILE_CURRENT);
224 if ( (li.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR))
225 {
226 DWORD dwErr = GetLastError();
227 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
228 ret = (ZPOS64_T)-1;
229 }
230 else
231 ret=li.QuadPart;
232 }
233 return ret;
234}
235
236
237long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin)
191{ 238{
192 DWORD dwMoveMethod=0xFFFFFFFF; 239 DWORD dwMoveMethod=0xFFFFFFFF;
193 HANDLE hFile = NULL; 240 HANDLE hFile = NULL;
@@ -224,9 +271,46 @@ long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
224 return ret; 271 return ret;
225} 272}
226 273
227int ZCALLBACK win32_close_file_func (opaque, stream) 274long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin)
228 voidpf opaque; 275{
229 voidpf stream; 276 DWORD dwMoveMethod=0xFFFFFFFF;
277 HANDLE hFile = NULL;
278 long ret=-1;
279
280 if (stream!=NULL)
281 hFile = ((WIN32FILE_IOWIN*)stream)->hf;
282
283 switch (origin)
284 {
285 case ZLIB_FILEFUNC_SEEK_CUR :
286 dwMoveMethod = FILE_CURRENT;
287 break;
288 case ZLIB_FILEFUNC_SEEK_END :
289 dwMoveMethod = FILE_END;
290 break;
291 case ZLIB_FILEFUNC_SEEK_SET :
292 dwMoveMethod = FILE_BEGIN;
293 break;
294 default: return -1;
295 }
296
297 if (hFile)
298 {
299 LARGE_INTEGER* li = (LARGE_INTEGER*)&offset;
300 DWORD dwSet = SetFilePointer(hFile, li->u.LowPart, &li->u.HighPart, dwMoveMethod);
301 if (dwSet == INVALID_SET_FILE_POINTER)
302 {
303 DWORD dwErr = GetLastError();
304 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
305 ret = -1;
306 }
307 else
308 ret=0;
309 }
310 return ret;
311}
312
313int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream)
230{ 314{
231 int ret=-1; 315 int ret=-1;
232 316
@@ -244,9 +328,7 @@ int ZCALLBACK win32_close_file_func (opaque, stream)
244 return ret; 328 return ret;
245} 329}
246 330
247int ZCALLBACK win32_error_file_func (opaque, stream) 331int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream)
248 voidpf opaque;
249 voidpf stream;
250{ 332{
251 int ret=-1; 333 int ret=-1;
252 if (stream!=NULL) 334 if (stream!=NULL)
@@ -256,8 +338,7 @@ int ZCALLBACK win32_error_file_func (opaque, stream)
256 return ret; 338 return ret;
257} 339}
258 340
259void fill_win32_filefunc (pzlib_filefunc_def) 341void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def)
260 zlib_filefunc_def* pzlib_filefunc_def;
261{ 342{
262 pzlib_filefunc_def->zopen_file = win32_open_file_func; 343 pzlib_filefunc_def->zopen_file = win32_open_file_func;
263 pzlib_filefunc_def->zread_file = win32_read_file_func; 344 pzlib_filefunc_def->zread_file = win32_read_file_func;
@@ -266,5 +347,43 @@ void fill_win32_filefunc (pzlib_filefunc_def)
266 pzlib_filefunc_def->zseek_file = win32_seek_file_func; 347 pzlib_filefunc_def->zseek_file = win32_seek_file_func;
267 pzlib_filefunc_def->zclose_file = win32_close_file_func; 348 pzlib_filefunc_def->zclose_file = win32_close_file_func;
268 pzlib_filefunc_def->zerror_file = win32_error_file_func; 349 pzlib_filefunc_def->zerror_file = win32_error_file_func;
269 pzlib_filefunc_def->opaque=NULL; 350 pzlib_filefunc_def->opaque = NULL;
351}
352
353void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def)
354{
355 pzlib_filefunc_def->zopen64_file = win32_open64_file_func;
356 pzlib_filefunc_def->zread_file = win32_read_file_func;
357 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
358 pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
359 pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
360 pzlib_filefunc_def->zclose_file = win32_close_file_func;
361 pzlib_filefunc_def->zerror_file = win32_error_file_func;
362 pzlib_filefunc_def->opaque = NULL;
363}
364
365
366void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def)
367{
368 pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA;
369 pzlib_filefunc_def->zread_file = win32_read_file_func;
370 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
371 pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
372 pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
373 pzlib_filefunc_def->zclose_file = win32_close_file_func;
374 pzlib_filefunc_def->zerror_file = win32_error_file_func;
375 pzlib_filefunc_def->opaque = NULL;
376}
377
378
379void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def)
380{
381 pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW;
382 pzlib_filefunc_def->zread_file = win32_read_file_func;
383 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
384 pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
385 pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
386 pzlib_filefunc_def->zclose_file = win32_close_file_func;
387 pzlib_filefunc_def->zerror_file = win32_error_file_func;
388 pzlib_filefunc_def->opaque = NULL;
270} 389}