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
12class 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
32class 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
59class 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
87class 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*/
113class 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
131Stream *openStreamFromFSTREAM(const char* filename, const char* mode);
132Stream *reopenStreamFromFd(int fd, const char* mode);
133
134
135#endif
136