11#include "HDFSPArray_VDField.h"
15#include <libdap/debug.h>
18#include <libdap/InternalErr.h>
21#include "HDF4RequestHandler.h"
25#define SIGNED_BYTE_TO_INT32 1
29HDFSPArray_VDField::read ()
32 BESDEBUG(
"h4",
"Coming to HDFSPArray_VDField read "<<endl);
37 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
38 bool check_pass_fileid_key =
false;
39 check_pass_fileid_key = HDFCFUtil::check_beskeys(check_pass_fileid_key_str);
41 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
52 int nelms = format_constraint(offset.data(),step.data(),count.data());
56 if(
true == check_pass_fileid_key)
61 file_id = Hopen (filename.c_str (), DFACC_READ, 0);
64 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
65 throw InternalErr (__FILE__, __LINE__, eherr.str ());
71 if (Vstart (file_id) < 0) {
74 eherr <<
"This file cannot be open.";
75 throw InternalErr (__FILE__, __LINE__, eherr.str ());
79 vdata_id = VSattach (file_id, vdref,
"r");
84 eherr <<
"Vdata cannot be attached.";
85 throw InternalErr (__FILE__, __LINE__, eherr.str ());
92 if (VSseek (vdata_id, (int32) offset[0]) == -1) {
94 eherr <<
"VSseek failed at " << offset[0];
95 throw InternalErr (__FILE__, __LINE__, eherr.str ());
99 if (VSsetfields (vdata_id, fdname.c_str ()) == -1) {
101 eherr <<
"VSsetfields failed with the name " << fdname;
102 throw InternalErr (__FILE__, __LINE__, eherr.str ());
105 int32 vdfelms = fdorder * count[0] * step[0];
115 orival.resize(vdfelms);
118 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
123 eherr <<
"VSread failed.";
124 throw InternalErr (__FILE__, __LINE__, eherr.str ());
129 for (
int i = 0; i < count[0]; i++)
130 for (
int j = 0; j < count[1]; j++)
131 val[i * count[1] + j] =
132 orival[i * fdorder * step[0] + offset[1] + j * step[1]];
135 for (
int i = 0; i < count[0]; i++)
136 val[i] = orival[i * step[0]];
140#ifndef SIGNED_BYTE_TO_INT32
141 set_value ((dods_byte *) val.data(), nelms);
144 newval.resize(nelms);
146 for (
int counter = 0; counter < nelms; counter++)
147 newval[counter] = (int32) (val[counter]);
149 set_value ((dods_int32 *) newval.data(), nelms);
163 orival.resize(vdfelms);
165 r = VSread (vdata_id, orival.data(), 1+(count[0] -1)* step[0], FULL_INTERLACE);
168 eherr <<
"VSread failed.";
169 throw InternalErr (__FILE__, __LINE__, eherr.str ());
173 for (
int i = 0; i < count[0]; i++)
174 for (
int j = 0; j < count[1]; j++)
175 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
178 for (
int i = 0; i < count[0]; i++)
179 val[i] = orival[i * step[0]];
182 set_value ((dods_byte *) val.data(), nelms);
192 orival.resize(vdfelms);
194 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
198 eherr <<
"VSread failed.";
199 throw InternalErr (__FILE__, __LINE__, eherr.str ());
203 for (
int i = 0; i < count[0]; i++)
204 for (
int j = 0; j < count[1]; j++)
205 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
208 for (
int i = 0; i < count[0]; i++)
209 val[i] = orival[i * step[0]];
212 set_value ((dods_int16 *) val.data(), nelms);
222 vector<uint16>orival;
223 orival.resize(vdfelms);
225 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
229 eherr <<
"VSread failed.";
230 throw InternalErr (__FILE__, __LINE__, eherr.str ());
234 for (
int i = 0; i < count[0]; i++)
235 for (
int j = 0; j < count[1]; j++)
236 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
239 for (
int i = 0; i < count[0]; i++)
240 val[i] = orival[i * step[0]];
243 set_value ((dods_uint16 *) val.data(), nelms);
251 orival.resize(vdfelms);
253 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
257 eherr <<
"VSread failed.";
258 throw InternalErr (__FILE__, __LINE__, eherr.str ());
262 for (
int i = 0; i < count[0]; i++)
263 for (
int j = 0; j < count[1]; j++)
264 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
267 for (
int i = 0; i < count[0]; i++)
268 val[i] = orival[i * step[0]];
271 set_value ((dods_int32 *) val.data(), nelms);
281 vector<uint32>orival;
282 orival.resize(vdfelms);
284 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
288 eherr <<
"VSread failed.";
289 throw InternalErr (__FILE__, __LINE__, eherr.str ());
293 for (
int i = 0; i < count[0]; i++)
294 for (
int j = 0; j < count[1]; j++)
295 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
298 for (
int i = 0; i < count[0]; i++)
299 val[i] = orival[i * step[0]];
302 set_value ((dods_uint32 *) val.data(), nelms);
309 vector<float32>orival;
310 orival.resize(vdfelms);
312 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
316 eherr <<
"VSread failed.";
317 throw InternalErr (__FILE__, __LINE__, eherr.str ());
321 for (
int i = 0; i < count[0]; i++)
322 for (
int j = 0; j < count[1]; j++)
323 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
326 for (
int i = 0; i < count[0]; i++)
327 val[i] = orival[i * step[0]];
330 set_value ((dods_float32 *) val.data(), nelms);
339 vector<float64>orival;
340 orival.resize(vdfelms);
342 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
346 eherr <<
"VSread failed.";
347 throw InternalErr (__FILE__, __LINE__, eherr.str ());
351 for (
int i = 0; i < count[0]; i++)
352 for (
int j = 0; j < count[1]; j++)
353 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
356 for (
int i = 0; i < count[0]; i++)
357 val[i] = orival[i * step[0]];
360 set_value ((dods_float64 *) val.data(), nelms);
364 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
367 if (VSdetach (vdata_id) == -1) {
369 eherr <<
"VSdetach failed.";
370 throw InternalErr (__FILE__, __LINE__, eherr.str ());
373 if (Vend (file_id) == -1) {
376 eherr <<
"VSdetach failed.";
377 throw InternalErr (__FILE__, __LINE__, eherr.str ());
390 if (Hclose (file_id) == -1) {
394 eherr <<
"VSdetach failed.";
395 throw InternalErr (__FILE__, __LINE__, eherr.str ());
405HDFSPArray_VDField::format_constraint (
int *offset,
int *step,
int *count)
410 Dim_iter p = dim_begin ();
411 while (p != dim_end ()) {
413 int start = dimension_start (p,
true);
414 int stride = dimension_stride (p,
true);
415 int stop = dimension_stop (p,
true);
420 oss <<
"Array/Grid hyperslab start point "<< start <<
421 " is greater than stop point " << stop <<
".";
422 throw Error(malformed_expr, oss.str());
427 count[id] = ((stop - start) / stride) + 1;
431 "=format_constraint():"
432 <<
"id=" <<
id <<
" offset=" << offset[
id]
433 <<
" step=" << step[
id]
434 <<
" count=" << count[
id]
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)