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