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