37#include "chunked_stream.h"
38#include "chunked_istream.h"
84std::streambuf::int_type
87 DBG(cerr <<
"underflow..." << endl);
88 DBG2(cerr <<
"eback(): " << (
void*)eback() <<
", gptr(): " << (
void*)(gptr()-eback()) <<
", egptr(): " << (
void*)(egptr()-eback()) << endl);
92 return traits_type::to_int_type(*gptr());
98 d_is.read((
char *) &header, 4);
99#if !BYTE_ORDER_PREFIX && HEADER_IN_NETWORK_BYTE_ORDER
102 header = ntohl(header);
109 if (d_is.eof())
return traits_type::eof();
111 if (d_twiddle_bytes) header = bswap_32(header);
114 if (!d_set_twiddle) {
116 d_set_twiddle =
true;
119 uint32_t chunk_size = header & CHUNK_SIZE_MASK;
121 DBG(cerr <<
"underflow: chunk size from header: " << chunk_size << endl);
122 DBG(cerr <<
"underflow: chunk type from header: " << hex << (header & CHUNK_TYPE_MASK) << endl);
123 DBG(cerr <<
"underflow: chunk byte order from header: " << hex << (header & CHUNK_BIG_ENDIAN) << endl);
126 if (chunk_size > d_buf_size) {
127 d_buf_size = chunk_size;
132 if (chunk_size == 0 && (header & CHUNK_TYPE_MASK) == CHUNK_END)
return traits_type::eof();
135 d_is.read(d_buffer, chunk_size);
136 DBG2(cerr <<
"underflow: size read: " << d_is.gcount() <<
", eof: " << d_is.eof() <<
", bad: " << d_is.bad() << endl);
137 if (d_is.bad())
return traits_type::eof();
139 DBG2(cerr <<
"eback(): " << (
void*)eback() <<
", gptr(): " << (
void*)(gptr()-eback()) <<
", egptr(): " << (
void*)(egptr()-eback()) << endl);
142 d_buffer + chunk_size);
144 DBG2(cerr <<
"eback(): " << (
void*)eback() <<
", gptr(): " << (
void*)(gptr()-eback()) <<
", egptr(): " << (
void*)(egptr()-eback()) << endl);
146 switch (header & CHUNK_TYPE_MASK) {
148 DBG2(cerr <<
"Found end chunk" << endl);
149 return traits_type::to_int_type(*gptr());
151 return traits_type::to_int_type(*gptr());
157 d_error_message = string(d_buffer, chunk_size);
158 return traits_type::eof();
161 d_error_message =
"Failed to read known chunk header type.";
162 return traits_type::eof();
185 DBG(cerr <<
"xsgetn... num: " << num << endl);
188 if (num <= (egptr() - gptr())) {
189 memcpy(s, gptr(), num);
192 return traits_type::not_eof(num);
196 uint32_t bytes_left_to_read = num;
199 if (gptr() < egptr()) {
200 int bytes_to_transfer = egptr() - gptr();
201 memcpy(s, gptr(), bytes_to_transfer);
202 gbump(bytes_to_transfer);
203 s += bytes_to_transfer;
204 bytes_left_to_read -= bytes_to_transfer;
220 d_is.read((
char *) &header, 4);
222#if !BYTE_ORDER_PREFIX && HEADER_IN_NETWORK_BYTE_ORDER
223 header = ntohl(header);
230 if (d_is.eof())
return traits_type::eof();
232 if (d_twiddle_bytes) header = bswap_32(header);
235 if (!d_set_twiddle) {
237 d_set_twiddle =
true;
241 uint32_t chunk_size = header & CHUNK_SIZE_MASK;
242 DBG(cerr <<
"xsgetn: chunk size from header: " << chunk_size << endl);
243 DBG(cerr <<
"xsgetn: chunk type from header: " << hex << (header & CHUNK_TYPE_MASK) << endl);
244 DBG(cerr <<
"xsgetn: chunk byte order from header: " << hex << (header & CHUNK_BIG_ENDIAN) << endl);
247 if ((header & CHUNK_TYPE_MASK) == CHUNK_ERR) {
252 std::vector<char> message(chunk_size);
253 d_is.read(&message[0], chunk_size);
254 d_error_message = string(&message[0], chunk_size);
256 setg(d_buffer, d_buffer, d_buffer);
259 else if (chunk_size == 0 && (header & CHUNK_TYPE_MASK) == CHUNK_END) {
260 return traits_type::not_eof(num-bytes_left_to_read);
264 else if (chunk_size > bytes_left_to_read) {
265 d_is.read(s, bytes_left_to_read);
266 if (d_is.bad())
return traits_type::eof();
269 uint32_t bytes_leftover = chunk_size - bytes_left_to_read;
271 if (bytes_leftover > d_buf_size) {
272 d_buf_size = chunk_size;
276 d_is.read(d_buffer, bytes_leftover);
277 if (d_is.bad())
return traits_type::eof();
281 d_buffer + bytes_leftover );
283 bytes_left_to_read = 0 ;
287 if (chunk_size > d_buf_size) {
288 d_buf_size = chunk_size;
293 if (chunk_size > 0) {
294 d_is.read(s, chunk_size);
295 if (d_is.bad())
return traits_type::eof();
296 bytes_left_to_read -= chunk_size ;
301 switch (header & CHUNK_TYPE_MASK) {
303 DBG(cerr <<
"Found end chunk" << endl);
311 done = bytes_left_to_read == 0;
317 return traits_type::eof();
321 d_error_message =
"Failed to read known chunk header type.";
322 return traits_type::eof();
326 return traits_type::not_eof(num-bytes_left_to_read);
341std::streambuf::int_type
346 d_is.read((
char *) &header, 4);
348#if !BYTE_ORDER_PREFIX && HEADER_IN_NETWORK_BYTE_ORDER
349 header = ntohl(header);
356 if (d_is.eof())
return traits_type::eof();
358 if (d_twiddle_bytes) header = bswap_32(header);
361 if (!d_set_twiddle) {
363 d_set_twiddle =
true;
367 uint32_t chunk_size = header & CHUNK_SIZE_MASK;
369 DBG(cerr <<
"read_next_chunk: chunk size from header: " << chunk_size << endl);
370 DBG(cerr <<
"read_next_chunk: chunk type from header: " << hex << (header & CHUNK_TYPE_MASK) << endl);
371 DBG(cerr <<
"read_next_chunk: chunk byte order from header: " << hex << (header & CHUNK_BIG_ENDIAN) << endl);
374 if (chunk_size > d_buf_size) {
375 d_buf_size = chunk_size;
380 if (chunk_size == 0 && (header & CHUNK_TYPE_MASK) == CHUNK_END)
return traits_type::eof();
383 d_is.read(d_buffer, chunk_size);
384 DBG2(cerr <<
"read_next_chunk: size read: " << d_is.gcount() <<
", eof: " << d_is.eof() <<
", bad: " << d_is.bad() << endl);
385 if (d_is.bad())
return traits_type::eof();
387 DBG2(cerr <<
"eback(): " << (
void*)eback() <<
", gptr(): " << (
void*)(gptr()-eback()) <<
", egptr(): " << (
void*)(egptr()-eback()) << endl);
390 d_buffer + chunk_size);
392 DBG2(cerr <<
"eback(): " << (
void*)eback() <<
", gptr(): " << (
void*)(gptr()-eback()) <<
", egptr(): " << (
void*)(egptr()-eback()) << endl);
394 switch (header & CHUNK_TYPE_MASK) {
396 DBG(cerr <<
"Found end chunk" << endl);
397 return traits_type::not_eof(chunk_size);
400 return traits_type::not_eof(chunk_size);
406 d_error_message = string(d_buffer, chunk_size);
407 return traits_type::eof();
411 d_error_message =
"Failed to read known chunk header type.";
412 return traits_type::eof();
virtual int_type underflow()
Insert new characters into the buffer This specialization of underflow is called when the gptr() is a...
int_type read_next_chunk()
Read a chunk Normally the chunked nature of a chunked_istream/chunked_inbuf is hidden from the caller...
virtual std::streamsize xsgetn(char *s, std::streamsize num)
Read a block of data This specialization of xsgetn() reads num bytes and puts them in s first reading...
top level DAP object to house generic methods
bool is_host_big_endian()
Does this host use big-endian byte order?