1 | /*****************************************************************************\ |
2 | Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. |
3 | This file is licensed under the Snes9x License. |
4 | For further information, consult the LICENSE file in the root directory. |
5 | \*****************************************************************************/ |
6 | |
7 | #ifndef _STREAM_H_ |
8 | #define _STREAM_H_ |
9 | |
10 | #include <string> |
11 | |
12 | class Stream |
13 | { |
14 | public: |
15 | Stream (void); |
16 | virtual ~Stream (void); |
17 | virtual int get_char (void) = 0; |
18 | virtual char * gets (char *, size_t) = 0; |
19 | virtual char * getline (void); // free() when done |
20 | virtual std::string getline (bool &); |
21 | virtual size_t read (void *, size_t) = 0; |
22 | virtual size_t write (void *, size_t) = 0; |
23 | virtual size_t pos (void) = 0; |
24 | virtual size_t size (void) = 0; |
25 | virtual int revert (uint8 origin, int32 offset) = 0; |
26 | virtual void closeStream() = 0; |
27 | |
28 | protected: |
29 | size_t pos_from_origin_offset(uint8 origin, int32 offset); |
30 | }; |
31 | |
32 | class fStream : public Stream |
33 | { |
34 | public: |
35 | fStream (FSTREAM); |
36 | virtual ~fStream (void); |
37 | virtual int get_char (void); |
38 | virtual char * gets (char *, size_t); |
39 | virtual size_t read (void *, size_t); |
40 | virtual size_t write (void *, size_t); |
41 | virtual size_t pos (void); |
42 | virtual size_t size (void); |
43 | virtual int revert (uint8 origin, int32 offset); |
44 | virtual void closeStream(); |
45 | |
46 | private: |
47 | FSTREAM fp; |
48 | }; |
49 | |
50 | #ifdef UNZIP_SUPPORT |
51 | # ifdef SYSTEM_ZIP |
52 | # include <minizip/unzip.h> |
53 | # else |
54 | # include "unzip.h" |
55 | # endif |
56 | |
57 | #define unz_BUFFSIZ 1024 |
58 | |
59 | class unzStream : public Stream |
60 | { |
61 | public: |
62 | unzStream (unzFile &); |
63 | virtual ~unzStream (void); |
64 | virtual int get_char (void); |
65 | virtual char * gets (char *, size_t); |
66 | virtual size_t read (void *, size_t); |
67 | virtual size_t write (void *, size_t); |
68 | virtual size_t pos (void); |
69 | virtual size_t size (void); |
70 | virtual int revert (uint8 origin, int32 offset); |
71 | virtual void closeStream(); |
72 | |
73 | private: |
74 | void fill_buffer(); |
75 | size_t buffer_remaining(); |
76 | |
77 | unzFile file; |
78 | char buffer[unz_BUFFSIZ]; |
79 | size_t pos_in_buf; |
80 | size_t buf_pos_in_unzipped; |
81 | size_t bytes_in_buf; |
82 | unz_file_pos unz_file_start_pos; |
83 | }; |
84 | |
85 | #endif |
86 | |
87 | class memStream : public Stream |
88 | { |
89 | public: |
90 | memStream (uint8 *,size_t); |
91 | memStream (const uint8 *,size_t); |
92 | virtual ~memStream (void); |
93 | virtual int get_char (void); |
94 | virtual char * gets (char *, size_t); |
95 | virtual size_t read (void *, size_t); |
96 | virtual size_t write (void *, size_t); |
97 | virtual size_t pos (void); |
98 | virtual size_t size (void); |
99 | virtual int revert (uint8 origin, int32 offset); |
100 | virtual void closeStream(); |
101 | |
102 | private: |
103 | uint8 *mem; |
104 | size_t msize; |
105 | size_t remaining; |
106 | uint8 *head; |
107 | bool readonly; |
108 | }; |
109 | |
110 | /* dummy stream that always reads 0 and writes nowhere |
111 | but counts bytes written |
112 | */ |
113 | class nulStream : public Stream |
114 | { |
115 | public: |
116 | nulStream (void); |
117 | virtual ~nulStream (void); |
118 | virtual int get_char (void); |
119 | virtual char * gets (char *, size_t); |
120 | virtual size_t read (void *, size_t); |
121 | virtual size_t write (void *, size_t); |
122 | virtual size_t pos (void); |
123 | virtual size_t size (void); |
124 | virtual int revert (uint8 origin, int32 offset); |
125 | virtual void closeStream(); |
126 | |
127 | private: |
128 | size_t bytes_written; |
129 | }; |
130 | |
131 | Stream *openStreamFromFSTREAM(const char* filename, const char* mode); |
132 | Stream *reopenStreamFromFd(int fd, const char* mode); |
133 | |
134 | |
135 | #endif |
136 | |