Blame D4Opaque.cc

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