45#include <libdap/util.h>
46#include <libdap/DAS.h>
47#include <libdap/Error.h>
48#include <libdap/InternalErr.h>
50#include "FreeFormCPP.h"
51#include "FFRequestHandler.h"
56#define ATTR_STRING_QUOTE_FIX
60static void header_to_attributes(AttrTable *at, DATA_BIN_PTR dbin)
62 PROCESS_INFO_LIST pinfo_list = NULL;
63 PROCESS_INFO_PTR hd_pinfo = NULL;
67 int error = db_ask(dbin, DBASK_PROCESS_INFO, FFF_INPUT | FFF_FILE | FFF_HEADER, &pinfo_list);
71 if (error == ERR_GENERAL) {
75 string msg =
"Cannot get attribute values. FreeForm error code: ";
76 append_long_to_string((
long) error, 10, msg);
81 pinfo_list = dll_first(pinfo_list);
82 hd_pinfo = ((PROCESS_INFO_PTR) (pinfo_list)->data.u.pi);
84 VARIABLE_LIST vlist = NULL;
85 VARIABLE_PTR var = NULL;
87 vlist = FFV_FIRST_VARIABLE(PINFO_FORMAT(hd_pinfo));
88 var = ((VARIABLE_PTR) (vlist)->data.u.var);
92 vlist = (vlist)->next;
93 var = ((VARIABLE_PTR) (vlist)->data.u.var);
98 switch (FFV_DATA_TYPE(var)) {
100 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_TEXT, text);
101#ifndef ATTR_STRING_QUOTE_FIX
103 if (strpbrk(text,
" \r\t")) {
105 quoted_text = (string)
"\"" + text +
"\"";
106 at->append_attr(var->name,
"STRING",
107 quoted_text.c_str());
110 at->append_attr(var->name,
"STRING", text);
116 at->append_attr(var->name,
"STRING", text);
122 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_INT8, &int8);
123 snprintf(text,
sizeof(text),
"%d", int8);
124 at->append_attr(var->name,
"BYTE", text);
129 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_INT16, &int16);
130 snprintf(text,
sizeof(text),
"%d", int16);
131 at->append_attr(var->name,
"INT16", text);
136 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_INT32, &int32);
137 snprintf(text,
sizeof(text),
"%d", int32);
138 at->append_attr(var->name,
"INT32", text);
143 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_INT64, &int64);
144 snprintf(text,
sizeof(text),
"%ld", int64);
145 at->append_attr(var->name,
"INT32", text);
150 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_UINT8, &uint8);
151 snprintf(text,
sizeof(text),
"%d", uint8);
152 at->append_attr(var->name,
"BYTE", text);
156 unsigned short uint16;
157 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_UINT16, &uint16);
158 snprintf(text,
sizeof(text),
"%d", uint16);
159 at->append_attr(var->name,
"UINT16", text);
164 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_UINT32, &uint32);
165 snprintf(text,
sizeof(text),
"%u", uint32);
166 at->append_attr(var->name,
"UINT32", text);
170 unsigned long uint64;
171 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_UINT64, &uint64);
172 snprintf(text,
sizeof(text),
"%lu", uint64);
173 at->append_attr(var->name,
"UINT32", text);
178 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_FLOAT32, &float32);
179 snprintf(text,
sizeof(text),
"%f", float32);
180 at->append_attr(var->name,
"FLOAT32", text);
185 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_FLOAT64, &float64);
186 snprintf(text,
sizeof(text),
"%f", float64);
187 at->append_attr(var->name,
"FLOAT64", text);
192 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_ENOTE, &enote);
193 snprintf(text,
sizeof(text),
"%e", enote);
194 at->append_attr(var->name,
"FLOAT64", text);
198 throw InternalErr(__FILE__, __LINE__,
"Unknown FreeForm type!");
200 vlist = (vlist)->next;
201 var = ((VARIABLE_PTR) (vlist)->data.u.var);
205 ff_destroy_process_info_list(pinfo_list);
213void read_attributes(
string filename, AttrTable *at)
216 FF_BUFSIZE_PTR bufsize = NULL;
217 DATA_BIN_PTR dbin = NULL;
218 FF_STD_ARGS_PTR SetUps = NULL;
220 if (!file_exist(filename.c_str()))
221 throw Error((
string)
"Could not open file " + path_to_filename(filename) +
".");
225 SetUps = ff_create_std_args();
227 throw Error(
"ff_das: Insufficient memory");
230 SetUps->user.is_stdin_redirected = 0;
235 SetUps->input_file =
const_cast<char*
>(filename.c_str());
238 if (FFRequestHandler::get_RSS_format_support()) {
239 iff = find_ancillary_rss_formats(filename);
240 SetUps->input_format_file =
const_cast<char*
>(iff.c_str());
243 if (FFRequestHandler::get_Regex_format_support()) {
244 iff = get_Regex_format_file(filename);
246 SetUps->input_format_file =
const_cast<char*
>(iff.c_str());
249 SetUps->output_file = NULL;
252 error = SetDodsDB(SetUps, &dbin, Msgt);
253 if (error && error < ERR_WARNING_ONLY) {
256 ff_destroy_std_args(SetUps);
260 ff_destroy_std_args(SetUps);
263 error = db_ask(dbin, DBASK_FORMAT_SUMMARY, FFF_INPUT, &bufsize);
265 string msg =
"Cannot get Format Summary. FreeForm error code: ";
266 append_long_to_string((
long) error, 10, msg);
270#ifndef ATTR_STRING_QUOTE_FIX
271 at->append_attr(
"Server",
"STRING",
272 "\"DODS FreeFrom based on FFND release " + FFND_LIB_VER +
"\"");
274 at->append_attr(
"Server",
"STRING",
string(
"DODS FreeFrom based on FFND release ") + FFND_LIB_VER);
277 header_to_attributes(at, dbin);
281 ff_destroy_bufsize(bufsize);
288 ff_destroy_bufsize(bufsize);
292static void add_variable_containers(DAS &das,
const string &filename)
throw (Error)
294 if (!file_exist(filename.c_str()))
295 throw Error(
string(
"ff_dds: Could not open file ") + path_to_filename(filename) +
string(
"."));
298 FF_STD_ARGS_PTR SetUps = ff_create_std_args();
300 throw Error(
"Insufficient memory");
302 SetUps->user.is_stdin_redirected = 0;
304 SetUps->input_file =
const_cast<char*
>(filename.c_str());
307 if (FFRequestHandler::get_RSS_format_support()) {
308 iff = find_ancillary_rss_formats(filename);
309 SetUps->input_format_file =
const_cast<char*
>(iff.c_str());
313 if (FFRequestHandler::get_Regex_format_support()) {
314 iff = get_Regex_format_file(filename);
316 SetUps->input_format_file =
const_cast<char*
>(iff.c_str());
319 SetUps->output_file = NULL;
323 DATA_BIN_PTR dbin = NULL;
324 int error = SetDodsDB(SetUps, &dbin, Msgt);
325 if (error && error < ERR_WARNING_ONLY) {
328 ff_destroy_std_args(SetUps);
329 string msg = string(Msgt) +
" FreeForm error code: ";
330 append_long_to_string((
long) error, 10, msg);
334 ff_destroy_std_args(SetUps);
338 char **var_names_vector = NULL;
339 PROCESS_INFO_LIST pinfo_list = NULL;
340 char **dim_names_vector = NULL;
345 error = db_ask(dbin, DBASK_VAR_NAMES, FFF_INPUT | FFF_DATA, &num_names, &var_names_vector);
347 string msg =
"Could not get varible list from the input file. FreeForm error code: ";
348 append_long_to_string((
long) error, 10, msg);
356 error = db_ask(dbin, DBASK_PROCESS_INFO, FFF_INPUT | FFF_DATA, &pinfo_list);
358 string msg =
"Could not get process info for the input file. FreeForm error code: ";
359 append_long_to_string((
long) error, 10, msg);
365 for (
int i = 0; i < num_names; i++) {
366 int num_dim_names = 0;
367 error = db_ask(dbin, DBASK_ARRAY_DIM_NAMES, var_names_vector[i], &num_dim_names, &dim_names_vector);
369 string msg =
"Could not get array dimension names for variable: " + string(var_names_vector[i])
370 + string(
", FreeForm error code: ");
371 append_long_to_string((
long) error, 10, msg);
378 if (num_dim_names == 0)
379 cp = var_names_vector[i];
381 cp = strstr(var_names_vector[i],
"::");
390 pinfo_list = dll_first(pinfo_list);
391 PROCESS_INFO_PTR pinfo = ((PROCESS_INFO_PTR) (pinfo_list)->data.u.pi);
392 FORMAT_PTR iformat = PINFO_FORMAT(pinfo);
393 VARIABLE_PTR var = ff_find_variable(cp, iformat);
398 das.add_table(cp,
new AttrTable);
400 memFree(dim_names_vector,
"**dim_names_vector");
401 dim_names_vector = NULL;
405 if (var_names_vector)
406 memFree(var_names_vector,
"**var_names_vector");
408 ff_destroy_process_info_list(pinfo_list);
409 if (dim_names_vector)
410 memFree(dim_names_vector,
"**dim_names_vector");
417 memFree(var_names_vector,
"**var_names_vector");
418 var_names_vector = NULL;
420 ff_destroy_process_info_list(pinfo_list);
431void ff_get_attributes(DAS &das,
string filename)
throw (Error)
433 AttrTable *attr_table_p =
new AttrTable;
435 das.add_table(
"FF_GLOBAL", attr_table_p);
436 read_attributes(filename, attr_table_p);
441 add_variable_containers(das, filename);