1f660eae4e1b2e154debe190fb0a3d18b02838f7
[yazpp-moved-to-github.git] / src / gdu.cpp
1 /*
2  * Copyright (c) 1998-2005, Index Data.
3  * See the file LICENSE for details.
4  * 
5  * $Id: gdu.cpp,v 1.3 2005-10-13 09:56:38 adam Exp $
6  */
7
8 #include <yaz++/gdu.h>
9
10 using namespace yazpp_1;
11
12 GDU::GDU(Z_APDU *apdu)
13 {
14     ODR encode = odr_createmem(ODR_ENCODE);
15     Z_GDU *gdu = (Z_GDU *) odr_malloc(encode, sizeof(*gdu));
16     gdu->which = Z_GDU_Z3950;
17     gdu->u.z3950 = apdu;
18     base(gdu, encode);
19 }
20
21 GDU::GDU(Z_GDU *gdu)
22 {
23     base(gdu, odr_createmem(ODR_ENCODE));
24 }
25
26 GDU::GDU()
27 {
28     base(0, odr_createmem(ODR_ENCODE));
29 }
30
31 GDU::GDU(const GDU &g)
32 {
33     base(g.get(), odr_createmem(ODR_ENCODE));
34 }
35
36 void GDU::base(Z_GDU *gdu, ODR encode)
37 {
38     m_decode = odr_createmem(ODR_DECODE);
39     m_gdu = 0;
40     if (gdu && z_GDU(encode, &gdu, 0, "encode"))
41     {
42         int len;
43         char *buf = odr_getbuf(encode, &len, 0);
44         
45         odr_setbuf(m_decode, buf, len, 0);
46         z_GDU(m_decode, &m_gdu, 0, 0);
47     }
48     odr_destroy(encode);
49 }
50
51
52 GDU &GDU::operator=(const GDU &g)
53 {
54     if (this != &g)
55     {
56         odr_destroy(m_decode);
57
58         base(g.get(), odr_createmem(ODR_ENCODE));
59     }
60     return *this;
61 }
62
63 GDU::~GDU()
64 {
65     odr_destroy(m_decode);
66 }
67
68 Z_GDU *GDU::get() const
69 {
70     return m_gdu;
71 }
72
73 void GDU::move_away_gdu(ODR dst, Z_GDU **gdu)
74 {
75     *gdu = m_gdu;
76     m_gdu = 0;
77     NMEM nmem = odr_extract_mem(m_decode);
78     if (!dst->mem)
79         dst->mem = nmem_create();
80     nmem_transfer(dst->mem, nmem);
81     nmem_destroy(nmem);
82 }
83
84 /*
85  * Local variables:
86  * c-basic-offset: 4
87  * indent-tabs-mode: nil
88  * End:
89  * vim: shiftwidth=4 tabstop=8 expandtab
90  */
91