]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | Simple DirectMedia Layer | |
3 | Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org> | |
4 | ||
5 | This software is provided 'as-is', without any express or implied | |
6 | warranty. In no event will the authors be held liable for any damages | |
7 | arising from the use of this software. | |
8 | ||
9 | Permission is granted to anyone to use this software for any purpose, | |
10 | including commercial applications, and to alter it and redistribute it | |
11 | freely, subject to the following restrictions: | |
12 | ||
13 | 1. The origin of this software must not be misrepresented; you must not | |
14 | claim that you wrote the original software. If you use this software | |
15 | in a product, an acknowledgment in the product documentation would be | |
16 | appreciated but is not required. | |
17 | 2. Altered source versions must be plainly marked as such, and must not be | |
18 | misrepresented as being the original software. | |
19 | 3. This notice may not be removed or altered from any source distribution. | |
20 | */ | |
21 | ||
22 | /** | |
23 | * \file SDL_rwops.h | |
24 | * | |
25 | * This file provides a general interface for SDL to read and write | |
26 | * data streams. It can easily be extended to files, memory, etc. | |
27 | */ | |
28 | ||
29 | #ifndef _SDL_rwops_h | |
30 | #define _SDL_rwops_h | |
31 | ||
32 | #include "SDL_stdinc.h" | |
33 | #include "SDL_error.h" | |
34 | ||
35 | #include "begin_code.h" | |
36 | /* Set up for C function definitions, even when using C++ */ | |
37 | #ifdef __cplusplus | |
38 | extern "C" { | |
39 | #endif | |
40 | ||
41 | /* RWops Types */ | |
42 | #define SDL_RWOPS_UNKNOWN 0 /* Unknown stream type */ | |
43 | #define SDL_RWOPS_WINFILE 1 /* Win32 file */ | |
44 | #define SDL_RWOPS_STDFILE 2 /* Stdio file */ | |
45 | #define SDL_RWOPS_JNIFILE 3 /* Android asset */ | |
46 | #define SDL_RWOPS_MEMORY 4 /* Memory stream */ | |
47 | #define SDL_RWOPS_MEMORY_RO 5 /* Read-Only memory stream */ | |
48 | ||
49 | /** | |
50 | * This is the read/write operation structure -- very basic. | |
51 | */ | |
52 | typedef struct SDL_RWops | |
53 | { | |
54 | /** | |
55 | * Return the size of the file in this rwops, or -1 if unknown | |
56 | */ | |
57 | Sint64 (SDLCALL * size) (struct SDL_RWops * context); | |
58 | ||
59 | /** | |
60 | * Seek to \c offset relative to \c whence, one of stdio's whence values: | |
61 | * RW_SEEK_SET, RW_SEEK_CUR, RW_SEEK_END | |
62 | * | |
63 | * \return the final offset in the data stream, or -1 on error. | |
64 | */ | |
65 | Sint64 (SDLCALL * seek) (struct SDL_RWops * context, Sint64 offset, | |
66 | int whence); | |
67 | ||
68 | /** | |
69 | * Read up to \c maxnum objects each of size \c size from the data | |
70 | * stream to the area pointed at by \c ptr. | |
71 | * | |
72 | * \return the number of objects read, or 0 at error or end of file. | |
73 | */ | |
74 | size_t (SDLCALL * read) (struct SDL_RWops * context, void *ptr, | |
75 | size_t size, size_t maxnum); | |
76 | ||
77 | /** | |
78 | * Write exactly \c num objects each of size \c size from the area | |
79 | * pointed at by \c ptr to data stream. | |
80 | * | |
81 | * \return the number of objects written, or 0 at error or end of file. | |
82 | */ | |
83 | size_t (SDLCALL * write) (struct SDL_RWops * context, const void *ptr, | |
84 | size_t size, size_t num); | |
85 | ||
86 | /** | |
87 | * Close and free an allocated SDL_RWops structure. | |
88 | * | |
89 | * \return 0 if successful or -1 on write error when flushing data. | |
90 | */ | |
91 | int (SDLCALL * close) (struct SDL_RWops * context); | |
92 | ||
93 | Uint32 type; | |
94 | union | |
95 | { | |
96 | #if defined(ANDROID) | |
97 | struct | |
98 | { | |
99 | void *fileNameRef; | |
100 | void *inputStreamRef; | |
101 | void *readableByteChannelRef; | |
102 | void *readMethod; | |
103 | void *assetFileDescriptorRef; | |
104 | long position; | |
105 | long size; | |
106 | long offset; | |
107 | int fd; | |
108 | } androidio; | |
109 | #elif defined(__WIN32__) | |
110 | struct | |
111 | { | |
112 | SDL_bool append; | |
113 | void *h; | |
114 | struct | |
115 | { | |
116 | void *data; | |
117 | size_t size; | |
118 | size_t left; | |
119 | } buffer; | |
120 | } windowsio; | |
121 | #endif | |
122 | ||
123 | #ifdef HAVE_STDIO_H | |
124 | struct | |
125 | { | |
126 | SDL_bool autoclose; | |
127 | FILE *fp; | |
128 | } stdio; | |
129 | #endif | |
130 | struct | |
131 | { | |
132 | Uint8 *base; | |
133 | Uint8 *here; | |
134 | Uint8 *stop; | |
135 | } mem; | |
136 | struct | |
137 | { | |
138 | void *data1; | |
139 | void *data2; | |
140 | } unknown; | |
141 | } hidden; | |
142 | ||
143 | } SDL_RWops; | |
144 | ||
145 | ||
146 | /** | |
147 | * \name RWFrom functions | |
148 | * | |
149 | * Functions to create SDL_RWops structures from various data streams. | |
150 | */ | |
151 | /*@{*/ | |
152 | ||
153 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFile(const char *file, | |
154 | const char *mode); | |
155 | ||
156 | #ifdef HAVE_STDIO_H | |
157 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(FILE * fp, | |
158 | SDL_bool autoclose); | |
159 | #else | |
160 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(void * fp, | |
161 | SDL_bool autoclose); | |
162 | #endif | |
163 | ||
164 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromMem(void *mem, int size); | |
165 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromConstMem(const void *mem, | |
166 | int size); | |
167 | ||
168 | /*@}*//*RWFrom functions*/ | |
169 | ||
170 | ||
171 | extern DECLSPEC SDL_RWops *SDLCALL SDL_AllocRW(void); | |
172 | extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops * area); | |
173 | ||
174 | #define RW_SEEK_SET 0 /**< Seek from the beginning of data */ | |
175 | #define RW_SEEK_CUR 1 /**< Seek relative to current read point */ | |
176 | #define RW_SEEK_END 2 /**< Seek relative to the end of data */ | |
177 | ||
178 | /** | |
179 | * \name Read/write macros | |
180 | * | |
181 | * Macros to easily read and write from an SDL_RWops structure. | |
182 | */ | |
183 | /*@{*/ | |
184 | #define SDL_RWsize(ctx) (ctx)->size(ctx) | |
185 | #define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) | |
186 | #define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) | |
187 | #define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) | |
188 | #define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) | |
189 | #define SDL_RWclose(ctx) (ctx)->close(ctx) | |
190 | /*@}*//*Read/write macros*/ | |
191 | ||
192 | ||
193 | /** | |
194 | * \name Read endian functions | |
195 | * | |
196 | * Read an item of the specified endianness and return in native format. | |
197 | */ | |
198 | /*@{*/ | |
199 | extern DECLSPEC Uint8 SDLCALL SDL_ReadU8(SDL_RWops * src); | |
200 | extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops * src); | |
201 | extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops * src); | |
202 | extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops * src); | |
203 | extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops * src); | |
204 | extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops * src); | |
205 | extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops * src); | |
206 | /*@}*//*Read endian functions*/ | |
207 | ||
208 | /** | |
209 | * \name Write endian functions | |
210 | * | |
211 | * Write an item of native format to the specified endianness. | |
212 | */ | |
213 | /*@{*/ | |
214 | extern DECLSPEC size_t SDLCALL SDL_WriteU8(SDL_RWops * dst, Uint8 value); | |
215 | extern DECLSPEC size_t SDLCALL SDL_WriteLE16(SDL_RWops * dst, Uint16 value); | |
216 | extern DECLSPEC size_t SDLCALL SDL_WriteBE16(SDL_RWops * dst, Uint16 value); | |
217 | extern DECLSPEC size_t SDLCALL SDL_WriteLE32(SDL_RWops * dst, Uint32 value); | |
218 | extern DECLSPEC size_t SDLCALL SDL_WriteBE32(SDL_RWops * dst, Uint32 value); | |
219 | extern DECLSPEC size_t SDLCALL SDL_WriteLE64(SDL_RWops * dst, Uint64 value); | |
220 | extern DECLSPEC size_t SDLCALL SDL_WriteBE64(SDL_RWops * dst, Uint64 value); | |
221 | /*@}*//*Write endian functions*/ | |
222 | ||
223 | ||
224 | /* Ends C function definitions when using C++ */ | |
225 | #ifdef __cplusplus | |
226 | } | |
227 | #endif | |
228 | #include "close_code.h" | |
229 | ||
230 | #endif /* _SDL_rwops_h */ | |
231 | ||
232 | /* vi: set ts=4 sw=4 expandtab: */ |