10#include "config_hdf.h"
15#include <libdap/debug.h>
16#include <libdap/InternalErr.h>
21#include "HDFCFStrField.h"
22#include "HDF4RequestHandler.h"
32 BESDEBUG(
"h4",
"Coming to HDFCFStrField read "<<endl);
36 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
42 vector<int32>offset32;
43 offset32.resize(rank+1);
45 count32.resize(rank+1);
47 step32.resize(rank+1);
64 nelms = format_constraint (offset.data(), step.data(), count.data());
68 for (
int i = 0; i < rank; i++) {
69 offset32[i] = (int32) offset[i];
70 count32[i] = (int32) count[i];
71 step32[i] = (int32) step[i];
80 if(
false == is_vdata) {
83 if(
false == check_pass_fileid_key) {
84 sdid = SDstart (filename.c_str (), DFACC_READ);
87 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
88 throw InternalErr (__FILE__, __LINE__, eherr.str ());
96 int32 sdsindex = SDreftoindex (sdid, fieldref);
100 eherr <<
"SDS index " << sdsindex <<
" is not right.";
101 throw InternalErr (__FILE__, __LINE__, eherr.str ());
105 sdsid = SDselect (sdid, sdsindex);
109 eherr <<
"SDselect failed.";
110 throw InternalErr (__FILE__, __LINE__, eherr.str ());
113 int32 dim_sizes[H4_MAX_VAR_DIMS];
117 char name[H4_MAX_NC_NAME];
119 r = SDgetinfo (sdsid, name, &sds_rank, dim_sizes,
120 &data_type, &n_attrs);
125 eherr <<
"SDgetinfo failed.";
126 throw InternalErr (__FILE__, __LINE__, eherr.str ());
129 if(sds_rank != (rank+1)) {
133 eherr <<
"The rank of string doesn't match with the rank of character array";
134 throw InternalErr (__FILE__, __LINE__, eherr.str ());
138 count32[rank] = dim_sizes[rank];
140 int32 last_dim_size = dim_sizes[rank];
143 val.resize(nelms*count32[rank]);
145 r = SDreaddata (sdsid, offset32.data(), step32.data(), count32.data(), val.data());
150 eherr <<
"SDreaddata failed.";
151 throw InternalErr (__FILE__, __LINE__, eherr.str ());
154 vector<string>final_val;
155 final_val.resize(nelms);
156 vector<char> temp_buf;
157 temp_buf.resize(last_dim_size+1);
162 for (
int i = 0; i<nelms;i++) {
163 strncpy(temp_buf.data(),val.data()+last_dim_size*i,last_dim_size);
164 temp_buf[last_dim_size]=
'\0';
165 final_val[i] = temp_buf.data();
167 set_value(final_val.data(),nelms);
176 if(
true == check_pass_fileid_key)
180 file_id = Hopen (filename.c_str (), DFACC_READ, 0);
183 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
184 throw InternalErr (__FILE__, __LINE__, eherr.str ());
189 if (Vstart (file_id) < 0) {
192 eherr <<
"This file cannot be open.";
193 throw InternalErr (__FILE__, __LINE__, eherr.str ());
197 int32 vdata_id = VSattach (file_id, fieldref,
"r");
198 if (vdata_id == -1) {
202 eherr <<
"Vdata cannot be attached.";
203 throw InternalErr (__FILE__, __LINE__, eherr.str ());
208 if (VSseek (vdata_id, offset32[0]) == -1) {
213 eherr <<
"VSseek failed at " << offset32[0];
214 throw InternalErr (__FILE__, __LINE__, eherr.str ());
218 if (VSsetfields (vdata_id, fieldname.c_str ()) == -1) {
223 eherr <<
"VSsetfields failed with the name " << fieldname;
224 throw InternalErr (__FILE__, __LINE__, eherr.str ());
227 int32 vdfelms = fieldorder * count32[0] * step32[0];
233 r = VSread (vdata_id, (uint8 *) val.data(), 1+(count32[0] -1)* step32[0],
241 eherr <<
"VSread failed.";
242 throw InternalErr (__FILE__, __LINE__, eherr.str ());
245 vector<string>final_val;
246 final_val.resize(nelms);
248 vector<char> temp_buf;
249 temp_buf.resize(fieldorder+1);
250 for (
int i = 0; i<nelms;i++) {
251 strncpy(temp_buf.data(),val.data()+fieldorder*i*step32[0],fieldorder);
252 temp_buf[fieldorder]=
'\0';
253 final_val[i] = temp_buf.data();
255 set_value(final_val.data(),nelms);
266HDFCFStrField::format_constraint (
int *offset,
int *step,
int *count)
271 Dim_iter p = dim_begin ();
272 while (p != dim_end ()) {
274 int start = dimension_start (p,
true);
275 int stride = dimension_stride (p,
true);
276 int stop = dimension_stop (p,
true);
281 oss <<
"Array/Grid hyperslab start point "<< start <<
282 " is greater than stop point " << stop <<
".";
283 throw Error(malformed_expr, oss.str());
288 count[id] = ((stop - start) / stride) + 1;
292 "=format_constraint():"
293 <<
"id=" <<
id <<
" offset=" << offset[
id]
294 <<
" step=" << step[
id]
295 <<
" count=" << count[
id]
307 while (p != dim_end ()) {
309 int start = dimension_start (p,
true);
310 int stride = dimension_stride (p,
true);
311 int stop = dimension_stop (p,
true);
315 if (stride < 0 || start < 0 || stop < 0 || start > stop) {
318 oss <<
"Array/Grid hyperslab indices are bad: [" << start <<
319 ":" << stride <<
":" << stop <<
"]";
320 throw Error (malformed_expr, oss.str ());
324 if (start == 0 && stop == 0 && stride == 0) {
325 start = dimension_start (p,
false);
326 stride = dimension_stride (p,
false);
327 stop = dimension_stop (p,
false);
332 count[id] = ((stop - start) / stride) + 1;
336 "=format_constraint():"
337 <<
"id=" <<
id <<
" offset=" << offset[
id]
338 <<
" step=" << step[
id]
339 <<
" count=" << count[
id]
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)