16#include "HDFEOS2ArraySwathGeoDimMapExtraField.h"
20#include <libdap/debug.h>
23#include <libdap/InternalErr.h>
29#define SIGNED_BYTE_TO_INT32 1
33HDFEOS2ArraySwathGeoDimMapExtraField::read ()
36 BESDEBUG(
"h4",
"Coming to HDFEOS2ArraySwathGeoDimMapExtraField read "<<endl);
50 int nelms = format_constraint(offset.data(),step.data(),count.data());
53 vector<int32>offset32;
54 offset32.resize(rank);
61 for (
int i = 0; i < rank; i++) {
62 offset32[i] = (int32) offset[i];
63 count32[i] = (int32) count[i];
64 step32[i] = (int32) step[i];
67 int32 (*openfunc) (
char *, intn);
68 intn (*closefunc) (int32);
69 int32 (*attachfunc) (int32,
char *);
70 intn (*detachfunc) (int32);
71 intn (*fieldinfofunc) (int32,
char *, int32 *, int32 *, int32 *,
char *);
72 intn (*readfieldfunc) (int32,
char *, int32 *, int32 *, int32 *,
void *);
73 int32 (*inqfunc) (
char *,
char *, int32 *);
79 attachfunc = SWattach;
80 detachfunc = SWdetach;
81 fieldinfofunc = SWfieldinfo;
82 readfieldfunc = SWreadfield;
91 fileid = openfunc (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
94 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
95 throw InternalErr (__FILE__, __LINE__, eherr.str ());
100 int32 swathnamesize = 0;
101 numswath = inqfunc (
const_cast < char *
>(filename.c_str ()), NULL,
104 if (numswath == -1) {
107 eherr <<
"File " << filename.c_str () <<
" cannot obtain the swath list.";
108 throw InternalErr (__FILE__, __LINE__, eherr.str ());
114 eherr <<
" Currently we only support reading geo-location fields from one swath."
115 <<
" This file has more than one swath. ";
116 throw InternalErr (__FILE__, __LINE__, eherr.str ());
119 char *swathname =
new char[swathnamesize + 1];
120 numswath = inqfunc (
const_cast < char *
>(filename.c_str ()), swathname,
122 if (numswath == -1) {
126 eherr <<
"File " << filename.c_str () <<
" cannot obtain the swath list.";
127 throw InternalErr (__FILE__, __LINE__, eherr.str ());
130 swathid = attachfunc (fileid, swathname);
134 eherr <<
"Grid/Swath " << swathname <<
" cannot be attached.";
136 throw InternalErr (__FILE__, __LINE__, eherr.str ());
142 int32 tmp_dims[rank];
143 char tmp_dimlist[1024];
146 r = fieldinfofunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
147 &tmp_rank, tmp_dims, &type, tmp_dimlist);
149 detachfunc (swathid);
152 eherr <<
"Field " << fieldname.c_str () <<
" information cannot be obtained.";
153 throw InternalErr (__FILE__, __LINE__, eherr.str ());
163 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
164 offset32.data(), step32.data(), count32.data(), val.data());
166 detachfunc (swathid);
169 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
170 throw InternalErr (__FILE__, __LINE__, eherr.str ());
173#ifndef SIGNED_BYTE_TO_INT32
174 set_value ((dods_byte *) val.data(), nelms);
178 newval.resize(nelms);
179 for (
int counter = 0; counter < nelms; counter++)
180 newval[counter] = (int32) (val[counter]);
182 set_value ((dods_int32 *) newval.data(), nelms);
193 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
194 offset32.data(), step32.data(), count32.data(), val.data());
196 detachfunc (swathid);
199 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
200 throw InternalErr (__FILE__, __LINE__, eherr.str ());
203 set_value ((dods_byte *) val.data(), nelms);
211 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
212 offset32.data(), step32.data(), count32.data(), val.data());
214 detachfunc (swathid);
217 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
218 throw InternalErr (__FILE__, __LINE__, eherr.str ());
221 set_value ((dods_int16 *) val.data(), nelms);
228 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
229 offset32.data(), step32.data(), count32.data(), val.data());
231 detachfunc (swathid);
234 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
235 throw InternalErr (__FILE__, __LINE__, eherr.str ());
238 set_value ((dods_uint16 *) val.data(), nelms);
245 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
246 offset32.data(), step32.data(), count32.data(), val.data());
248 detachfunc (swathid);
251 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
252 throw InternalErr (__FILE__, __LINE__, eherr.str ());
255 set_value ((dods_int32 *) val.data(), nelms);
262 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
263 offset32.data(), step32.data(), count32.data(), val.data());
265 detachfunc (swathid);
268 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
269 throw InternalErr (__FILE__, __LINE__, eherr.str ());
272 set_value ((dods_uint32 *) val.data(), nelms);
279 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
280 offset32.data(), step32.data(), count32.data(), val.data());
282 detachfunc (swathid);
285 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
286 throw InternalErr (__FILE__, __LINE__, eherr.str ());
289 set_value ((dods_float32 *) val.data(), nelms);
296 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
297 offset32.data(), step32.data(), count32.data(), val.data());
299 detachfunc (swathid);
302 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
303 throw InternalErr (__FILE__, __LINE__, eherr.str ());
305 set_value ((dods_float64 *) val.data(), nelms);
312 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
316 r = detachfunc (swathid);
319 throw InternalErr (__FILE__, __LINE__,
"The swath cannot be detached.");
323 r = closefunc (fileid);
327 eherr <<
"Grid/Swath " << filename.c_str () <<
" cannot be closed.";
328 throw InternalErr (__FILE__, __LINE__, eherr.str ());
337HDFEOS2ArraySwathGeoDimMapExtraField::format_constraint (
int *offset,
int *step,
int *count)
342 Dim_iter p = dim_begin ();
343 while (p != dim_end ()) {
345 int start = dimension_start (p,
true);
346 int stride = dimension_stride (p,
true);
347 int stop = dimension_stop (p,
true);
352 oss <<
"Array/Grid hyperslab start point "<< start <<
353 " is greater than stop point " << stop <<
".";
354 throw Error(malformed_expr, oss.str());
359 count[id] = ((stop - start) / stride) + 1;
363 "=format_constraint():"
364 <<
"id=" <<
id <<
" offset=" << offset[
id]
365 <<
" step=" << step[
id]
366 <<
" count=" << count[
id]