|
Packit |
a4aae4 |
// -*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
// Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Copyright (c) 2013 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
// modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
// version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
// Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
// Foundation, Inc., 51 Franklin D4Opaqueeet, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
//#define DODS_DEBUG
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <sstream>
|
|
Packit |
a4aae4 |
#include <iterator>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "D4Opaque.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "DMR.h"
|
|
Packit |
a4aae4 |
#include "D4StreamMarshaller.h"
|
|
Packit |
a4aae4 |
#include "D4StreamUnMarshaller.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "util.h"
|
|
Packit |
a4aae4 |
#include "crc.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "debug.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#undef CLEAR_LOCAL_DATA
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using namespace std;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap {
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Opaque &
|
|
Packit |
a4aae4 |
D4Opaque::operator=(const D4Opaque &rhs)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (this == &rhs)
|
|
Packit |
a4aae4 |
return *this;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Call BaseType::operator=
|
|
Packit |
a4aae4 |
dynamic_cast<BaseType &>(*this) = rhs;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
d_buf = rhs.d_buf;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return *this;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Opaque::clear_local_data()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (!d_buf.empty()) {
|
|
Packit |
a4aae4 |
d_buf.erase(d_buf.begin(), d_buf.end());
|
|
Packit |
a4aae4 |
d_buf.resize(0);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
set_read_p(false);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Opaque::compute_checksum(Crc32 &checksum)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
checksum.AddData(&d_buf[0], d_buf.size());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Opaque::serialize(D4StreamMarshaller &m, DMR &, bool)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (!read_p())
|
|
Packit |
a4aae4 |
read(); // read() throws Error
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
m.put_opaque_dap4( reinterpret_cast<char*>(&d_buf[0]), d_buf.size() ) ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifdef CLEAR_LOCAL_DATA
|
|
Packit |
a4aae4 |
clear_local_data();
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Opaque::deserialize(D4StreamUnMarshaller &um, DMR &)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
um.get_opaque_dap4( d_buf ) ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
unsigned int
|
|
Packit |
a4aae4 |
D4Opaque::buf2val(void **val)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
assert(val);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// If *val is null, then the caller has not allocated storage for the
|
|
Packit |
a4aae4 |
// value; we must. If there is storage there, assume it is a vector<uint8_t>
|
|
Packit |
a4aae4 |
// (i.e., dods_opaque) and assign d_buf's value to that storage.
|
|
Packit |
a4aae4 |
if (!*val)
|
|
Packit |
a4aae4 |
*val = new vector<uint8_t>;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
*static_cast<vector<uint8_t>*>(*val) = d_buf;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return sizeof(vector<uint8_t>*);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
unsigned int
|
|
Packit |
a4aae4 |
D4Opaque::val2buf(void *val, bool)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
assert(val);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
d_buf = *static_cast<dods_opaque*>(val);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return sizeof(dods_opaque*);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Set the value of this instance.
|
|
Packit |
a4aae4 |
@param value The value
|
|
Packit |
a4aae4 |
@return Always returns true; the return type of bool is for compatibility
|
|
Packit |
a4aae4 |
with the Passive* subclasses written by HAO. */
|
|
Packit |
a4aae4 |
bool
|
|
Packit |
a4aae4 |
D4Opaque::set_value(const dods_opaque &value)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
d_buf = value;
|
|
Packit |
a4aae4 |
set_read_p(true);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return true;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Get the value of this instance.
|
|
Packit |
a4aae4 |
@return The value. */
|
|
Packit |
a4aae4 |
D4Opaque::dods_opaque
|
|
Packit |
a4aae4 |
D4Opaque::value() const
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
return d_buf;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
std::vector<BaseType *> *
|
|
Packit |
a4aae4 |
D4Opaque::transform_to_dap2(AttrTable *){
|
|
Packit |
a4aae4 |
DBG(cerr << __func__ << "() - Transform not implemented DAP4 Opaque type." << endl;);
|
|
Packit |
a4aae4 |
return NULL;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Opaque::print_val(ostream &out, string space, bool print_decl_p)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (print_decl_p) print_decl(out, space, false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (d_buf.size()) {
|
|
Packit |
a4aae4 |
// end() - 1 is only OK if size() is > 0
|
|
Packit |
a4aae4 |
std::ostream_iterator<unsigned int> out_it(out, ",");
|
|
Packit |
a4aae4 |
std::copy(d_buf.begin(), d_buf.end() - 1, out_it);
|
|
Packit |
a4aae4 |
out << (unsigned int) d_buf.back(); // can also use: *(d_buf.end()-1);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (print_decl_p) out << ";" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Opaque::dump(ostream &strm) const
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
strm << DapIndent::LMarg << "D4Opaque::dump - ("
|
|
Packit |
a4aae4 |
<< (void *)this << ")" << endl ;
|
|
Packit |
a4aae4 |
DapIndent::Indent() ;
|
|
Packit |
a4aae4 |
BaseType::dump(strm) ;
|
|
Packit |
a4aae4 |
//strm << DapIndent::LMarg << "value: " << d_buf << endl ;
|
|
Packit |
a4aae4 |
ostream_iterator<uint8_t> out_it (strm," ");
|
|
Packit |
a4aae4 |
std::copy ( d_buf.begin(), d_buf.end(), out_it );
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DapIndent::UnIndent() ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} // namespace libdap
|
|
Packit |
a4aae4 |
|