root/lib/zlib/contrib/minizip/iowin32.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. win32_open_file_func
  2. win32_read_file_func
  3. win32_write_file_func
  4. win32_tell_file_func
  5. win32_seek_file_func
  6. win32_close_file_func
  7. win32_error_file_func
  8. fill_win32_filefunc

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

/* [<][>][^][v][top][bottom][index][help] */