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());
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 ());
120 numswath = inqfunc (
const_cast < char *
>(filename.c_str ()), swathname.data(),
122 if (numswath == -1) {
125 eherr <<
"File " << filename.c_str () <<
" cannot obtain the swath list.";
126 throw InternalErr (__FILE__, __LINE__, eherr.str ());
129 swathid = attachfunc (fileid, swathname.data());
133 string swname_str(swathname.begin(),swathname.end());
134 eherr <<
"Grid/Swath " << swname_str.c_str() <<
" cannot be attached.";
135 throw InternalErr (__FILE__, __LINE__, eherr.str ());
140 int32 tmp_dims[rank];
141 char tmp_dimlist[1024];
144 r = fieldinfofunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
145 &tmp_rank, tmp_dims, &type, tmp_dimlist);
147 detachfunc (swathid);
150 eherr <<
"Field " << fieldname.c_str () <<
" information cannot be obtained.";
151 throw InternalErr (__FILE__, __LINE__, eherr.str ());
161 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
162 offset32.data(), step32.data(), count32.data(), val.data());
164 detachfunc (swathid);
167 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
168 throw InternalErr (__FILE__, __LINE__, eherr.str ());
171#ifndef SIGNED_BYTE_TO_INT32
172 set_value ((dods_byte *) val.data(), nelms);
176 newval.resize(nelms);
177 for (
int counter = 0; counter < nelms; counter++)
178 newval[counter] = (int32) (val[counter]);
180 set_value ((dods_int32 *) newval.data(), nelms);
191 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
192 offset32.data(), step32.data(), count32.data(), val.data());
194 detachfunc (swathid);
197 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
198 throw InternalErr (__FILE__, __LINE__, eherr.str ());
201 set_value ((dods_byte *) val.data(), nelms);
209 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
210 offset32.data(), step32.data(), count32.data(), val.data());
212 detachfunc (swathid);
215 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
216 throw InternalErr (__FILE__, __LINE__, eherr.str ());
219 set_value ((dods_int16 *) val.data(), nelms);
226 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
227 offset32.data(), step32.data(), count32.data(), val.data());
229 detachfunc (swathid);
232 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
233 throw InternalErr (__FILE__, __LINE__, eherr.str ());
236 set_value ((dods_uint16 *) val.data(), nelms);
243 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
244 offset32.data(), step32.data(), count32.data(), val.data());
246 detachfunc (swathid);
249 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
250 throw InternalErr (__FILE__, __LINE__, eherr.str ());
253 set_value ((dods_int32 *) val.data(), nelms);
260 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
261 offset32.data(), step32.data(), count32.data(), val.data());
263 detachfunc (swathid);
266 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
267 throw InternalErr (__FILE__, __LINE__, eherr.str ());
270 set_value ((dods_uint32 *) val.data(), nelms);
277 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
278 offset32.data(), step32.data(), count32.data(), val.data());
280 detachfunc (swathid);
283 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
284 throw InternalErr (__FILE__, __LINE__, eherr.str ());
287 set_value ((dods_float32 *) val.data(), nelms);
294 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
295 offset32.data(), step32.data(), count32.data(), val.data());
297 detachfunc (swathid);
300 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
301 throw InternalErr (__FILE__, __LINE__, eherr.str ());
303 set_value ((dods_float64 *) val.data(), nelms);
310 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
314 r = detachfunc (swathid);
317 throw InternalErr (__FILE__, __LINE__,
"The swath cannot be detached.");
321 r = closefunc (fileid);
325 eherr <<
"Grid/Swath " << filename.c_str () <<
" cannot be closed.";
326 throw InternalErr (__FILE__, __LINE__, eherr.str ());
335HDFEOS2ArraySwathGeoDimMapExtraField::format_constraint (
int *offset,
int *step,
int *count)
340 Dim_iter p = dim_begin ();
341 while (p != dim_end ()) {
343 int start = dimension_start (p,
true);
344 int stride = dimension_stride (p,
true);
345 int stop = dimension_stop (p,
true);
350 oss <<
"Array/Grid hyperslab start point "<< start <<
351 " is greater than stop point " << stop <<
".";
352 throw Error(malformed_expr, oss.str());
357 count[id] = ((stop - start) / stride) + 1;
361 "=format_constraint():"
362 <<
"id=" <<
id <<
" offset=" << offset[
id]
363 <<
" step=" << step[
id]
364 <<
" count=" << count[
id]