tesseract  4.00.00dev
iowin32.c
Go to the documentation of this file.
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 
25  voidpf opaque,
26  const char* filename,
27  int mode));
28 
30  voidpf opaque,
31  voidpf stream,
32  void* buf,
33  uLong size));
34 
36  voidpf opaque,
37  voidpf stream,
38  const void* buf,
39  uLong size));
40 
42  voidpf opaque,
43  voidpf stream));
44 
46  voidpf opaque,
47  voidpf stream,
48  uLong offset,
49  int origin));
50 
52  voidpf opaque,
53  voidpf stream));
54 
56  voidpf opaque,
57  voidpf stream));
58 
59 typedef struct
60 {
61  HANDLE hf;
62  int error;
64 
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 
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 
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 
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  {
201  dwMoveMethod = FILE_CURRENT;
202  break;
204  dwMoveMethod = FILE_END;
205  break;
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 }
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER
Definition: ioapi.h:19
voidpf stream
Definition: ioapi.h:39
void fill_win32_filefunc(zlib_filefunc_def *pzlib_filefunc_def)
Definition: iowin32.c:259
voidpf void uLong size
Definition: ioapi.h:39
typedef uLong(ZCALLBACK *read_file_func) OF((voidpf opaque
uLong ZCALLBACK win32_read_file_func(voidpf opaque, voidpf stream, void *buf, uLong size)
Definition: iowin32.c:117
long ZCALLBACK win32_seek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin)
Definition: iowin32.c:186
voidpf uLong offset
Definition: ioapi.h:42
voidpf ZCALLBACK win32_open_file_func(voidpf opaque, const char *filename, int mode)
Definition: iowin32.c:65
int ZCALLBACK win32_error_file_func(voidpf opaque, voidpf stream)
Definition: iowin32.c:247
#define ZLIB_FILEFUNC_MODE_CREATE
Definition: ioapi.h:22
#define ZLIB_FILEFUNC_SEEK_SET
Definition: ioapi.h:15
uLong ZCALLBACK win32_write_file_func(voidpf opaque, voidpf stream, const void *buf, uLong size)
Definition: iowin32.c:140
long ZCALLBACK win32_tell_file_func(voidpf opaque, voidpf stream)
Definition: iowin32.c:163
#define ZCALLBACK
Definition: ioapi.h:30
const char int mode
Definition: ioapi.h:38
#define ZLIB_FILEFUNC_SEEK_END
Definition: ioapi.h:14
open_file_func zopen_file
Definition: ioapi.h:48
#define INVALID_HANDLE_VALUE
Definition: iowin32.c:17
#define ZLIB_FILEFUNC_SEEK_CUR
Definition: ioapi.h:13
typedef long(ZCALLBACK *tell_file_func) OF((voidpf opaque
const char * filename
Definition: ioapi.h:38
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
voidpf void * buf
Definition: ioapi.h:39
voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char *filename, int mode))
voidpf uLong int origin
Definition: ioapi.h:42
HANDLE hf
Definition: iowin32.c:61
int ZCALLBACK win32_close_file_func(voidpf opaque, voidpf stream)
Definition: iowin32.c:227
#define ZLIB_FILEFUNC_MODE_EXISTING
Definition: ioapi.h:21
#define INVALID_SET_FILE_POINTER
Definition: iowin32.c:21
#define ZLIB_FILEFUNC_MODE_READ
Definition: ioapi.h:17
typedef voidpf(ZCALLBACK *open_file_func) OF((voidpf opaque