]> git.saurik.com Git - wxWidgets.git/blob - src/tiff/contrib/stream/tiffstream.cpp
No changes, just use wxRecursionGuard instead of manual boolean flag.
[wxWidgets.git] / src / tiff / contrib / stream / tiffstream.cpp
1 // tiff stream interface class implementation
2
3 #include "tiffstream.h"
4
5 const char* TiffStream::m_name = "TiffStream";
6
7 TiffStream::TiffStream()
8 {
9 m_tif = NULL;
10
11
12 m_inStream = NULL;
13 m_outStream = NULL;
14 m_ioStream = NULL;
15
16 m_streamLength = 0;
17
18 m_this = reinterpret_cast<thandle_t>(this);
19 };
20
21 TiffStream::~TiffStream()
22 {
23 if(m_tif != NULL) TIFFClose(m_tif);
24 }
25
26 TIFF*
27 TiffStream::makeFileStream(istream* str)
28 {
29 m_inStream = str;
30 m_outStream = NULL;
31 m_ioStream = NULL;
32 m_streamLength = getSize(m_this);
33
34 m_tif = TIFFClientOpen(m_name,
35 "r",
36 m_this,
37 read,
38 write,
39 seek,
40 close,
41 size,
42 map,
43 unmap);
44 return m_tif;
45 }
46
47 TIFF*
48 TiffStream::makeFileStream(ostream* str)
49 {
50 m_inStream = NULL;
51 m_outStream = str;
52 m_ioStream = NULL;
53 m_streamLength = getSize(m_this);
54
55 m_tif = TIFFClientOpen(m_name,
56 "w",
57 m_this,
58 read,
59 write,
60 seek,
61 close,
62 size,
63 map,
64 unmap);
65 return m_tif;
66 }
67
68 TIFF*
69 TiffStream::makeFileStream(iostream* str)
70 {
71 m_inStream = NULL;
72 m_outStream = NULL;
73 m_ioStream = str;
74 m_streamLength = getSize(m_this);
75
76 m_tif = TIFFClientOpen(m_name,
77 "r+w",
78 m_this,
79 read,
80 write,
81 seek,
82 close,
83 size,
84 map,
85 unmap);
86 return m_tif;
87 }
88
89 tsize_t
90 TiffStream::read(thandle_t fd, tdata_t buf, tsize_t size)
91 {
92 istream* istr;
93 TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
94 if(ts->m_inStream != NULL) {
95 istr = ts->m_inStream;
96 } else if(ts->m_ioStream != NULL) {
97 istr = ts->m_ioStream;
98 }
99
100 int remain = ts->m_streamLength - ts->tell(fd);
101 int actual = remain < size ? remain : size;
102 istr->read(reinterpret_cast<char*>(buf), actual);
103 return istr->gcount();
104 }
105
106 tsize_t
107 TiffStream::write(thandle_t fd, tdata_t buf, tsize_t size)
108 {
109 TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
110 ostream* ostr;
111 if(ts->m_outStream != NULL) {
112 ostr = ts->m_outStream;
113 } else if(ts->m_ioStream != NULL) {
114 ostr = ts->m_ioStream;
115 }
116
117 streampos start = ostr->tellp();
118 ostr->write(reinterpret_cast<const char*>(buf), size);
119 return ostr->tellp() - start;
120 }
121
122 toff_t
123 TiffStream::seek(thandle_t fd, toff_t offset, int origin)
124 {
125 TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
126 if(ts->seekInt(fd, offset, origin) == true) return offset;
127 else return -1;
128 }
129
130 int
131 TiffStream::close(thandle_t fd)
132 {
133 TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
134 if(ts->m_inStream != NULL) {
135 ts->m_inStream = NULL;
136 return 0;
137 } else if(ts->m_outStream != NULL) {
138 ts->m_outStream = NULL;
139 return 0;
140 } else if(ts->m_ioStream != NULL) {
141 ts->m_ioStream = NULL;
142 return 0;
143 }
144 return -1;
145 }
146
147 toff_t
148 TiffStream::size(thandle_t fd)
149 {
150 TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
151 return ts->getSize(fd);
152 }
153
154 int
155 TiffStream::map(thandle_t fd, tdata_t* phase, toff_t* psize)
156 {
157 return 0;
158 }
159
160 void
161 TiffStream::unmap(thandle_t fd, tdata_t base, tsize_t size)
162 {
163 }
164
165 unsigned int
166 TiffStream::getSize(thandle_t fd)
167 {
168 if(!isOpen(fd)) return 0;
169
170 unsigned int pos = tell(fd);
171 seekInt(fd, 0, end);
172 unsigned int size = tell(fd);
173 seekInt(fd, pos, beg);
174
175 return size;
176 }
177
178 unsigned int
179 TiffStream::tell(thandle_t fd)
180 {
181 TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
182 if(ts->m_inStream != NULL) {
183 return ts->m_inStream->tellg();
184 } else if(ts->m_outStream != NULL) {
185 return ts->m_outStream->tellp();
186 } else if(ts->m_ioStream != NULL) {
187 return ts->m_ioStream->tellg();
188 }
189 return 0;
190 }
191
192 bool
193 TiffStream::seekInt(thandle_t fd, unsigned int offset, int origin)
194 {
195 if(!isOpen(fd)) return false;
196
197 ios::seek_dir org;
198 switch(origin) {
199 case beg:
200 org = ios::beg;
201 break;
202 case cur:
203 org = ios::cur;
204 break;
205 case end:
206 org = ios::end;
207 break;
208 }
209
210 TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
211 if(ts->m_inStream != NULL) {
212 ts->m_inStream->seekg(offset, org);
213 return true;
214 } else if(ts->m_outStream != NULL) {
215 ts->m_outStream->seekp(offset, org);
216 return true;
217 } else if(ts->m_ioStream != NULL) {
218 ts->m_ioStream->seekg(offset, org);
219 ts->m_ioStream->seekp(offset, org);
220 return true;
221 }
222 return false;
223 }
224
225 bool
226 TiffStream::isOpen(thandle_t fd)
227 {
228 TiffStream* ts = reinterpret_cast<TiffStream*>(fd);
229 return (ts->m_inStream != NULL ||
230 ts->m_outStream != NULL ||
231 ts->m_ioStream != NULL);
232 }/*
233 * Local Variables:
234 * mode: c++
235 * c-basic-offset: 8
236 * fill-column: 78
237 * End:
238 */