9 #include "config_hdf.h"
15 #include "InternalErr.h"
19 #include "HDFCFUtil.h"
20 #include "HDFCFStrField.h"
21 #include "HDF4RequestHandler.h"
28 HDFCFStrField::read ()
31 BESDEBUG(
"h4",
"Coming to HDFCFStrField read "<<endl);
36 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
37 bool check_pass_fileid_key =
false;
38 check_pass_fileid_key = HDFCFUtil::check_beskeys(check_pass_fileid_key_str);
40 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
46 vector<int32>offset32;
47 offset32.resize(rank+1);
49 count32.resize(rank+1);
51 step32.resize(rank+1);
68 nelms = format_constraint (&offset[0], &step[0], &count[0]);
72 for (
int i = 0; i < rank; i++) {
73 offset32[i] = (int32) offset[i];
74 count32[i] = (int32) count[i];
75 step32[i] = (int32) step[i];
84 if(
false == is_vdata) {
87 if(
false == check_pass_fileid_key) {
88 sdid = SDstart (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
91 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
92 throw InternalErr (__FILE__, __LINE__, eherr.str ());
100 int32 sdsindex = SDreftoindex (sdid, fieldref);
101 if (sdsindex == -1) {
104 eherr <<
"SDS index " << sdsindex <<
" is not right.";
105 throw InternalErr (__FILE__, __LINE__, eherr.str ());
109 sdsid = SDselect (sdid, sdsindex);
113 eherr <<
"SDselect failed.";
114 throw InternalErr (__FILE__, __LINE__, eherr.str ());
117 int32 dim_sizes[H4_MAX_VAR_DIMS];
118 int32 sds_rank, data_type, n_attrs;
119 char name[H4_MAX_NC_NAME];
121 r = SDgetinfo (sdsid, name, &sds_rank, dim_sizes,
122 &data_type, &n_attrs);
127 eherr <<
"SDgetinfo failed.";
128 throw InternalErr (__FILE__, __LINE__, eherr.str ());
131 if(sds_rank != (rank+1)) {
135 eherr <<
"The rank of string doesn't match with the rank of character array";
136 throw InternalErr (__FILE__, __LINE__, eherr.str ());
140 count32[rank] = dim_sizes[rank];
142 int32 last_dim_size = dim_sizes[rank];
145 val.resize(nelms*count32[rank]);
147 r = SDreaddata (sdsid, &offset32[0], &step32[0], &count32[0], &val[0]);
152 eherr <<
"SDreaddata failed.";
153 throw InternalErr (__FILE__, __LINE__, eherr.str ());
156 vector<string>final_val;
157 final_val.resize(nelms);
158 vector<char> temp_buf;
159 temp_buf.resize(last_dim_size+1);
164 for (
int i = 0; i<nelms;i++) {
165 strncpy(&temp_buf[0],&val[0]+last_dim_size*i,last_dim_size);
166 temp_buf[last_dim_size]=
'\0';
167 final_val[i] = &temp_buf[0];
169 set_value(&final_val[0],nelms);
178 if(
true == check_pass_fileid_key)
182 file_id = Hopen (filename.c_str (), DFACC_READ, 0);
185 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
186 throw InternalErr (__FILE__, __LINE__, eherr.str ());
191 if (Vstart (file_id) < 0) {
194 eherr <<
"This file cannot be open.";
195 throw InternalErr (__FILE__, __LINE__, eherr.str ());
199 int32 vdata_id = VSattach (file_id, fieldref,
"r");
200 if (vdata_id == -1) {
204 eherr <<
"Vdata cannot be attached.";
205 throw InternalErr (__FILE__, __LINE__, eherr.str ());
210 if (VSseek (vdata_id, (int32) offset32[0]) == -1) {
215 eherr <<
"VSseek failed at " << offset32[0];
216 throw InternalErr (__FILE__, __LINE__, eherr.str ());
220 if (VSsetfields (vdata_id, fieldname.c_str ()) == -1) {
225 eherr <<
"VSsetfields failed with the name " << fieldname;
226 throw InternalErr (__FILE__, __LINE__, eherr.str ());
229 int32 vdfelms = fieldorder * count32[0] * step32[0];
235 r = VSread (vdata_id, (uint8 *) &val[0], 1+(count32[0] -1)* step32[0],
243 eherr <<
"VSread failed.";
244 throw InternalErr (__FILE__, __LINE__, eherr.str ());
247 vector<string>final_val;
248 final_val.resize(nelms);
250 vector<char> temp_buf;
251 temp_buf.resize(fieldorder+1);
252 for (
int i = 0; i<nelms;i++) {
253 strncpy(&temp_buf[0],&val[0]+fieldorder*i*step32[0],fieldorder);
254 temp_buf[fieldorder]=
'\0';
255 final_val[i] = &temp_buf[0];
257 set_value(&final_val[0],nelms);
268 HDFCFStrField::format_constraint (
int *offset,
int *step,
int *count)
273 Dim_iter p = dim_begin ();
274 while (p != dim_end ()) {
276 int start = dimension_start (p,
true);
277 int stride = dimension_stride (p,
true);
278 int stop = dimension_stop (p,
true);
283 oss <<
"Array/Grid hyperslab start point "<< start <<
284 " is greater than stop point " << stop <<
".";
285 throw Error(malformed_expr, oss.str());
290 count[id] = ((stop - start) / stride) + 1;
294 "=format_constraint():"
295 <<
"id=" <<
id <<
" offset=" << offset[
id]
296 <<
" step=" << step[
id]
297 <<
" count=" << count[
id]
309 while (p != dim_end ()) {
311 int start = dimension_start (p,
true);
312 int stride = dimension_stride (p,
true);
313 int stop = dimension_stop (p,
true);
317 if (stride < 0 || start < 0 || stop < 0 || start > stop) {
320 oss <<
"Array/Grid hyperslab indices are bad: [" << start <<
321 ":" << stride <<
":" << stop <<
"]";
322 throw Error (malformed_expr, oss.str ());
326 if (start == 0 && stop == 0 && stride == 0) {
327 start = dimension_start (p,
false);
328 stride = dimension_stride (p,
false);
329 stop = dimension_stop (p,
false);
334 count[id] = ((stop - start) / stride) + 1;
338 "=format_constraint():"
339 <<
"id=" <<
id <<
" offset=" << offset[
id]
340 <<
" step=" << step[
id]
341 <<
" count=" << count[
id]
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)