22 #define _LARGEFILE64_SOURCE 23 #include "../SDL_internal.h" 25 #if defined(__WIN32__) 26 #include "../core/windows/SDL_windows.h" 42 #include "../core/android/SDL_android.h" 47 #include "nacl_io/nacl_io.h" 54 #ifndef INVALID_SET_FILE_POINTER 55 #define INVALID_SET_FILE_POINTER 0xFFFFFFFF 58 #define READAHEAD_BUFFER_SIZE 1024 65 DWORD r_right, w_right;
66 DWORD must_exist, truncate;
87 || must_exist) ? GENERIC_READ : 0;
90 || truncate) ? GENERIC_WRITE : 0;
92 if (!r_right && !w_right)
102 SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
106 h = CreateFile(tstr, (w_right | r_right),
107 (w_right) ? 0 : FILE_SHARE_READ,
NULL,
108 (must_exist | truncate | a_mode),
109 FILE_ATTRIBUTE_NORMAL,
NULL);
114 SetErrorMode(old_error_mode);
116 if (h == INVALID_HANDLE_VALUE) {
134 return SDL_SetError(
"windows_file_size: invalid context/file not opened");
141 return size.QuadPart;
148 LARGE_INTEGER windowsoffset;
151 return SDL_SetError(
"windows_file_seek: invalid context/file not opened");
162 windowswhence = FILE_BEGIN;
165 windowswhence = FILE_CURRENT;
168 windowswhence = FILE_END;
171 return SDL_SetError(
"windows_file_seek: Unknown value for 'whence'");
174 windowsoffset.QuadPart =
offset;
175 if (!SetFilePointerEx(context->
hidden.
windowsio.h, windowsoffset, &windowsoffset, windowswhence)) {
178 return windowsoffset.QuadPart;
182 windows_file_read(
SDL_RWops * context,
void *ptr,
size_t size,
size_t maxnum)
185 size_t total_read = 0;
189 total_need =
size * maxnum;
204 if (read_ahead == total_need) {
207 ptr = (
char *) ptr + read_ahead;
208 total_need -= read_ahead;
209 total_read += read_ahead;
212 if (total_need < READAHEAD_BUFFER_SIZE) {
215 READAHEAD_BUFFER_SIZE, &byte_read,
NULL)) {
219 read_ahead =
SDL_min(total_need, (
int) byte_read);
223 total_read += read_ahead;
230 total_read += byte_read;
232 return (total_read /
size);
236 windows_file_write(
SDL_RWops * context,
const void *ptr,
size_t size,
247 || total_bytes <= 0 || !
size)
260 INVALID_SET_FILE_POINTER) {
272 nwritten = byte_written /
size;
319 #elif defined(HAVE_FSEEKO) 320 if (fseeko(context->
hidden.
stdio.fp, (off_t)offset, whence) == 0) {
323 #elif defined(HAVE__FSEEKI64) 324 if (_fseeki64(context->
hidden.
stdio.fp, offset, whence) == 0) {
328 if (fseek(context->
hidden.
stdio.fp, offset, whence) == 0) {
336 stdio_read(
SDL_RWops * context,
void *ptr,
size_t size,
size_t maxnum)
341 if (nread == 0 && ferror(context->
hidden.
stdio.fp)) {
353 if (nwrote == 0 && ferror(context->
hidden.
stdio.fp)) {
402 if (newpos < context->hidden.mem.base) {
416 size_t mem_available;
418 total_bytes = (maxnum *
size);
419 if ((maxnum <= 0) || (size <= 0)
420 || ((total_bytes / maxnum) != (
size_t) size)) {
425 if (total_bytes > mem_available) {
426 total_bytes = mem_available;
432 return (total_bytes / size);
469 if (!file || !*file || !mode || !*mode) {
470 SDL_SetError(
"SDL_RWFromFile(): No file or no mode specified");
473 #if defined(__ANDROID__) 477 FILE *fp = fopen(file, mode);
490 fp = fopen(path, mode);
514 #elif defined(__WIN32__) 518 if (windows_file_open(rwops, file, mode) < 0) {
522 rwops->
size = windows_file_size;
523 rwops->
seek = windows_file_seek;
524 rwops->
read = windows_file_read;
525 rwops->
write = windows_file_write;
526 rwops->
close = windows_file_close;
532 FILE *fp = SDL_OpenFPFromBundleOrFallback(file, mode);
535 fopen_s(&fp, file, mode);
537 FILE *fp = fopen(file, mode);
560 rwops->
size = stdio_size;
561 rwops->
seek = stdio_seek;
562 rwops->
read = stdio_read;
563 rwops->
write = stdio_write;
564 rwops->
close = stdio_close;
724 return SDL_RWwrite(dst, &value,
sizeof (value), 1);
731 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
738 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
745 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
752 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
759 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
766 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
int Android_JNI_FileClose(SDL_RWops *ctx)
#define WIN_UTF8ToString(S)
Uint32 SDL_ReadBE32(SDL_RWops *src)
void SDL_FreeRW(SDL_RWops *area)
#define SDL_RWwrite(ctx, ptr, size, n)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define SDL_RWOPS_WINFILE
SDL_RWops * SDL_RWFromConstMem(const void *mem, int size)
#define SDL_RWread(ctx, ptr, size, n)
size_t(* write)(struct SDL_RWops *context, const void *ptr, size_t size, size_t num)
#define SDL_RWOPS_UNKNOWN
uint32_t Uint32
An unsigned 32-bit integer type.
#define SDL_InvalidParamError(param)
static size_t mem_writeconst(SDL_RWops *context, const void *ptr, size_t size, size_t num)
size_t SDL_WriteLE32(SDL_RWops *dst, Uint32 value)
static Sint64 mem_size(SDL_RWops *context)
uint64_t Uint64
An unsigned 64-bit integer type.
int Android_JNI_FileOpen(SDL_RWops *ctx, const char *fileName, const char *mode)
struct SDL_RWops::@10::@11 windowsio
struct SDL_RWops::@10::@13 mem
Uint64 SDL_ReadLE64(SDL_RWops *src)
struct SDL_RWops::@10::@12 stdio
Sint64(* seek)(struct SDL_RWops *context, Sint64 offset, int whence)
#define SDL_RWseek(ctx, offset, whence)
static size_t mem_write(SDL_RWops *context, const void *ptr, size_t size, size_t num)
Uint16 SDL_ReadBE16(SDL_RWops *src)
SDL_RWops * SDL_AllocRW(void)
size_t SDL_WriteBE16(SDL_RWops *dst, Uint16 value)
size_t SDL_WriteBE64(SDL_RWops *dst, Uint64 value)
SDL_RWops * SDL_RWFromFile(const char *file, const char *mode)
static int mem_close(SDL_RWops *context)
GLsizei const GLfloat * value
uint8_t Uint8
An unsigned 8-bit integer type.
#define SDL_stack_alloc(type, count)
int(* close)(struct SDL_RWops *context)
SDL_RWops * SDL_RWFromFP(void *fp, SDL_bool autoclose)
size_t Android_JNI_FileWrite(SDL_RWops *ctx, const void *buffer, size_t size, size_t num)
size_t SDL_WriteBE32(SDL_RWops *dst, Uint32 value)
static Sint64 mem_seek(SDL_RWops *context, Sint64 offset, int whence)
Uint32 SDL_ReadLE32(SDL_RWops *src)
size_t SDL_WriteLE64(SDL_RWops *dst, Uint64 value)
Sint64(* size)(struct SDL_RWops *context)
#define SDL_OutOfMemory()
SDL_RWops * SDL_RWFromMem(void *mem, int size)
int WIN_SetError(const char *prefix)
union SDL_RWops::@10 hidden
#define SDL_RWOPS_STDFILE
size_t Android_JNI_FileRead(SDL_RWops *ctx, void *buffer, size_t size, size_t maxnum)
#define SDL_RWOPS_MEMORY_RO
size_t SDL_WriteU8(SDL_RWops *dst, Uint8 value)
size_t(* read)(struct SDL_RWops *context, void *ptr, size_t size, size_t maxnum)
uint16_t Uint16
An unsigned 16-bit integer type.
Uint8 SDL_ReadU8(SDL_RWops *src)
GLsizei const GLchar *const * path
Uint64 SDL_ReadBE64(SDL_RWops *src)
int64_t Sint64
A signed 64-bit integer type.
#define SDL_stack_free(data)
size_t SDL_WriteLE16(SDL_RWops *dst, Uint16 value)
static size_t mem_read(SDL_RWops *context, void *ptr, size_t size, size_t maxnum)
#define SDL_AndroidGetInternalStoragePath
GLfloat GLfloat GLfloat GLfloat h
Sint64 Android_JNI_FileSeek(SDL_RWops *ctx, Sint64 offset, int whence)
Uint16 SDL_ReadLE16(SDL_RWops *src)
Sint64 Android_JNI_FileSize(SDL_RWops *ctx)
#define SDL_RWOPS_JNIFILE