Home | History | Annotate | Line # | Download | only in minizip
iowin32.c revision 1.1
      1  1.1  christos /*	$NetBSD: iowin32.c,v 1.1 2006/01/14 20:10:57 christos Exp $	*/
      2  1.1  christos 
      3  1.1  christos /* iowin32.c -- IO base function header for compress/uncompress .zip
      4  1.1  christos    files using zlib + zip or unzip API
      5  1.1  christos    This IO API version uses the Win32 API (for Microsoft Windows)
      6  1.1  christos 
      7  1.1  christos    Version 1.01e, February 12th, 2005
      8  1.1  christos 
      9  1.1  christos    Copyright (C) 1998-2005 Gilles Vollant
     10  1.1  christos */
     11  1.1  christos 
     12  1.1  christos #include <stdlib.h>
     13  1.1  christos 
     14  1.1  christos #include "zlib.h"
     15  1.1  christos #include "ioapi.h"
     16  1.1  christos #include "iowin32.h"
     17  1.1  christos 
     18  1.1  christos #ifndef INVALID_HANDLE_VALUE
     19  1.1  christos #define INVALID_HANDLE_VALUE (0xFFFFFFFF)
     20  1.1  christos #endif
     21  1.1  christos 
     22  1.1  christos #ifndef INVALID_SET_FILE_POINTER
     23  1.1  christos #define INVALID_SET_FILE_POINTER ((DWORD)-1)
     24  1.1  christos #endif
     25  1.1  christos 
     26  1.1  christos voidpf ZCALLBACK win32_open_file_func OF((
     27  1.1  christos    voidpf opaque,
     28  1.1  christos    const char* filename,
     29  1.1  christos    int mode));
     30  1.1  christos 
     31  1.1  christos uLong ZCALLBACK win32_read_file_func OF((
     32  1.1  christos    voidpf opaque,
     33  1.1  christos    voidpf stream,
     34  1.1  christos    void* buf,
     35  1.1  christos    uLong size));
     36  1.1  christos 
     37  1.1  christos uLong ZCALLBACK win32_write_file_func OF((
     38  1.1  christos    voidpf opaque,
     39  1.1  christos    voidpf stream,
     40  1.1  christos    const void* buf,
     41  1.1  christos    uLong size));
     42  1.1  christos 
     43  1.1  christos long ZCALLBACK win32_tell_file_func OF((
     44  1.1  christos    voidpf opaque,
     45  1.1  christos    voidpf stream));
     46  1.1  christos 
     47  1.1  christos long ZCALLBACK win32_seek_file_func OF((
     48  1.1  christos    voidpf opaque,
     49  1.1  christos    voidpf stream,
     50  1.1  christos    uLong offset,
     51  1.1  christos    int origin));
     52  1.1  christos 
     53  1.1  christos int ZCALLBACK win32_close_file_func OF((
     54  1.1  christos    voidpf opaque,
     55  1.1  christos    voidpf stream));
     56  1.1  christos 
     57  1.1  christos int ZCALLBACK win32_error_file_func OF((
     58  1.1  christos    voidpf opaque,
     59  1.1  christos    voidpf stream));
     60  1.1  christos 
     61  1.1  christos typedef struct
     62  1.1  christos {
     63  1.1  christos     HANDLE hf;
     64  1.1  christos     int error;
     65  1.1  christos } WIN32FILE_IOWIN;
     66  1.1  christos 
     67  1.1  christos voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
     68  1.1  christos    voidpf opaque;
     69  1.1  christos    const char* filename;
     70  1.1  christos    int mode;
     71  1.1  christos {
     72  1.1  christos     const char* mode_fopen = NULL;
     73  1.1  christos     DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
     74  1.1  christos     HANDLE hFile = 0;
     75  1.1  christos     voidpf ret=NULL;
     76  1.1  christos 
     77  1.1  christos     dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
     78  1.1  christos 
     79  1.1  christos     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
     80  1.1  christos     {
     81  1.1  christos         dwDesiredAccess = GENERIC_READ;
     82  1.1  christos         dwCreationDisposition = OPEN_EXISTING;
     83  1.1  christos         dwShareMode = FILE_SHARE_READ;
     84  1.1  christos     }
     85  1.1  christos     else
     86  1.1  christos     if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
     87  1.1  christos     {
     88  1.1  christos         dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
     89  1.1  christos         dwCreationDisposition = OPEN_EXISTING;
     90  1.1  christos     }
     91  1.1  christos     else
     92  1.1  christos     if (mode & ZLIB_FILEFUNC_MODE_CREATE)
     93  1.1  christos     {
     94  1.1  christos         dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
     95  1.1  christos         dwCreationDisposition = CREATE_ALWAYS;
     96  1.1  christos     }
     97  1.1  christos 
     98  1.1  christos     if ((filename!=NULL) && (dwDesiredAccess != 0))
     99  1.1  christos         hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
    100  1.1  christos                       dwCreationDisposition, dwFlagsAndAttributes, NULL);
    101  1.1  christos 
    102  1.1  christos     if (hFile == INVALID_HANDLE_VALUE)
    103  1.1  christos         hFile = NULL;
    104  1.1  christos 
    105  1.1  christos     if (hFile != NULL)
    106  1.1  christos     {
    107  1.1  christos         WIN32FILE_IOWIN w32fiow;
    108  1.1  christos         w32fiow.hf = hFile;
    109  1.1  christos         w32fiow.error = 0;
    110  1.1  christos         ret = malloc(sizeof(WIN32FILE_IOWIN));
    111  1.1  christos         if (ret==NULL)
    112  1.1  christos             CloseHandle(hFile);
    113  1.1  christos         else *((WIN32FILE_IOWIN*)ret) = w32fiow;
    114  1.1  christos     }
    115  1.1  christos     return ret;
    116  1.1  christos }
    117  1.1  christos 
    118  1.1  christos 
    119  1.1  christos uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
    120  1.1  christos    voidpf opaque;
    121  1.1  christos    voidpf stream;
    122  1.1  christos    void* buf;
    123  1.1  christos    uLong size;
    124  1.1  christos {
    125  1.1  christos     uLong ret=0;
    126  1.1  christos     HANDLE hFile = NULL;
    127  1.1  christos     if (stream!=NULL)
    128  1.1  christos         hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
    129  1.1  christos     if (hFile != NULL)
    130  1.1  christos         if (!ReadFile(hFile, buf, size, &ret, NULL))
    131  1.1  christos         {
    132  1.1  christos             DWORD dwErr = GetLastError();
    133  1.1  christos             if (dwErr == ERROR_HANDLE_EOF)
    134  1.1  christos                 dwErr = 0;
    135  1.1  christos             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
    136  1.1  christos         }
    137  1.1  christos 
    138  1.1  christos     return ret;
    139  1.1  christos }
    140  1.1  christos 
    141  1.1  christos 
    142  1.1  christos uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
    143  1.1  christos    voidpf opaque;
    144  1.1  christos    voidpf stream;
    145  1.1  christos    const void* buf;
    146  1.1  christos    uLong size;
    147  1.1  christos {
    148  1.1  christos     uLong ret=0;
    149  1.1  christos     HANDLE hFile = NULL;
    150  1.1  christos     if (stream!=NULL)
    151  1.1  christos         hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
    152  1.1  christos 
    153  1.1  christos     if (hFile !=NULL)
    154  1.1  christos         if (!WriteFile(hFile, buf, size, &ret, NULL))
    155  1.1  christos         {
    156  1.1  christos             DWORD dwErr = GetLastError();
    157  1.1  christos             if (dwErr == ERROR_HANDLE_EOF)
    158  1.1  christos                 dwErr = 0;
    159  1.1  christos             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
    160  1.1  christos         }
    161  1.1  christos 
    162  1.1  christos     return ret;
    163  1.1  christos }
    164  1.1  christos 
    165  1.1  christos long ZCALLBACK win32_tell_file_func (opaque, stream)
    166  1.1  christos    voidpf opaque;
    167  1.1  christos    voidpf stream;
    168  1.1  christos {
    169  1.1  christos     long ret=-1;
    170  1.1  christos     HANDLE hFile = NULL;
    171  1.1  christos     if (stream!=NULL)
    172  1.1  christos         hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
    173  1.1  christos     if (hFile != NULL)
    174  1.1  christos     {
    175  1.1  christos         DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
    176  1.1  christos         if (dwSet == INVALID_SET_FILE_POINTER)
    177  1.1  christos         {
    178  1.1  christos             DWORD dwErr = GetLastError();
    179  1.1  christos             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
    180  1.1  christos             ret = -1;
    181  1.1  christos         }
    182  1.1  christos         else
    183  1.1  christos             ret=(long)dwSet;
    184  1.1  christos     }
    185  1.1  christos     return ret;
    186  1.1  christos }
    187  1.1  christos 
    188  1.1  christos long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
    189  1.1  christos    voidpf opaque;
    190  1.1  christos    voidpf stream;
    191  1.1  christos    uLong offset;
    192  1.1  christos    int origin;
    193  1.1  christos {
    194  1.1  christos     DWORD dwMoveMethod=0xFFFFFFFF;
    195  1.1  christos     HANDLE hFile = NULL;
    196  1.1  christos 
    197  1.1  christos     long ret=-1;
    198  1.1  christos     if (stream!=NULL)
    199  1.1  christos         hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
    200  1.1  christos     switch (origin)
    201  1.1  christos     {
    202  1.1  christos     case ZLIB_FILEFUNC_SEEK_CUR :
    203  1.1  christos         dwMoveMethod = FILE_CURRENT;
    204  1.1  christos         break;
    205  1.1  christos     case ZLIB_FILEFUNC_SEEK_END :
    206  1.1  christos         dwMoveMethod = FILE_END;
    207  1.1  christos         break;
    208  1.1  christos     case ZLIB_FILEFUNC_SEEK_SET :
    209  1.1  christos         dwMoveMethod = FILE_BEGIN;
    210  1.1  christos         break;
    211  1.1  christos     default: return -1;
    212  1.1  christos     }
    213  1.1  christos 
    214  1.1  christos     if (hFile != NULL)
    215  1.1  christos     {
    216  1.1  christos         DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
    217  1.1  christos         if (dwSet == INVALID_SET_FILE_POINTER)
    218  1.1  christos         {
    219  1.1  christos             DWORD dwErr = GetLastError();
    220  1.1  christos             ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
    221  1.1  christos             ret = -1;
    222  1.1  christos         }
    223  1.1  christos         else
    224  1.1  christos             ret=0;
    225  1.1  christos     }
    226  1.1  christos     return ret;
    227  1.1  christos }
    228  1.1  christos 
    229  1.1  christos int ZCALLBACK win32_close_file_func (opaque, stream)
    230  1.1  christos    voidpf opaque;
    231  1.1  christos    voidpf stream;
    232  1.1  christos {
    233  1.1  christos     int ret=-1;
    234  1.1  christos 
    235  1.1  christos     if (stream!=NULL)
    236  1.1  christos     {
    237  1.1  christos         HANDLE hFile;
    238  1.1  christos         hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
    239  1.1  christos         if (hFile != NULL)
    240  1.1  christos         {
    241  1.1  christos             CloseHandle(hFile);
    242  1.1  christos             ret=0;
    243  1.1  christos         }
    244  1.1  christos         free(stream);
    245  1.1  christos     }
    246  1.1  christos     return ret;
    247  1.1  christos }
    248  1.1  christos 
    249  1.1  christos int ZCALLBACK win32_error_file_func (opaque, stream)
    250  1.1  christos    voidpf opaque;
    251  1.1  christos    voidpf stream;
    252  1.1  christos {
    253  1.1  christos     int ret=-1;
    254  1.1  christos     if (stream!=NULL)
    255  1.1  christos     {
    256  1.1  christos         ret = ((WIN32FILE_IOWIN*)stream) -> error;
    257  1.1  christos     }
    258  1.1  christos     return ret;
    259  1.1  christos }
    260  1.1  christos 
    261  1.1  christos void fill_win32_filefunc (pzlib_filefunc_def)
    262  1.1  christos   zlib_filefunc_def* pzlib_filefunc_def;
    263  1.1  christos {
    264  1.1  christos     pzlib_filefunc_def->zopen_file = win32_open_file_func;
    265  1.1  christos     pzlib_filefunc_def->zread_file = win32_read_file_func;
    266  1.1  christos     pzlib_filefunc_def->zwrite_file = win32_write_file_func;
    267  1.1  christos     pzlib_filefunc_def->ztell_file = win32_tell_file_func;
    268  1.1  christos     pzlib_filefunc_def->zseek_file = win32_seek_file_func;
    269  1.1  christos     pzlib_filefunc_def->zclose_file = win32_close_file_func;
    270  1.1  christos     pzlib_filefunc_def->zerror_file = win32_error_file_func;
    271  1.1  christos     pzlib_filefunc_def->opaque=NULL;
    272  1.1  christos }
    273