iowin32.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

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