/* * 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 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 */