X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-z-assoc.cpp;h=b832572f56cf15ffd35219b4a601c2970b346344;hb=ab42ade0e6fe70998e8fe70338b2d78008d388f7;hp=d28ae9480f3f1dce2a3e7ed3dce28b2858947248;hpb=0e4148ba1e09e25bea2fa1403bf720860a308082;p=yazpp-moved-to-github.git diff --git a/src/yaz-z-assoc.cpp b/src/yaz-z-assoc.cpp index d28ae94..b832572 100644 --- a/src/yaz-z-assoc.cpp +++ b/src/yaz-z-assoc.cpp @@ -1,15 +1,15 @@ /* - * Copyright (c) 1998-2001, Index Data. + * Copyright (c) 1998-2003, Index Data. * See the file LICENSE for details. * - * $Id: yaz-z-assoc.cpp,v 1.24 2002-09-10 11:30:37 adam Exp $ + * $Id: yaz-z-assoc.cpp,v 1.31 2003-10-23 13:49:58 adam Exp $ */ #include #include #include -#include +#include #include int Yaz_Z_Assoc::yaz_init_func() @@ -32,6 +32,7 @@ Yaz_Z_Assoc::Yaz_Z_Assoc(IYaz_PDU_Observable *the_PDU_Observable) m_APDU_file = 0; m_APDU_fname = 0; m_hostname = 0; + m_APDU_yazlog = 0; } void Yaz_Z_Assoc::set_APDU_log(const char *fname) @@ -48,14 +49,23 @@ void Yaz_Z_Assoc::set_APDU_log(const char *fname) { m_APDU_fname = new char[strlen(fname)+1]; strcpy (m_APDU_fname, fname); - if (*fname && strcmp(fname, "-")) - m_APDU_file = fopen (fname, "a"); - else + if (!strcmp(fname, "-")) m_APDU_file = stderr; + else if (*fname == '\0') + m_APDU_file = 0; + else + m_APDU_file = fopen (fname, "a"); odr_setprint(m_odr_print, m_APDU_file); } } +int Yaz_Z_Assoc::set_APDU_yazlog(int v) +{ + int old = m_APDU_yazlog; + m_APDU_yazlog = v; + return old; +} + const char *Yaz_Z_Assoc::get_APDU_log() { return m_APDU_fname; @@ -78,11 +88,12 @@ void Yaz_Z_Assoc::recv_PDU(const char *buf, int len) Z_APDU *apdu = decode_Z_PDU (buf, len); if (apdu) { - recv_Z_PDU (apdu); + recv_Z_PDU (apdu, len); } else { close(); + failNotify(); } } @@ -169,12 +180,16 @@ void Yaz_Z_Assoc::transfer_referenceId(Z_APDU *from, Z_APDU *to) *id_to = 0; } -int Yaz_Z_Assoc::send_Z_PDU(Z_APDU *apdu) +int Yaz_Z_Assoc::send_Z_PDU(Z_APDU *apdu, int *plen) { char *buf; int len; if (encode_Z_PDU(apdu, &buf, &len) > 0) + { + if (plen) + *plen = len; return m_PDU_Observable->send_PDU(buf, len); + } return -1; } @@ -196,6 +211,15 @@ Z_APDU *Yaz_Z_Assoc::decode_Z_PDU(const char *buf, int len) } else { + if (m_APDU_yazlog) + { // use YAZ log FILE + FILE *save = m_APDU_file; + + odr_setprint(m_odr_print, yaz_log_file()); + z_APDU(m_odr_print, &apdu, 0, "decode"); + m_APDU_file = save; + odr_setprint(m_odr_print, save); + } if (m_APDU_file) { z_APDU(m_odr_print, &apdu, 0, "decode"); @@ -207,6 +231,14 @@ Z_APDU *Yaz_Z_Assoc::decode_Z_PDU(const char *buf, int len) int Yaz_Z_Assoc::encode_Z_PDU(Z_APDU *apdu, char **buf, int *len) { + if (m_APDU_yazlog) + { + FILE *save = m_APDU_file; + odr_setprint(m_odr_print, yaz_log_file()); // use YAZ log FILE + z_APDU(m_odr_print, &apdu, 0, "encode"); + m_APDU_file = save; + odr_setprint(m_odr_print, save); + } if (m_APDU_file) { z_APDU(m_odr_print, &apdu, 0, "encode"); @@ -229,12 +261,12 @@ const char *Yaz_Z_Assoc::get_hostname() return m_hostname; } -void Yaz_Z_Assoc::client(const char *addr) +int Yaz_Z_Assoc::client(const char *addr) { delete [] m_hostname; m_hostname = new char[strlen(addr)+1]; strcpy (m_hostname, addr); - m_PDU_Observable->connect (this, addr); + return m_PDU_Observable->connect (this, addr); } void Yaz_Z_Assoc::close() @@ -242,12 +274,12 @@ void Yaz_Z_Assoc::close() m_PDU_Observable->close (); } -void Yaz_Z_Assoc::server(const char *addr) +int Yaz_Z_Assoc::server(const char *addr) { delete [] m_hostname; m_hostname = new char[strlen(addr)+1]; strcpy (m_hostname, addr); - m_PDU_Observable->listen (this, addr); + return m_PDU_Observable->listen (this, addr); } ODR Yaz_Z_Assoc::odr_encode()