|
Packit |
a4aae4 |
// XDRUtils.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 "XDRUtils.h"
|
|
Packit |
a4aae4 |
#include "debug.h"
|
|
Packit |
a4aae4 |
#include "Str.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using namespace libdap ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This function is used to allocate memory for, and initialize, a new XDR
|
|
Packit |
a4aae4 |
// pointer. It sets the stream associated with the (XDR *) to STREAM.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// NB: STREAM is not one of the C++/libg++ iostream classes; it is a (FILE
|
|
Packit |
a4aae4 |
// *).
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// These func's moved to xdrutil_ppc.* under the PPC as explained there
|
|
Packit |
a4aae4 |
#ifndef __POWERPC__
|
|
Packit |
a4aae4 |
XDR *
|
|
Packit |
a4aae4 |
new_xdrstdio(FILE *stream, enum xdr_op xop)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
XDR *xdr = new XDR;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
xdrstdio_create(xdr, stream, xop);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return xdr;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
XDR *
|
|
Packit |
a4aae4 |
set_xdrstdio(XDR *xdr, FILE *stream, enum xdr_op xop)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
xdrstdio_create(xdr, stream, xop);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return xdr;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Delete an XDR pointer allocated using the above function. Do not close the
|
|
Packit |
a4aae4 |
// associated FILE pointer.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
delete_xdrstdio(XDR *xdr)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
xdr_destroy(xdr);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete xdr; xdr = 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This function is used to en/decode Str and Url type variables. It is
|
|
Packit |
a4aae4 |
// defined as extern C since it is passed via function pointers to routines
|
|
Packit |
a4aae4 |
// in the xdr library where it is executed. This function is defined so
|
|
Packit |
a4aae4 |
// that Str and Url have an en/decoder which takes exactly two arguments: an
|
|
Packit |
a4aae4 |
// XDR * and a string reference.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// NB: this function is *not* used for arrays (i.e., it is not the function
|
|
Packit |
a4aae4 |
// referenced by BaseType's _xdr_coder field when the object is a Str or Url.
|
|
Packit |
a4aae4 |
// Also note that \e max_str_len is an obese number but that really does not
|
|
Packit |
a4aae4 |
// matter; xdr_string() would never actually allocate that much memory unless
|
|
Packit |
a4aae4 |
// a string that size was sent from the server.
|
|
Packit |
a4aae4 |
// Returns: XDR's bool_t; TRUE if no errors are detected, FALSE
|
|
Packit |
a4aae4 |
// otherwise. The formal parameter BUF is modified as a side effect.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
extern "C" bool_t
|
|
Packit |
a4aae4 |
xdr_str(XDR *xdrs, string &buf)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
DBG(cerr << "In xdr_str, xdrs: " << xdrs << endl);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
switch (xdrs->x_op) {
|
|
Packit |
a4aae4 |
case XDR_ENCODE: { // BUF is a pointer to a (string *)
|
|
Packit |
a4aae4 |
const char *out_tmp = buf.c_str();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return xdr_string(xdrs, (char **)&out_tmp, max_str_len);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case XDR_DECODE: {
|
|
Packit |
a4aae4 |
char *in_tmp = NULL;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool_t stat = xdr_string(xdrs, &in_tmp, max_str_len);
|
|
Packit |
a4aae4 |
if (!stat)
|
|
Packit |
a4aae4 |
return stat;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
buf = in_tmp;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
free(in_tmp);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return stat;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap {
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** The <tt>xdr_coder</tt> function (also "filter primitive") is used to
|
|
Packit |
a4aae4 |
encode and decode each element in a multiple element data
|
|
Packit |
a4aae4 |
structure. These functions are used to convert data to and from
|
|
Packit |
a4aae4 |
its local representation to the XDR representation, which is
|
|
Packit |
a4aae4 |
used to transmit and receive the data. See <tt>man xdr</tt> for more
|
|
Packit |
a4aae4 |
information about the available XDR filter primitives.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
\note This class data is only used for multiple element data
|
|
Packit |
a4aae4 |
types. The simple data types (Int, Float, and so on), are
|
|
Packit |
a4aae4 |
translated directly.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
\note Even though Byte is a cardinal type, xdr_char is not
|
|
Packit |
a4aae4 |
used to transport Byte arrays over the network. Instead, Byte is
|
|
Packit |
a4aae4 |
a special case handled in Array.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
@brief Returns a function used to encode elements of an array.
|
|
Packit |
a4aae4 |
@return A C function used to encode data in the XDR format.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
xdrproc_t
|
|
Packit |
a4aae4 |
XDRUtils::xdr_coder( const Type &t )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
switch( t )
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
case dods_int16_c:
|
|
Packit |
a4aae4 |
return (xdrproc_t)XDR_INT16 ;
|
|
Packit |
a4aae4 |
break ;
|
|
Packit |
a4aae4 |
case dods_uint16_c:
|
|
Packit |
a4aae4 |
return (xdrproc_t)XDR_UINT16 ;
|
|
Packit |
a4aae4 |
break ;
|
|
Packit |
a4aae4 |
case dods_int32_c:
|
|
Packit |
a4aae4 |
return (xdrproc_t)XDR_INT32 ;
|
|
Packit |
a4aae4 |
break ;
|
|
Packit |
a4aae4 |
case dods_uint32_c:
|
|
Packit |
a4aae4 |
return (xdrproc_t)XDR_UINT32 ;
|
|
Packit |
a4aae4 |
break ;
|
|
Packit |
a4aae4 |
case dods_float32_c:
|
|
Packit |
a4aae4 |
return (xdrproc_t)XDR_FLOAT32 ;
|
|
Packit |
a4aae4 |
break ;
|
|
Packit |
a4aae4 |
case dods_float64_c:
|
|
Packit |
a4aae4 |
return (xdrproc_t)XDR_FLOAT64 ;
|
|
Packit |
a4aae4 |
break ;
|
|
Packit |
a4aae4 |
case dods_byte_c:
|
|
Packit |
a4aae4 |
case dods_str_c:
|
|
Packit |
a4aae4 |
case dods_url_c:
|
|
Packit |
a4aae4 |
case dods_array_c:
|
|
Packit |
a4aae4 |
case dods_structure_c:
|
|
Packit |
a4aae4 |
case dods_sequence_c:
|
|
Packit |
a4aae4 |
case dods_grid_c:
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
break ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return NULL;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} // namespace libdap
|
|
Packit |
a4aae4 |
|