14 #include "InternalErr.h"
20 #define SIGNED_BYTE_TO_INT32 1
27 BESDEBUG(
"h4",
"Coming to HDFSPArray_RealField read "<<endl);
29 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
30 bool check_pass_fileid_key =
false;
42 int nelms = format_constraint (&offset[0], &step[0], &count[0]);
45 vector<int32>offset32;
46 offset32.resize(rank);
53 for (
int i = 0; i < rank; i++) {
54 offset32[i] = (int32) offset[i];
55 count32[i] = (int32) count[i];
56 step32[i] = (int32) step[i];
63 if(
false == check_pass_fileid_key) {
64 sdid = SDstart (const_cast < char *>(filename.c_str ()), DFACC_READ);
67 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
68 throw InternalErr (__FILE__, __LINE__, eherr.str ());
79 int32 sdsindex = SDreftoindex (sdid, (int32) fieldref);
83 eherr <<
"SDS index " << sdsindex <<
" is not right.";
84 throw InternalErr (__FILE__, __LINE__, eherr.str ());
88 sdsid = SDselect (sdid, sdsindex);
92 eherr <<
"SDselect failed.";
93 throw InternalErr (__FILE__, __LINE__, eherr.str ());
106 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
111 eherr <<
"SDreaddata failed.";
112 throw InternalErr (__FILE__, __LINE__, eherr.str ());
115 #ifndef SIGNED_BYTE_TO_INT32
116 set_value ((dods_byte *) &val[0], nelms);
119 newval.resize(nelms);
120 for (
int counter = 0; counter < nelms; counter++)
121 newval[counter] = (int32) (val[counter]);
123 set_value ((dods_int32 *) &newval[0], nelms);
133 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
139 eherr <<
"SDreaddata failed";
140 throw InternalErr (__FILE__, __LINE__, eherr.str ());
143 set_value ((dods_byte *) &val[0], nelms);
151 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
157 eherr <<
"SDreaddata failed";
158 throw InternalErr (__FILE__, __LINE__, eherr.str ());
172 set_value ((dods_int16 *) &val[0], nelms);
180 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
185 eherr <<
"SDreaddata failed";
186 throw InternalErr (__FILE__, __LINE__, eherr.str ());
189 set_value ((dods_uint16 *) &val[0], nelms);
197 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
203 eherr <<
"SDreaddata failed";
204 throw InternalErr (__FILE__, __LINE__, eherr.str ());
207 set_value ((dods_int32 *) &val[0], nelms);
214 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
220 eherr <<
"SDreaddata failed";
221 throw InternalErr (__FILE__, __LINE__, eherr.str ());
223 set_value ((dods_uint32 *) &val[0], nelms);
230 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
236 eherr <<
"SDreaddata failed";
237 throw InternalErr (__FILE__, __LINE__, eherr.str ());
240 set_value ((dods_float32 *) &val[0], nelms);
247 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
253 eherr <<
"SDreaddata failed";
254 throw InternalErr (__FILE__, __LINE__, eherr.str ());
257 set_value ((dods_float64 *) &val[0], nelms);
263 InternalErr (__FILE__, __LINE__,
"unsupported data type.");
267 r = SDendaccess (sdsid);
270 eherr <<
"SDendaccess failed.";
271 throw InternalErr (__FILE__, __LINE__, eherr.str ());
280 eherr <<
"SDend failed.";
281 throw InternalErr (__FILE__, __LINE__, eherr.str ());
296 Dim_iter p = dim_begin ();
298 while (p != dim_end ()) {
300 int start = dimension_start (p,
true);
301 int stride = dimension_stride (p,
true);
302 int stop = dimension_stop (p,
true);
306 if (stride < 0 || start < 0 || stop < 0 || start > stop) {
309 oss <<
"Array/Grid hyperslab indices are bad: [" << start <<
310 ":" << stride <<
":" << stop <<
"]";
311 throw Error (malformed_expr, oss.str ());
315 if (start == 0 && stop == 0 && stride == 0) {
316 start = dimension_start (p,
false);
317 stride = dimension_stride (p,
false);
318 stop = dimension_stop (p,
false);
323 count[id] = ((stop - start) / stride) + 1;
327 "=format_constraint():"
328 <<
"id=" <<
id <<
" offset=" << offset[
id]
329 <<
" step=" << step[
id]
330 <<
" count=" << count[
id]
int format_constraint(int *cor, int *step, int *edg)
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)
Close HDF4 and HDF-EOS2 file IDs. For performance reasons, we want to keep HDF-EOS2/HDF4 IDs open for...
static bool check_beskeys(const std::string &key)
Check the BES key. This function will check a BES key specified at the file h4.conf.in. If the key's value is either true or yes. The handler claims to find a key and will do some operations. Otherwise, will do different operations. For example, One may find a line H4.EnableCF=true at h4.conf.in. That means, the HDF4 handler will handle the HDF4 files by following CF conventions.
#define BESDEBUG(x, y)
macro used to send debug information to the debug stream