X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-z-assoc.cpp;h=8413ea8a32bb0a7cb679d392ab972bfaa9a1a2ba;hb=c1106f71355e2e89dd95e8f847b1f871642344db;hp=08e197652fe4709826be6393c5778ed3f1d73cdf;hpb=50fbcf20ab48480e819ec5aef312a72c684bf213;p=yazpp-moved-to-github.git diff --git a/src/yaz-z-assoc.cpp b/src/yaz-z-assoc.cpp index 08e1976..8413ea8 100644 --- a/src/yaz-z-assoc.cpp +++ b/src/yaz-z-assoc.cpp @@ -1,8 +1,8 @@ /* - * Copyright (c) 1998-2001, Index Data. + * Copyright (c) 1998-2004, Index Data. * See the file LICENSE for details. * - * $Id: yaz-z-assoc.cpp,v 1.28 2003-10-16 16:10:43 adam Exp $ + * $Id: yaz-z-assoc.cpp,v 1.33 2004-01-24 21:33:27 adam Exp $ */ #include @@ -63,6 +63,7 @@ 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() @@ -84,14 +85,15 @@ Yaz_Z_Assoc::~Yaz_Z_Assoc() void Yaz_Z_Assoc::recv_PDU(const char *buf, int len) { yaz_log (m_log, "recv_PDU len=%d", len); - Z_APDU *apdu = decode_Z_PDU (buf, len); + Z_GDU *apdu = decode_GDU (buf, len); if (apdu) { - recv_Z_PDU (apdu, len); + recv_GDU (apdu, len); } else { close(); + failNotify(); } } @@ -180,9 +182,17 @@ void Yaz_Z_Assoc::transfer_referenceId(Z_APDU *from, Z_APDU *to) int Yaz_Z_Assoc::send_Z_PDU(Z_APDU *apdu, int *plen) { + Z_GDU *gdu = (Z_GDU*) odr_malloc(odr_encode(), sizeof(*gdu)); + gdu->which = Z_GDU_Z3950; + gdu->u.z3950 = apdu; + return send_GDU(gdu, plen); +} + +int Yaz_Z_Assoc::send_GDU(Z_GDU *apdu, int *plen) +{ char *buf; int len; - if (encode_Z_PDU(apdu, &buf, &len) > 0) + if (encode_GDU(apdu, &buf, &len) > 0) { if (plen) *plen = len; @@ -191,18 +201,20 @@ int Yaz_Z_Assoc::send_Z_PDU(Z_APDU *apdu, int *plen) return -1; } -Z_APDU *Yaz_Z_Assoc::decode_Z_PDU(const char *buf, int len) +Z_GDU *Yaz_Z_Assoc::decode_GDU(const char *buf, int len) { - Z_APDU *apdu; + Z_GDU *apdu; odr_reset (m_odr_in); odr_setbuf (m_odr_in, (char*) buf, len, 0); - if (!z_APDU(m_odr_in, &apdu, 0, 0)) + if (!z_GDU(m_odr_in, &apdu, 0, 0)) { - yaz_log(LOG_LOG, "ODR error on incoming PDU: %s [near byte %d] ", - odr_errmsg(odr_geterror(m_odr_in)), - odr_offset(m_odr_in)); + const char *element = odr_getelement(m_odr_in); + yaz_log(LOG_LOG, "PDU decode failed '%s' near byte %d. Element %s", + odr_errmsg(odr_geterror(m_odr_in)), + odr_offset(m_odr_in), + element ? element : "unknown"); yaz_log(LOG_LOG, "PDU dump:"); odr_dumpBER(yaz_log_file(), buf, len); return 0; @@ -214,39 +226,49 @@ Z_APDU *Yaz_Z_Assoc::decode_Z_PDU(const char *buf, int len) FILE *save = m_APDU_file; odr_setprint(m_odr_print, yaz_log_file()); - z_APDU(m_odr_print, &apdu, 0, "decode"); + z_GDU(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"); + z_GDU(m_odr_print, &apdu, 0, "decode"); fflush(m_APDU_file); } return apdu; } } -int Yaz_Z_Assoc::encode_Z_PDU(Z_APDU *apdu, char **buf, int *len) +int Yaz_Z_Assoc::encode_GDU(Z_GDU *apdu, char **buf, int *len) { - if (m_APDU_yazlog) + const char *element = 0; + int r = z_GDU(m_odr_out, &apdu, 0, 0); + + if (!r) // decoding failed. Get the failed element + element = odr_getelement(m_odr_out); + + if (m_APDU_yazlog || !r) { + if (!r) + yaz_log (LOG_LOG, "PDU encode failed. Element %s", + element ? element : "unknown"); 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"); + FILE *yazf = yaz_log_file(); + odr_setprint(m_odr_print, yazf); // use YAZ log FILE + z_GDU(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"); + if (!r) + fprintf (m_APDU_file, "PDU encode failed. Element %s", + element ? element : "unknown"); + z_GDU(m_odr_print, &apdu, 0, "encode"); fflush(m_APDU_file); } - if (!z_APDU(m_odr_out, &apdu, 0, 0)) - { - if (m_APDU_file) - fprintf (m_APDU_file, "PDU encode failed (above)"); - yaz_log (LOG_LOG, "yaz_Z_Assoc::encode_Z_PDU failed"); + if (!r) // encoding failed return -1; - } *buf = odr_getbuf (m_odr_out, len, 0); odr_reset (m_odr_out); return *len; @@ -270,12 +292,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()