Blame XDRUtils.cc

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