40#include <libdap/InternalErr.h>
41#include <libdap/util.h>
42#include <libdap/debug.h>
44#include "XDSequence.h"
45#include "XDStructure.h"
46#include "get_xml_data.h"
49using namespace xml_data;
53XDSequence::ptr_duplicate()
55 return new XDSequence(*
this);
58XDSequence::XDSequence(
const string &n) :
Sequence(n)
67 Vars_iter p = bt->var_begin();
68 while (p != bt->var_end()) {
69 BaseType *new_bt = basetype_to_xd(*p);
75 BaseType::set_send_p(bt->send_p());
78XDSequence::~XDSequence()
83XDSequence::size()
const
92XDSequence::element_count(
bool leaves)
98 for (Vars_iter iter = d_vars.begin(); iter != d_vars.end(); iter++) {
99 if ((*iter)->send_p())
100 i += (*iter)->element_count(
true);
106XDSequence::start_xml_declaration(XMLWriter *writer,
const char *element)
108 XDOutput::start_xml_declaration(writer);
110 for (Vars_iter p = var_begin(); p != var_end(); ++p) {
111 if ((*p)->send_p()) {
112 dynamic_cast<XDOutput&
>(**p).start_xml_declaration(writer, element);
113 dynamic_cast<XDOutput&
>(**p).end_xml_declaration(writer);
119XDSequence::print_xml_data(XMLWriter *writer,
bool show_type)
125 XDOutput::start_xml_declaration(writer);
127 Sequence *seq =
dynamic_cast<Sequence*
>(d_redirect);
131 const int rows = seq->number_of_rows() ;
132 const int elements = seq->element_count() ;
135 for (
int i = 0; i < rows; ++i) {
136 BESDEBUG(
"yd",
"Working on the " << i <<
"th row" << endl);
138 if (xmlTextWriterStartElement(writer->get_writer(), (
const xmlChar*)
"row") < 0)
139 throw InternalErr(__FILE__, __LINE__,
"Could not write Array element for " + name());
140 if (xmlTextWriterWriteFormatAttribute(writer->get_writer(), (
const xmlChar*)
"number",
"%d", i) < 0)
141 throw InternalErr(__FILE__, __LINE__,
"Could not write number attribute for " + name());
144 for (
int j = 0; j < elements; ++j) {
145 BESDEBUG(
"yd",
"Working on the " << j <<
"th field" << endl);
146 BaseType *bt_ptr = seq->var_value(i, j);
147 BaseType *abt_ptr = basetype_to_xd(bt_ptr);
148 dynamic_cast<XDOutput&
>(*abt_ptr).print_xml_data(writer,
true);
149 BESDEBUG(
"yd",
"Back from print xml data." << endl);
155 if (xmlTextWriterEndElement(writer->get_writer()) < 0)
156 throw InternalErr(__FILE__, __LINE__,
"Could not end element for " + name());
161 end_xml_declaration(writer);
XDOutput(libdap::BaseType *bt)