X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Fyaz-z-assoc.cpp;h=918047581f8fae1cf8479ed04adc8a108d5e5d06;hb=86726b00b052694e65b036c262f5fe9096554175;hp=72a3d412b1cdd61570d6fa7c3078bdc4fdc4f86e;hpb=307a8638d6429b0f77ad762d52309c550e45648c;p=yazpp-moved-to-github.git diff --git a/src/yaz-z-assoc.cpp b/src/yaz-z-assoc.cpp index 72a3d41..9180475 100644 --- a/src/yaz-z-assoc.cpp +++ b/src/yaz-z-assoc.cpp @@ -1,8 +1,8 @@ /* - * Copyright (c) 1998-2003, Index Data. + * Copyright (c) 1998-2004, Index Data. * See the file LICENSE for details. * - * $Id: yaz-z-assoc.cpp,v 1.32 2003-12-16 14:17:01 adam Exp $ + * $Id: yaz-z-assoc.cpp,v 1.36 2005-06-02 06:40:21 adam Exp $ */ #include @@ -12,6 +12,8 @@ #include #include +using namespace yazpp_1; + int Yaz_Z_Assoc::yaz_init_func() { #ifndef WIN32 @@ -28,7 +30,7 @@ Yaz_Z_Assoc::Yaz_Z_Assoc(IYaz_PDU_Observable *the_PDU_Observable) m_odr_in = odr_createmem (ODR_DECODE); m_odr_out = odr_createmem (ODR_ENCODE); m_odr_print = odr_createmem (ODR_PRINT); - m_log = LOG_DEBUG; + m_log = YLOG_DEBUG; m_APDU_file = 0; m_APDU_fname = 0; m_hostname = 0; @@ -210,10 +212,12 @@ Z_GDU *Yaz_Z_Assoc::decode_GDU(const char *buf, int len) 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)); - yaz_log(LOG_LOG, "PDU dump:"); + const char *element = odr_getelement(m_odr_in); + yaz_log(YLOG_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(YLOG_LOG, "PDU dump:"); odr_dumpBER(yaz_log_file(), buf, len); return 0; } @@ -239,26 +243,34 @@ Z_GDU *Yaz_Z_Assoc::decode_GDU(const 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 (YLOG_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 + 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) { + 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_GDU(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_GDU failed"); + if (!r) // encoding failed return -1; - } *buf = odr_getbuf (m_odr_out, len, 0); odr_reset (m_odr_out); return *len;