/*
* Copyright (c) 1998-2005, Index Data.
* See the file LICENSE for details.
*
* $Id: gdu.cpp,v 1.4 2006/03/29 13:14:15 adam Exp $
*/
#include <yazpp/gdu.h>
using namespace yazpp_1;
GDU::GDU(Z_APDU *apdu)
{
ODR encode = odr_createmem(ODR_ENCODE);
Z_GDU *gdu = (Z_GDU *) odr_malloc(encode, sizeof(*gdu));
gdu->which = Z_GDU_Z3950;
gdu->u.z3950 = apdu;
base(gdu, encode);
}
GDU::GDU(Z_GDU *gdu)
{
base(gdu, odr_createmem(ODR_ENCODE));
}
GDU::GDU()
{
base(0, odr_createmem(ODR_ENCODE));
}
GDU::GDU(const GDU &g)
{
base(g.get(), odr_createmem(ODR_ENCODE));
}
void GDU::base(Z_GDU *gdu, ODR encode)
{
m_decode = odr_createmem(ODR_DECODE);
m_gdu = 0;
if (gdu && z_GDU(encode, &gdu, 0, "encode"))
{
int len;
char *buf = odr_getbuf(encode, &len, 0);
odr_setbuf(m_decode, buf, len, 0);
z_GDU(m_decode, &m_gdu, 0, 0);
}
odr_destroy(encode);
}
GDU &GDU::operator=(const GDU &g)
{
if (this != &g)
{
odr_destroy(m_decode);
base(g.get(), odr_createmem(ODR_ENCODE));
}
return *this;
}
GDU::~GDU()
{
odr_destroy(m_decode);
}
Z_GDU *GDU::get() const
{
return m_gdu;
}
void GDU::move_away_gdu(ODR dst, Z_GDU **gdu)
{
*gdu = m_gdu;
m_gdu = 0;
NMEM nmem = odr_extract_mem(m_decode);
if (!dst->mem)
dst->mem = nmem_create();
nmem_transfer(dst->mem, nmem);
nmem_destroy(nmem);
}
/*
* Local variables:
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab
*/
syntax highlighted by Code2HTML, v. 0.9.1