First WIN32 port of YAZ++.
[yazpp-moved-to-github.git] / src / yaz-ir-assoc.cpp
1 /*
2  * Copyright (c) 1998-1999, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  * 
6  * $Log: yaz-ir-assoc.cpp,v $
7  * Revision 1.3  1999-02-02 14:01:19  adam
8  * First WIN32 port of YAZ++.
9  *
10  * Revision 1.2  1999/01/28 13:08:43  adam
11  * Yaz_PDU_Assoc better encapsulated. Memory leak fix in
12  * yaz-socket-manager.cc.
13  *
14  * Revision 1.1.1.1  1999/01/28 09:41:07  adam
15  * First implementation of YAZ++.
16  *
17  */
18
19 #include <log.h>
20 #include <yaz-ir-assoc.h>
21
22 int Yaz_IR_Assoc::yaz_init_func()
23 {
24     logf (LOG_LOG, "nmem_init");
25     nmem_init();
26     logf (LOG_LOG, "done");
27     return 1;
28 }
29
30 int Yaz_IR_Assoc::yaz_init_flag = Yaz_IR_Assoc::yaz_init_func();
31
32 Yaz_IR_Assoc::Yaz_IR_Assoc(IYaz_PDU_Observable *the_PDU_Observable)
33 {
34     m_PDU_Observable = the_PDU_Observable;
35     m_odr_in = odr_createmem (ODR_DECODE);
36     m_odr_out = odr_createmem (ODR_ENCODE);
37     m_odr_print = odr_createmem (ODR_PRINT);
38 }
39
40 Yaz_IR_Assoc::~Yaz_IR_Assoc()
41 {
42     m_PDU_Observable->destroy();
43     delete m_PDU_Observable;
44     odr_destroy (m_odr_print);
45     odr_destroy (m_odr_out);
46     odr_destroy (m_odr_in);
47 }
48
49 void Yaz_IR_Assoc::recv_PDU(const char *buf, int len)
50 {
51     logf (LOG_LOG, "recv_PDU len=%d", len);
52     Z_APDU *apdu = decode_Z_PDU (buf, len);
53     if (apdu)
54          recv_Z_PDU (apdu);
55 }
56
57 Z_APDU *Yaz_IR_Assoc::create_Z_PDU(int type)
58 {
59     return zget_APDU(m_odr_out, type);
60 }
61
62 int Yaz_IR_Assoc::send_Z_PDU(Z_APDU *apdu)
63 {
64     char *buf;
65     int len;
66     if (encode_Z_PDU(apdu, &buf, &len) > 0)
67         return m_PDU_Observable->send_PDU(buf, len);
68     return -1;
69 }
70
71 Z_APDU *Yaz_IR_Assoc::decode_Z_PDU(const char *buf, int len)
72 {
73     Z_APDU *apdu;
74
75     odr_reset (m_odr_in);
76     odr_setbuf (m_odr_in, (char*) buf, len, 0);
77
78     if (!z_APDU(m_odr_in, &apdu, 0))
79     {
80         logf(LOG_LOG, "ODR error on incoming PDU: %s [near byte %d] ",
81              odr_errmsg(odr_geterror(m_odr_in)),
82              odr_offset(m_odr_in));
83         logf(LOG_LOG, "PDU dump:");
84         odr_dumpBER(log_file(), buf, len);
85         return 0;
86     }
87     else
88     {
89         logf (LOG_LOG, "decoded ok");
90         return apdu;
91     }
92 }
93
94 int Yaz_IR_Assoc::encode_Z_PDU(Z_APDU *apdu, char **buf, int *len)
95 {
96     if (!z_APDU(m_odr_out, &apdu, 0))
97         return -1;
98     *buf = odr_getbuf (m_odr_out, len, 0);
99     odr_reset (m_odr_out);
100     return *len;
101 }
102
103 void Yaz_IR_Assoc::connectNotify()
104 {
105     logf (LOG_LOG, "connectNotify");
106 }
107
108 void Yaz_IR_Assoc::failNotify()
109 {
110     logf (LOG_LOG, "failNotify");
111 }
112
113 void Yaz_IR_Assoc::client(const char *addr)
114 {
115     m_PDU_Observable->connect (this, addr);
116 }
117
118 void Yaz_IR_Assoc::server(const char *addr)
119 {
120     m_PDU_Observable->listen (this, addr);
121 }
122