48 static inline bool is_host_big_endian()
50 #ifdef COMPUTE_ENDIAN_AT_RUNTIME
53 char *c =
reinterpret_cast<char*
>(&i);
58 #ifdef WORDS_BIGENDIAN
67 DAP4StreamUnMarshaller::DAP4StreamUnMarshaller(istream &in,
bool is_stream_big_endian)
68 : d_in( in ), d_buf(0)
76 throw Error(
"Failed to allocate memory for data serialization.");
79 xdrmem_create(&d_source, &d_buf,
sizeof(
dods_float64), XDR_DECODE);
83 d_in.exceptions(istream::failbit | istream::badbit);
85 DBG(cerr <<
"Host is big endian: " << is_host_big_endian() << endl);
87 if ((is_host_big_endian() && is_stream_big_endian)
88 || (!is_host_big_endian() && !is_stream_big_endian))
89 d_twiddle_bytes =
false;
91 d_twiddle_bytes =
true;
108 unsigned char *md =
reinterpret_cast<unsigned char*
>(&c);
111 oss.setf(ios::hex, ios::basefield);
113 oss << setfill(
'0') << setw(2) << (
unsigned int)md[i];
122 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_byte));
128 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_int8));
134 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_int16));
142 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_int32));
150 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_int64));
158 if (std::numeric_limits<float>::is_iec559) {
159 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_float32));
160 if (d_twiddle_bytes) {
167 xdr_setpos( &d_source, 0);
170 if (!xdr_float(&d_source, &val))
171 throw Error(
"Network I/O Error. Could not read float 64 data.");
178 if (std::numeric_limits<float>::is_iec559) {
179 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_float64));
180 if (d_twiddle_bytes) {
186 xdr_setpos( &d_source, 0);
189 if (!xdr_double(&d_source, &val))
190 throw Error(
"Network I/O Error. Could not read float 64 data.");
197 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_uint16));
205 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_uint32));
213 d_in.read(reinterpret_cast<char*>(&val),
sizeof(
dods_uint64));
229 d_in.read(reinterpret_cast<char*>(&b), 1);
231 uint64_t v = (b & 0x7f) << 7 * count;
245 vector<char> raw(len+1);
246 d_in.read(&raw[0], len);
249 val.assign(&raw[0], len);
289 *val =
new char[len];
290 d_in.read(*val, len);
304 void DAP4StreamUnMarshaller::m_deserialize_reals(
char *val,
unsigned int num,
int width,
Type type)
308 vector<char> buf(size);
310 xdrmem_create(&xdr, &buf[0], size, XDR_DECODE);
312 xdr_setpos(&d_source, 0);
313 d_in.read(&buf[0], size);
316 throw InternalErr(__FILE__, __LINE__,
"Error deserializing a Float64 array");
318 if (xdr_getpos(&xdr) != size)
319 throw InternalErr(__FILE__, __LINE__,
"Error deserializing a Float64 array");
328 void DAP4StreamUnMarshaller::m_twidle_vector_elements(
char *vals,
unsigned int num,
int width)
334 *local = bswap_16(*local);
342 *local = bswap_32(*local);
350 *local = bswap_64(*local);
356 throw InternalErr(__FILE__, __LINE__,
"Unrecognized word size.");
363 if (type ==
dods_float32_c && !std::numeric_limits<float>::is_iec559) {
365 m_deserialize_reals(val, num, 4, type);
367 else if (type ==
dods_float64_c && !std::numeric_limits<double>::is_iec559) {
368 m_deserialize_reals(val, num, 8, type);
371 d_in.read(val, num * width);
373 m_twidle_vector_elements(val, num, width);
388 int size = num * width;
389 *val =
new char[size];
391 if (type ==
dods_float32_c && !std::numeric_limits<float>::is_iec559) {
392 m_deserialize_reals(*val, num, 4, type);
394 else if (type ==
dods_float64_c && !std::numeric_limits<double>::is_iec559) {
395 m_deserialize_reals(*val, num, 8, type);
398 d_in.read(*val, size);
400 m_twidle_vector_elements(*val, num, width);
408 << (
void *)
this <<
")" << endl ;
virtual void get_uint32(dods_uint32 &val)
virtual ~DAP4StreamUnMarshaller()
virtual void get_vector(char **, unsigned int &, Vector &)
virtual void get_uint64(dods_uint64 &val)
virtual void get_int32(dods_int32 &val)
Type
Identifies the data type.
virtual void dump(ostream &strm) const
dump the contents of this object to the specified ostream
virtual void get_byte(dods_byte &val)
virtual void get_int16(dods_int16 &val)
A class for software fault reporting.
virtual void get_varying_vector(char **val, unsigned int &num)
virtual void get_url(string &val)
virtual void get_int64(dods_int64 &val)
virtual void get_opaque(char *val, unsigned int len)
static const unsigned int c_md5_length
string long_to_string(long val, int base)
static ostream & LMarg(ostream &strm)
static xdrproc_t xdr_coder(const Type &t)
Returns a function used to encode elements of an array.
virtual void get_float32(dods_float32 &val)
A class for error processing.
virtual void get_str(string &val)
virtual void get_float64(dods_float64 &val)
virtual void get_uint16(dods_uint16 &val)
virtual void get_int8(dods_int8 &val)
virtual dods_uint64 get_length_prefix()