Skip to content

Latest commit

 

History

History
640 lines (498 loc) · 17.4 KB

platform_pocketpc.c

File metadata and controls

640 lines (498 loc) · 17.4 KB
 
Nov 22, 2002
Nov 22, 2002
1
/*
Mar 11, 2007
Mar 11, 2007
2
* PocketPC support routines for PhysicsFS.
Nov 22, 2002
Nov 22, 2002
3
*
Mar 11, 2007
Mar 11, 2007
4
* Please see the file LICENSE.txt in the source's root directory.
Nov 22, 2002
Nov 22, 2002
5
6
7
8
*
* This file written by Ryan C. Gordon.
*/
Mar 11, 2007
Mar 11, 2007
9
10
11
12
13
#define __PHYSICSFS_INTERNAL__
#include "physfs_platforms.h"
#ifdef PHYSFS_PLATFORM_POCKETPC
Nov 22, 2002
Nov 22, 2002
14
15
16
17
#include <windows.h>
#include "physfs_internal.h"
Jul 20, 2003
Jul 20, 2003
18
19
#define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
Nov 22, 2002
Nov 22, 2002
20
21
22
23
24
25
26
27
typedef struct
{
HANDLE handle;
int readonly;
} winCEfile;
const char *__PHYSFS_platformDirSeparator = "\\";
May 18, 2003
May 18, 2003
28
static char *userDir = NULL;
Nov 22, 2002
Nov 22, 2002
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*
* Figure out what the last failing Win32 API call was, and
* generate a human-readable string for the error message.
*
* The return value is a static buffer that is overwritten with
* each call to this function.
*/
static const char *win32strerror(void)
{
static TCHAR msgbuf[255];
TCHAR *ptr = msgbuf;
FormatMessage(
Jul 20, 2003
Jul 20, 2003
43
44
45
46
47
48
49
50
51
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
msgbuf,
sizeof (msgbuf) / sizeof (TCHAR),
NULL
);
May 18, 2003
May 18, 2003
52
53
/* chop off newlines. */
Nov 22, 2002
Nov 22, 2002
54
55
56
57
58
59
60
61
62
for (ptr = msgbuf; *ptr; ptr++)
{
if ((*ptr == '\n') || (*ptr == '\r'))
{
*ptr = ' ';
break;
} /* if */
} /* for */
Jan 28, 2010
Jan 28, 2010
63
return ((const char *) msgbuf);
Nov 22, 2002
Nov 22, 2002
64
65
} /* win32strerror */
Mar 24, 2007
Mar 24, 2007
66
67
/* !!! FIXME: need to check all of these for NULLs. */
Mar 9, 2007
Mar 9, 2007
68
69
70
71
72
#define UTF8_TO_UNICODE_STACK_MACRO(w_assignto, str) { \
if (str == NULL) \
w_assignto = NULL; \
else { \
const PHYSFS_uint64 len = (PHYSFS_uint64) ((strlen(str) * 4) + 1); \
Mar 24, 2007
Mar 24, 2007
73
w_assignto = (char *) __PHYSFS_smallAlloc(len); \
Mar 9, 2007
Mar 9, 2007
74
75
76
PHYSFS_uc2fromutf8(str, (PHYSFS_uint16 *) w_assignto, len); \
} \
} \
Nov 22, 2002
Nov 22, 2002
77
78
May 18, 2003
May 18, 2003
79
80
81
82
83
static char *getExePath()
{
DWORD buflen;
int success = 0;
TCHAR *ptr = NULL;
Mar 14, 2005
Mar 14, 2005
84
TCHAR *retval = (TCHAR*) allocator.Malloc(sizeof (TCHAR) * (MAX_PATH + 1));
May 18, 2003
May 18, 2003
85
86
87
88
char *charretval;
BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);
retval[0] = _T('\0');
Mar 9, 2007
Mar 9, 2007
89
/* !!! FIXME: don't preallocate here? */
Mar 24, 2007
Mar 24, 2007
90
/* !!! FIXME: use smallAlloc? */
May 18, 2003
May 18, 2003
91
buflen = GetModuleFileName(NULL, retval, MAX_PATH + 1);
Mar 8, 2007
Mar 8, 2007
92
if (buflen <= 0)
May 18, 2003
May 18, 2003
93
__PHYSFS_setError(win32strerror());
Mar 8, 2007
Mar 8, 2007
94
else
Jul 20, 2003
Jul 20, 2003
95
{
Mar 8, 2007
Mar 8, 2007
96
97
98
99
100
101
102
103
104
105
retval[buflen] = '\0'; /* does API always null-terminate this? */
ptr = retval+buflen;
while( ptr != retval )
{
if( *ptr != _T('\\') )
*ptr-- = _T('\0');
else
break;
} /* while */
success = 1;
May 18, 2003
May 18, 2003
106
107
108
109
} /* else */
if (!success)
{
Mar 14, 2005
Mar 14, 2005
110
allocator.Free(retval);
Jan 28, 2010
Jan 28, 2010
111
return NULL; /* physfs error message will be set, above. */
May 18, 2003
May 18, 2003
112
113
} /* if */
Mar 9, 2007
Mar 9, 2007
114
115
116
117
buflen = (buflen * 4) + 1;
charretval = (char *) allocator.Malloc(buflen);
if (charretval != NULL)
PHYSFS_utf8fromucs2((const PHYSFS_uint16 *) retval, charretval, buflen);
Mar 14, 2005
Mar 14, 2005
118
allocator.Free(retval);
Jan 28, 2010
Jan 28, 2010
119
return charretval; /* w00t. */
May 18, 2003
May 18, 2003
120
121
} /* getExePath */
Mar 8, 2007
Mar 8, 2007
122
Nov 22, 2002
Nov 22, 2002
123
124
int __PHYSFS_platformInit(void)
{
May 18, 2003
May 18, 2003
125
126
userDir = getExePath();
BAIL_IF_MACRO(userDir == NULL, NULL, 0); /* failed? */
Jan 28, 2010
Jan 28, 2010
127
return 1; /* always succeed. */
Nov 22, 2002
Nov 22, 2002
128
129
130
131
132
} /* __PHYSFS_platformInit */
int __PHYSFS_platformDeinit(void)
{
Mar 14, 2005
Mar 14, 2005
133
allocator.Free(userDir);
Jan 28, 2010
Jan 28, 2010
134
return 1; /* always succeed. */
Nov 22, 2002
Nov 22, 2002
135
136
137
} /* __PHYSFS_platformDeinit */
Sep 29, 2004
Sep 29, 2004
138
void __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)
Nov 22, 2002
Nov 22, 2002
139
{
Sep 29, 2004
Sep 29, 2004
140
/* no-op on this platform. */
Nov 22, 2002
Nov 22, 2002
141
142
143
144
145
} /* __PHYSFS_platformDetectAvailableCDs */
char *__PHYSFS_platformCalcBaseDir(const char *argv0)
{
Jan 28, 2010
Jan 28, 2010
146
return getExePath();
Nov 22, 2002
Nov 22, 2002
147
148
149
150
151
152
153
154
155
156
157
} /* __PHYSFS_platformCalcBaseDir */
char *__PHYSFS_platformGetUserName(void)
{
BAIL_MACRO(ERR_NOT_IMPLEMENTED, NULL);
} /* __PHYSFS_platformGetUserName */
char *__PHYSFS_platformGetUserDir(void)
{
May 18, 2003
May 18, 2003
158
return userDir;
Nov 22, 2002
Nov 22, 2002
159
160
161
162
BAIL_MACRO(ERR_NOT_IMPLEMENTED, NULL);
} /* __PHYSFS_platformGetUserDir */
Sep 6, 2009
Sep 6, 2009
163
void *__PHYSFS_platformGetThreadID(void)
Nov 22, 2002
Nov 22, 2002
164
{
Jan 28, 2010
Jan 28, 2010
165
return ((void *)1); /* single threaded. */ /* !!! FIXME: is this true? */
Nov 22, 2002
Nov 22, 2002
166
167
168
169
170
171
172
173
} /* __PHYSFS_platformGetThreadID */
char *__PHYSFS_platformCvtToDependent(const char *prepend,
const char *dirName,
const char *append)
{
int len = ((prepend) ? strlen(prepend) : 0) +
Jul 20, 2003
Jul 20, 2003
174
175
((append) ? strlen(append) : 0) +
strlen(dirName) + 1;
Mar 14, 2005
Mar 14, 2005
176
char *retval = (char *) allocator.Malloc(len);
Nov 22, 2002
Nov 22, 2002
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
char *p;
BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);
if (prepend)
strcpy(retval, prepend);
else
retval[0] = '\0';
strcat(retval, dirName);
if (append)
strcat(retval, append);
for (p = strchr(retval, '/'); p != NULL; p = strchr(p + 1, '/'))
*p = '\\';
Jan 28, 2010
Jan 28, 2010
194
return retval;
Nov 22, 2002
Nov 22, 2002
195
196
197
} /* __PHYSFS_platformCvtToDependent */
Mar 9, 2007
Mar 9, 2007
198
199
200
static int doEnumCallback(const wchar_t *w_fname)
{
const PHYSFS_uint64 len = (PHYSFS_uint64) ((wcslen(w_fname) * 4) + 1);
Mar 24, 2007
Mar 24, 2007
201
char *str = (char *) __PHYSFS_smallAlloc(len);
Mar 9, 2007
Mar 9, 2007
202
203
PHYSFS_utf8fromucs2((const PHYSFS_uint16 *) w_fname, str, len);
callback(callbackdata, origdir, str);
Mar 24, 2007
Mar 24, 2007
204
__PHYSFS_smallFree(str);
Mar 9, 2007
Mar 9, 2007
205
206
207
208
return 1;
} /* doEnumCallback */
Sep 29, 2004
Sep 29, 2004
209
210
void __PHYSFS_platformEnumerateFiles(const char *dirname,
int omitSymLinks,
Sep 18, 2005
Sep 18, 2005
211
212
PHYSFS_EnumFilesCallback callback,
const char *origdir,
Sep 29, 2004
Sep 29, 2004
213
void *callbackdata)
Nov 22, 2002
Nov 22, 2002
214
215
216
217
{
HANDLE dir;
WIN32_FIND_DATA ent;
char *SearchPath;
May 18, 2003
May 18, 2003
218
wchar_t *w_SearchPath;
Nov 22, 2002
Nov 22, 2002
219
220
221
size_t len = strlen(dirname);
/* Allocate a new string for path, maybe '\\', "*", and NULL terminator */
Mar 24, 2007
Mar 24, 2007
222
SearchPath = (char *) __PHYSFS_smallAlloc(len + 3);
Jul 20, 2003
Jul 20, 2003
223
BAIL_IF_MACRO(SearchPath == NULL, ERR_OUT_OF_MEMORY, NULL);
Nov 22, 2002
Nov 22, 2002
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/* Copy current dirname */
strcpy(SearchPath, dirname);
/* if there's no '\\' at the end of the path, stick one in there. */
if (SearchPath[len - 1] != '\\')
{
SearchPath[len++] = '\\';
SearchPath[len] = '\0';
} /* if */
/* Append the "*" to the end of the string */
strcat(SearchPath, "*");
Mar 9, 2007
Mar 9, 2007
238
UTF8_TO_UNICODE_STACK_MACRO(w_SearchPath, SearchPath);
Mar 24, 2007
Mar 24, 2007
239
__PHYSFS_smallFree(SearchPath);
Nov 22, 2002
Nov 22, 2002
240
dir = FindFirstFile(w_SearchPath, &ent);
Mar 24, 2007
Mar 24, 2007
241
__PHYSFS_smallFree(w_SearchPath);
Nov 22, 2002
Nov 22, 2002
242
Sep 29, 2004
Sep 29, 2004
243
244
if (dir == INVALID_HANDLE_VALUE)
return;
Nov 22, 2002
Nov 22, 2002
245
246
247
do
{
Mar 9, 2007
Mar 9, 2007
248
const char *str = NULL;
Sep 29, 2004
Sep 29, 2004
249
Nov 22, 2002
Nov 22, 2002
250
251
252
253
254
255
if (wcscmp(ent.cFileName, L".") == 0)
continue;
if (wcscmp(ent.cFileName, L"..") == 0)
continue;
Mar 9, 2007
Mar 9, 2007
256
if (!doEnumCallback(ent.cFileName))
Nov 22, 2002
Nov 22, 2002
257
258
259
260
261
262
263
264
265
break;
} while (FindNextFile(dir, &ent) != 0);
FindClose(dir);
} /* __PHYSFS_platformEnumerateFiles */
char *__PHYSFS_platformCurrentDir(void)
{
Jan 28, 2010
Jan 28, 2010
266
return "\\";
Nov 22, 2002
Nov 22, 2002
267
268
269
270
271
} /* __PHYSFS_platformCurrentDir */
char *__PHYSFS_platformRealPath(const char *path)
{
Mar 14, 2005
Mar 14, 2005
272
char *retval = (char *) allocator.Malloc(strlen(path) + 1);
May 18, 2003
May 18, 2003
273
strcpy(retval,path);
Jan 28, 2010
Jan 28, 2010
274
return retval;
Nov 22, 2002
Nov 22, 2002
275
276
277
278
279
} /* __PHYSFS_platformRealPath */
int __PHYSFS_platformMkDir(const char *path)
{
Mar 24, 2007
Mar 24, 2007
280
int retval = 0;
Mar 9, 2007
Mar 9, 2007
281
282
wchar_t *w_path = NULL;
UTF8_TO_UNICODE_STACK_MACRO(w_path, path);
Mar 24, 2007
Mar 24, 2007
283
284
285
286
287
if (w_path != NULL)
{
retval = CreateDirectory(w_path, NULL);
__PHYSFS_smallFree(w_fname);
} /* if */
Jan 28, 2010
Jan 28, 2010
288
return retval;
Nov 22, 2002
Nov 22, 2002
289
290
291
292
293
294
295
} /* __PHYSFS_platformMkDir */
static void *doOpen(const char *fname, DWORD mode, DWORD creation, int rdonly)
{
HANDLE fileHandle;
winCEfile *retval;
Mar 9, 2007
Mar 9, 2007
296
297
298
wchar_t *w_fname = NULL;
UTF8_TO_UNICODE_STACK_MACRO(w_fname, fname);
Mar 17, 2010
Mar 17, 2010
299
300
fileHandle = CreateFile(w_fname, mode, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, creation, FILE_ATTRIBUTE_NORMAL, NULL);
Mar 24, 2007
Mar 24, 2007
301
__PHYSFS_smallFree(w_fname);
Nov 22, 2002
Nov 22, 2002
302
303
304
BAIL_IF_MACRO(fileHandle == INVALID_HANDLE_VALUE, win32strerror(), NULL);
Mar 14, 2005
Mar 14, 2005
305
retval = (winCEfile *) allocator.Malloc(sizeof (winCEfile));
May 18, 2003
May 18, 2003
306
307
if (retval == NULL)
{
Mar 8, 2007
Mar 8, 2007
308
309
CloseHandle(fileHandle);
BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
May 18, 2003
May 18, 2003
310
} /* if */
Nov 22, 2002
Nov 22, 2002
311
May 18, 2003
May 18, 2003
312
313
retval->readonly = rdonly;
retval->handle = fileHandle;
Jan 28, 2010
Jan 28, 2010
314
return retval;
Nov 22, 2002
Nov 22, 2002
315
316
317
318
319
} /* doOpen */
void *__PHYSFS_platformOpenRead(const char *filename)
{
Jan 28, 2010
Jan 28, 2010
320
return doOpen(filename, GENERIC_READ, OPEN_EXISTING, 1);
Nov 22, 2002
Nov 22, 2002
321
322
323
324
325
} /* __PHYSFS_platformOpenRead */
void *__PHYSFS_platformOpenWrite(const char *filename)
{
Jan 28, 2010
Jan 28, 2010
326
return doOpen(filename, GENERIC_WRITE, CREATE_ALWAYS, 0);
Nov 22, 2002
Nov 22, 2002
327
328
329
330
331
332
333
334
335
336
337
338
339
} /* __PHYSFS_platformOpenWrite */
void *__PHYSFS_platformOpenAppend(const char *filename)
{
void *retval = doOpen(filename, GENERIC_WRITE, OPEN_ALWAYS, 0);
if (retval != NULL)
{
HANDLE h = ((winCEfile *) retval)->handle;
if (SetFilePointer(h, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER)
{
const char *err = win32strerror();
CloseHandle(h);
Mar 14, 2005
Mar 14, 2005
340
allocator.Free(retval);
Nov 22, 2002
Nov 22, 2002
341
342
343
344
BAIL_MACRO(err, NULL);
} /* if */
} /* if */
Jan 28, 2010
Jan 28, 2010
345
return retval;
Nov 22, 2002
Nov 22, 2002
346
347
348
349
} /* __PHYSFS_platformOpenAppend */
Aug 21, 2010
Aug 21, 2010
350
PHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buf, PHYSFS_uint64 len)
Nov 22, 2002
Nov 22, 2002
351
{
Sep 26, 2004
Sep 26, 2004
352
HANDLE Handle = ((winCEfile *) opaque)->handle;
Aug 21, 2010
Aug 21, 2010
353
DWORD CountOfBytesRead = 0;
Nov 22, 2002
Nov 22, 2002
354
Aug 21, 2010
Aug 21, 2010
355
BAIL_IF_MACRO(!__PHYSFS_ui64FitsAddressSpace(len),ERR_INVALID_ARGUMENT,-1);
Nov 22, 2002
Nov 22, 2002
356
Aug 21, 2010
Aug 21, 2010
357
358
359
if (!ReadFile(Handle, buf, (DWORD) len, &CountOfBytesRead, NULL))
return -1; /* !!! FIXME: set an error string? */
return (PHYSFS_sint64) CountOfBytesRead;
Nov 22, 2002
Nov 22, 2002
360
361
362
363
} /* __PHYSFS_platformRead */
PHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer,
Aug 21, 2010
Aug 21, 2010
364
PHYSFS_uint64 len)
Nov 22, 2002
Nov 22, 2002
365
{
Sep 26, 2004
Sep 26, 2004
366
HANDLE Handle = ((winCEfile *) opaque)->handle;
Aug 21, 2010
Aug 21, 2010
367
DWORD CountOfBytesWritten = 0;
Nov 22, 2002
Nov 22, 2002
368
Aug 21, 2010
Aug 21, 2010
369
BAIL_IF_MACRO(!__PHYSFS_ui64FitsAddressSpace(len),ERR_INVALID_ARGUMENT,-1);
Nov 22, 2002
Nov 22, 2002
370
Aug 21, 2010
Aug 21, 2010
371
372
373
if (!WriteFile(Handle, buffer, (DWORD) len, &CountOfBytesWritten, NULL))
return -1;
return PHYSFS_sint64) CountOfBytesWritten;
Nov 22, 2002
Nov 22, 2002
374
375
376
377
378
} /* __PHYSFS_platformWrite */
int __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos)
{
Sep 26, 2004
Sep 26, 2004
379
HANDLE Handle = ((winCEfile *) opaque)->handle;
Nov 22, 2002
Nov 22, 2002
380
381
382
383
DWORD HighOrderPos;
DWORD rc;
/* Get the high order 32-bits of the position */
Aug 24, 2010
Aug 24, 2010
384
/*HighOrderPos = HIGHORDER_UINT64(pos);*/
May 18, 2003
May 18, 2003
385
HighOrderPos = (unsigned long)(pos>>32);
Nov 22, 2002
Nov 22, 2002
386
387
388
/*!!! SetFilePointer needs a signed 64-bit value. */
/* Move pointer "pos" count from start of file */
Sep 26, 2004
Sep 26, 2004
389
rc = SetFilePointer(Handle, (unsigned long)(pos&0x00000000ffffffff),
Nov 22, 2002
Nov 22, 2002
390
391
392
&HighOrderPos, FILE_BEGIN);
if ((rc == INVALID_SET_FILE_POINTER) && (GetLastError() != NO_ERROR))
May 18, 2003
May 18, 2003
393
{
Nov 22, 2002
Nov 22, 2002
394
BAIL_MACRO(win32strerror(), 0);
May 18, 2003
May 18, 2003
395
}
Nov 22, 2002
Nov 22, 2002
396
Jan 28, 2010
Jan 28, 2010
397
return 1; /* No error occured */
Nov 22, 2002
Nov 22, 2002
398
399
400
401
402
} /* __PHYSFS_platformSeek */
PHYSFS_sint64 __PHYSFS_platformTell(void *opaque)
{
Sep 26, 2004
Sep 26, 2004
403
HANDLE Handle = ((winCEfile *) opaque)->handle;
Nov 22, 2002
Nov 22, 2002
404
405
406
407
408
DWORD HighPos = 0;
DWORD LowPos;
PHYSFS_sint64 retval;
/* Get current position */
Sep 26, 2004
Sep 26, 2004
409
LowPos = SetFilePointer(Handle, 0, &HighPos, FILE_CURRENT);
Nov 22, 2002
Nov 22, 2002
410
411
412
413
414
415
416
417
if ((LowPos == INVALID_SET_FILE_POINTER) && (GetLastError() != NO_ERROR))
{
BAIL_MACRO(win32strerror(), 0);
} /* if */
else
{
/* Combine the high/low order to create the 64-bit position value */
retval = (((PHYSFS_uint64) HighPos) << 32) | LowPos;
Aug 24, 2010
Aug 24, 2010
418
/*assert(retval >= 0);*/
Nov 22, 2002
Nov 22, 2002
419
420
} /* else */
Jan 28, 2010
Jan 28, 2010
421
return retval;
Nov 22, 2002
Nov 22, 2002
422
423
424
425
426
} /* __PHYSFS_platformTell */
PHYSFS_sint64 __PHYSFS_platformFileLength(void *opaque)
{
Sep 26, 2004
Sep 26, 2004
427
HANDLE Handle = ((winCEfile *) opaque)->handle;
Nov 22, 2002
Nov 22, 2002
428
429
430
431
DWORD SizeHigh;
DWORD SizeLow;
PHYSFS_sint64 retval;
Sep 26, 2004
Sep 26, 2004
432
SizeLow = GetFileSize(Handle, &SizeHigh);
Nov 22, 2002
Nov 22, 2002
433
434
435
436
437
438
439
440
if ((SizeLow == INVALID_SET_FILE_POINTER) && (GetLastError() != NO_ERROR))
{
BAIL_MACRO(win32strerror(), -1);
} /* if */
else
{
/* Combine the high/low order to create the 64-bit position value */
retval = (((PHYSFS_uint64) SizeHigh) << 32) | SizeLow;
Aug 24, 2010
Aug 24, 2010
441
/*assert(retval >= 0);*/
Nov 22, 2002
Nov 22, 2002
442
443
} /* else */
Jan 28, 2010
Jan 28, 2010
444
return retval;
Nov 22, 2002
Nov 22, 2002
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
} /* __PHYSFS_platformFileLength */
int __PHYSFS_platformEOF(void *opaque)
{
PHYSFS_sint64 FilePosition;
int retval = 0;
/* Get the current position in the file */
if ((FilePosition = __PHYSFS_platformTell(opaque)) != 0)
{
/* Non-zero if EOF is equal to the file length */
retval = FilePosition == __PHYSFS_platformFileLength(opaque);
} /* if */
Jan 28, 2010
Jan 28, 2010
460
return retval;
Nov 22, 2002
Nov 22, 2002
461
462
463
464
465
466
467
468
469
} /* __PHYSFS_platformEOF */
int __PHYSFS_platformFlush(void *opaque)
{
winCEfile *fh = ((winCEfile *) opaque);
if (!fh->readonly)
BAIL_IF_MACRO(!FlushFileBuffers(fh->handle), win32strerror(), 0);
Jan 28, 2010
Jan 28, 2010
470
return 1;
Nov 22, 2002
Nov 22, 2002
471
472
473
} /* __PHYSFS_platformFlush */
Aug 30, 2010
Aug 30, 2010
474
void __PHYSFS_platformClose(void *opaque)
Nov 22, 2002
Nov 22, 2002
475
{
Sep 26, 2004
Sep 26, 2004
476
HANDLE Handle = ((winCEfile *) opaque)->handle;
Aug 30, 2010
Aug 30, 2010
477
(void) CloseHandle(Handle); /* ignore errors. You should have flushed! */
Mar 14, 2005
Mar 14, 2005
478
allocator.Free(opaque);
Nov 22, 2002
Nov 22, 2002
479
480
481
482
483
} /* __PHYSFS_platformClose */
int __PHYSFS_platformDelete(const char *path)
{
Mar 9, 2007
Mar 9, 2007
484
485
wchar_t *w_path = NULL;
UTF8_TO_UNICODE_STACK_MACRO(w_path, path);
Nov 22, 2002
Nov 22, 2002
486
487
488
489
/* If filename is a folder */
if (GetFileAttributes(w_path) == FILE_ATTRIBUTE_DIRECTORY)
{
Mar 9, 2007
Mar 9, 2007
490
int retval = !RemoveDirectory(w_path);
Mar 24, 2007
Mar 24, 2007
491
__PHYSFS_smallFree(w_path);
Nov 22, 2002
Nov 22, 2002
492
493
494
495
BAIL_IF_MACRO(retval, win32strerror(), 0);
} /* if */
else
{
Mar 9, 2007
Mar 9, 2007
496
int retval = !DeleteFile(w_path);
Mar 24, 2007
Mar 24, 2007
497
__PHYSFS_smallFree(w_path);
Nov 22, 2002
Nov 22, 2002
498
499
500
BAIL_IF_MACRO(retval, win32strerror(), 0);
} /* else */
Jan 28, 2010
Jan 28, 2010
501
return 1; /* if you got here, it worked. */
Nov 22, 2002
Nov 22, 2002
502
503
504
} /* __PHYSFS_platformDelete */
Feb 15, 2010
Feb 15, 2010
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
/* Shamelessly copied from platform_windows.c */
static PHYSFS_sint64 FileTimeToPhysfsTime(const FILETIME *ft)
{
SYSTEMTIME st_utc;
SYSTEMTIME st_localtz;
TIME_ZONE_INFORMATION tzi;
DWORD tzid;
PHYSFS_sint64 retval;
struct tm tm;
BAIL_IF_MACRO(!FileTimeToSystemTime(ft, &st_utc), winApiStrError(), -1);
tzid = GetTimeZoneInformation(&tzi);
BAIL_IF_MACRO(tzid == TIME_ZONE_ID_INVALID, winApiStrError(), -1);
/* (This API is unsupported and fails on non-NT systems. */
if (!SystemTimeToTzSpecificLocalTime(&tzi, &st_utc, &st_localtz))
{
/* do it by hand. Grumble... */
ULARGE_INTEGER ui64;
FILETIME new_ft;
ui64.LowPart = ft->dwLowDateTime;
ui64.HighPart = ft->dwHighDateTime;
if (tzid == TIME_ZONE_ID_STANDARD)
tzi.Bias += tzi.StandardBias;
else if (tzid == TIME_ZONE_ID_DAYLIGHT)
tzi.Bias += tzi.DaylightBias;
/* convert from minutes to 100-nanosecond increments... */
ui64.QuadPart -= (((LONGLONG) tzi.Bias) * (600000000));
/* Move it back into a FILETIME structure... */
new_ft.dwLowDateTime = ui64.LowPart;
new_ft.dwHighDateTime = ui64.HighPart;
/* Convert to something human-readable... */
if (!FileTimeToSystemTime(&new_ft, &st_localtz))
BAIL_MACRO(winApiStrError(), -1);
} /* if */
/* Convert to a format that mktime() can grok... */
tm.tm_sec = st_localtz.wSecond;
tm.tm_min = st_localtz.wMinute;
tm.tm_hour = st_localtz.wHour;
tm.tm_mday = st_localtz.wDay;
tm.tm_mon = st_localtz.wMonth - 1;
tm.tm_year = st_localtz.wYear - 1900;
tm.tm_wday = -1 /*st_localtz.wDayOfWeek*/;
tm.tm_yday = -1;
tm.tm_isdst = -1;
/* Convert to a format PhysicsFS can grok... */
retval = (PHYSFS_sint64) mktime(&tm);
BAIL_IF_MACRO(retval == -1, strerror(errno), -1);
return retval;
} /* FileTimeToPhysfsTime */
int __PHYSFS_platformStat(const char *filename, int *exists, PHYSFS_Stat *stat)
{
WIN32_FIND_DATA winstat;
const HANDLE searchhandle = FindFirstFile(filename, &winstat);
if (searchhandle == INVALID_HANDLE_VALUE) /* call failed? */
{
/* !!! FIXME: FindFirstFile() doesn't set errno. Use GetLastError()?. */
if (errno == ERROR_FILE_NOT_FOUND)
{
*exists = 0;
return 0;
} /* if */
Aug 21, 2010
Aug 21, 2010
576
BAIL_MACRO(win32strerror, 0);
Feb 15, 2010
Feb 15, 2010
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
} /* if */
FindClose(searchhandle); /* close handle, not needed anymore */
*exists = 1;
if(winstat.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
stat->filetype = PHYSFS_FILETYPE_DIRECTORY;
else if (winstat.dwFileAttributes & (FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_ROMMODULE))
stat->filetype = PHYSFS_FILETYPE_OTHER;
else
stat->filetype = PHYSFS_FILETYPE_OTHER; /* !!! FIXME: _REGULAR? */
if (stat->filetype == PHYSFS_FILETYPE_REGULAR)
stat->filesize = (((PHYSFS_uint64) winstat.nFileSizeHigh) << 32) | winstat.nFileSizeLow;
stat->modtime = FileTimeToPhysfsTime(&winstat.ftLastWriteTime);
stat->accesstime = FileTimeToPhysfsTime(&winstat.ftLastAccessTime);
stat->createtime = FileTimeToPhysfsTime(&winstat.ftCreationTime);
stat->readonly = ((winstat.dwFileAttributes & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_INROM)) != 0);
Aug 21, 2010
Aug 21, 2010
598
return 1;
Feb 15, 2010
Feb 15, 2010
599
600
601
} /* __PHYSFS_platformStat */
Mar 24, 2007
Mar 24, 2007
602
603
604
605
606
/*
* !!! FIXME: why aren't we using Critical Sections instead of Mutexes?
* !!! FIXME: mutexes on Windows are for cross-process sync. CritSects are
* !!! FIXME: mutexes for threads in a single process and are faster.
*/
Nov 22, 2002
Nov 22, 2002
607
608
void *__PHYSFS_platformCreateMutex(void)
{
Feb 15, 2010
Feb 15, 2010
609
return ((void *) CreateMutex(NULL, FALSE, NULL));
Nov 22, 2002
Nov 22, 2002
610
611
612
613
614
615
616
617
618
619
620
} /* __PHYSFS_platformCreateMutex */
void __PHYSFS_platformDestroyMutex(void *mutex)
{
CloseHandle((HANDLE) mutex);
} /* __PHYSFS_platformDestroyMutex */
int __PHYSFS_platformGrabMutex(void *mutex)
{
Jan 28, 2010
Jan 28, 2010
621
return (WaitForSingleObject((HANDLE) mutex, INFINITE) != WAIT_FAILED);
Nov 22, 2002
Nov 22, 2002
622
623
624
625
626
627
628
629
630
} /* __PHYSFS_platformGrabMutex */
void __PHYSFS_platformReleaseMutex(void *mutex)
{
ReleaseMutex((HANDLE) mutex);
} /* __PHYSFS_platformReleaseMutex */
Mar 14, 2005
Mar 14, 2005
631
/* !!! FIXME: Don't use C runtime for allocators? */
Mar 20, 2007
Mar 20, 2007
632
int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a)
Mar 14, 2005
Mar 14, 2005
633
{
Jan 28, 2010
Jan 28, 2010
634
return 0; /* just use malloc() and friends. */
Mar 20, 2007
Mar 20, 2007
635
} /* __PHYSFS_platformSetDefaultAllocator */
Mar 14, 2005
Mar 14, 2005
636
Mar 11, 2007
Mar 11, 2007
637
638
#endif /* PHYSFS_PLATFORM_POCKETPC */
Feb 15, 2005
Feb 15, 2005
639
/* end of pocketpc.c ... */