symbian-qemu-0.9.1-12/zlib-1.2.3/contrib/minizip/iowin32.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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)
       
    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)
       
   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)
       
   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)
       
   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)
       
   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)
       
   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)
       
   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)
       
   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 }