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);
36 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
47 int nelms = format_constraint(offset.data(),step.data(),count.data());
51 if(
true == check_pass_fileid_key)
56 file_id = Hopen (filename.c_str (), DFACC_READ, 0);
59 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
60 throw InternalErr (__FILE__, __LINE__, eherr.str ());
66 if (Vstart (file_id) < 0) {
69 eherr <<
"This file cannot be open.";
70 throw InternalErr (__FILE__, __LINE__, eherr.str ());
74 vdata_id = VSattach (file_id, vdref,
"r");
79 eherr <<
"Vdata cannot be attached.";
80 throw InternalErr (__FILE__, __LINE__, eherr.str ());
87 if (VSseek (vdata_id, (int32) offset[0]) == -1) {
89 eherr <<
"VSseek failed at " << offset[0];
90 throw InternalErr (__FILE__, __LINE__, eherr.str ());
94 if (VSsetfields (vdata_id, fdname.c_str ()) == -1) {
96 eherr <<
"VSsetfields failed with the name " << fdname;
97 throw InternalErr (__FILE__, __LINE__, eherr.str ());
100 int32 vdfelms = fdorder * count[0] * step[0];
110 orival.resize(vdfelms);
113 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
118 eherr <<
"VSread failed.";
119 throw InternalErr (__FILE__, __LINE__, eherr.str ());
124 for (
int i = 0; i < count[0]; i++)
125 for (
int j = 0; j < count[1]; j++)
126 val[i * count[1] + j] =
127 orival[i * fdorder * step[0] + offset[1] + j * step[1]];
130 for (
int i = 0; i < count[0]; i++)
131 val[i] = orival[i * step[0]];
135#ifndef SIGNED_BYTE_TO_INT32
136 set_value ((dods_byte *) val.data(), nelms);
139 newval.resize(nelms);
141 for (
int counter = 0; counter < nelms; counter++)
142 newval[counter] = (int32) (val[counter]);
144 set_value ((dods_int32 *) newval.data(), nelms);
158 orival.resize(vdfelms);
160 r = VSread (vdata_id, orival.data(), 1+(count[0] -1)* step[0], FULL_INTERLACE);
163 eherr <<
"VSread failed.";
164 throw InternalErr (__FILE__, __LINE__, eherr.str ());
168 for (
int i = 0; i < count[0]; i++)
169 for (
int j = 0; j < count[1]; j++)
170 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
173 for (
int i = 0; i < count[0]; i++)
174 val[i] = orival[i * step[0]];
177 set_value ((dods_byte *) val.data(), nelms);
187 orival.resize(vdfelms);
189 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
193 eherr <<
"VSread failed.";
194 throw InternalErr (__FILE__, __LINE__, eherr.str ());
198 for (
int i = 0; i < count[0]; i++)
199 for (
int j = 0; j < count[1]; j++)
200 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
203 for (
int i = 0; i < count[0]; i++)
204 val[i] = orival[i * step[0]];
207 set_value ((dods_int16 *) val.data(), nelms);
217 vector<uint16>orival;
218 orival.resize(vdfelms);
220 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
224 eherr <<
"VSread failed.";
225 throw InternalErr (__FILE__, __LINE__, eherr.str ());
229 for (
int i = 0; i < count[0]; i++)
230 for (
int j = 0; j < count[1]; j++)
231 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
234 for (
int i = 0; i < count[0]; i++)
235 val[i] = orival[i * step[0]];
238 set_value ((dods_uint16 *) val.data(), nelms);
246 orival.resize(vdfelms);
248 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
252 eherr <<
"VSread failed.";
253 throw InternalErr (__FILE__, __LINE__, eherr.str ());
257 for (
int i = 0; i < count[0]; i++)
258 for (
int j = 0; j < count[1]; j++)
259 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
262 for (
int i = 0; i < count[0]; i++)
263 val[i] = orival[i * step[0]];
266 set_value ((dods_int32 *) val.data(), nelms);
276 vector<uint32>orival;
277 orival.resize(vdfelms);
279 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
283 eherr <<
"VSread failed.";
284 throw InternalErr (__FILE__, __LINE__, eherr.str ());
288 for (
int i = 0; i < count[0]; i++)
289 for (
int j = 0; j < count[1]; j++)
290 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
293 for (
int i = 0; i < count[0]; i++)
294 val[i] = orival[i * step[0]];
297 set_value ((dods_uint32 *) val.data(), nelms);
304 vector<float32>orival;
305 orival.resize(vdfelms);
307 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
311 eherr <<
"VSread failed.";
312 throw InternalErr (__FILE__, __LINE__, eherr.str ());
316 for (
int i = 0; i < count[0]; i++)
317 for (
int j = 0; j < count[1]; j++)
318 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
321 for (
int i = 0; i < count[0]; i++)
322 val[i] = orival[i * step[0]];
325 set_value ((dods_float32 *) val.data(), nelms);
334 vector<float64>orival;
335 orival.resize(vdfelms);
337 r = VSread (vdata_id, (uint8 *) orival.data(), 1+(count[0] -1)* step[0],
341 eherr <<
"VSread failed.";
342 throw InternalErr (__FILE__, __LINE__, eherr.str ());
346 for (
int i = 0; i < count[0]; i++)
347 for (
int j = 0; j < count[1]; j++)
348 val[i * count[1] + j] = orival[i * fdorder * step[0] + offset[1] + j * step[1]];
351 for (
int i = 0; i < count[0]; i++)
352 val[i] = orival[i * step[0]];
355 set_value ((dods_float64 *) val.data(), nelms);
359 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
362 if (VSdetach (vdata_id) == -1) {
364 eherr <<
"VSdetach failed.";
365 throw InternalErr (__FILE__, __LINE__, eherr.str ());
368 if (Vend (file_id) == -1) {
371 eherr <<
"VSdetach failed.";
372 throw InternalErr (__FILE__, __LINE__, eherr.str ());
390HDFSPArray_VDField::format_constraint (
int *offset,
int *step,
int *count)
395 Dim_iter p = dim_begin ();
396 while (p != dim_end ()) {
398 int start = dimension_start (p,
true);
399 int stride = dimension_stride (p,
true);
400 int stop = dimension_stop (p,
true);
405 oss <<
"Array/Grid hyperslab start point "<< start <<
406 " is greater than stop point " << stop <<
".";
407 throw Error(malformed_expr, oss.str());
412 count[id] = ((stop - start) / stride) + 1;
416 "=format_constraint():"
417 <<
"id=" <<
id <<
" offset=" << offset[
id]
418 <<
" step=" << step[
id]
419 <<
" count=" << count[
id]
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)