|
Packit |
a4aae4 |
// XDRFileUnMarshaller.cc
|
|
Packit |
a4aae4 |
|
|
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) 2002,2003 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: Patrick West <pwest@ucar.edu>
|
|
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 Street, 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 |
// (c) COPYRIGHT URI/MIT 1994-1999
|
|
Packit |
a4aae4 |
// Please read the full copyright statement in the file COPYRIGHT_URI.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// Authors:
|
|
Packit |
a4aae4 |
// pwest Patrick West <pwest@ucar.edu>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "XDRFileUnMarshaller.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "Byte.h"
|
|
Packit |
a4aae4 |
#include "Int16.h"
|
|
Packit |
a4aae4 |
#include "UInt16.h"
|
|
Packit |
a4aae4 |
#include "Int32.h"
|
|
Packit |
a4aae4 |
#include "UInt32.h"
|
|
Packit |
a4aae4 |
#include "Float32.h"
|
|
Packit |
a4aae4 |
#include "Float64.h"
|
|
Packit |
a4aae4 |
#include "Str.h"
|
|
Packit |
a4aae4 |
#include "Url.h"
|
|
Packit |
a4aae4 |
#include "Array.h"
|
|
Packit |
a4aae4 |
#include "Structure.h"
|
|
Packit |
a4aae4 |
#include "Sequence.h"
|
|
Packit |
a4aae4 |
#include "Grid.h"
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
#include "Vector.h"
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
#include "util.h"
|
|
Packit |
a4aae4 |
#include "InternalErr.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap {
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::XDRFileUnMarshaller( FILE *out )
|
|
Packit |
a4aae4 |
: _source( 0 )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
_source = new_xdrstdio( out, XDR_DECODE ) ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::XDRFileUnMarshaller()
|
|
Packit |
a4aae4 |
: UnMarshaller(), _source( 0 )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
throw InternalErr( __FILE__, __LINE__, "Default constructor not implemented." ) ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::XDRFileUnMarshaller( const XDRFileUnMarshaller &um )
|
|
Packit |
a4aae4 |
: UnMarshaller( um ), _source( 0 )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
throw InternalErr( __FILE__, __LINE__, "Copy constructor not implemented." ) ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller &
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::operator=( const XDRFileUnMarshaller & )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
throw InternalErr( __FILE__, __LINE__, "Copy operator not implemented." ) ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return *this ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::~XDRFileUnMarshaller( )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
// Some static code analysis tools complain that delete_xdrstdio
|
|
Packit |
a4aae4 |
// does not close the FILE* it holds, but that's not true with
|
|
Packit |
a4aae4 |
// modern XDR libraries. Don't try to close that FILE*. jhrg 8/27/13
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete_xdrstdio( _source ) ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_byte( dods_byte &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if( !xdr_char( _source, (char *)&val ) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O Error. Could not read byte data.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_int16( dods_int16 &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if( !XDR_INT16( _source, &val ) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O Error. Could not read int 16 data.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_int32( dods_int32 &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if( !XDR_INT32( _source, &val ) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O Error. Could not read int 32 data.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_float32( dods_float32 &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if( !xdr_float( _source, &val ) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O Error. Could not read float 32 data.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_float64( dods_float64 &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if( !xdr_double( _source, &val ) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O Error.Could not read float 64 data.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_uint16( dods_uint16 &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if( !XDR_UINT16( _source, &val ) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O Error. Could not read uint 16 data.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_uint32( dods_uint32 &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if( !XDR_UINT32( _source, &val ) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O Error. Could not read uint 32 data.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_str( string &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
char *in_tmp = NULL ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if( !xdr_string( _source, &in_tmp, max_str_len ) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O Error. Could not read string data.");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
val = in_tmp ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
free( in_tmp ) ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_url( string &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
get_str( val ) ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_opaque( char *val, unsigned int len )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
xdr_opaque( _source, val, len ) ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_int( int &val )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if( !xdr_int( _source, &val ) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O Error(1). This may be due to a bug in libdap or a\nproblem with the network connection.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_vector( char **val, unsigned int &num, Vector & )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if( !xdr_bytes( _source, val, &num, DODS_MAX_ARRAY) )
|
|
Packit |
a4aae4 |
throw Error("Network I/O error (1).");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::get_vector( char **val, unsigned int &num, int width, Vector &vec )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
BaseType *var = vec.var() ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if( !xdr_array( _source, val, &num, DODS_MAX_ARRAY, width,
|
|
Packit |
a4aae4 |
XDRUtils::xdr_coder( var->type() ) ) )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
throw Error("Network I/O error (2).");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
XDRFileUnMarshaller::dump(ostream &strm) const
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
strm << DapIndent::LMarg << "XDRFileUnMarshaller::dump - ("
|
|
Packit |
a4aae4 |
<< (void *)this << ")" << endl ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} // namespace libdap
|
|
Packit |
a4aae4 |
|