X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_z3950_client.cpp;h=9975aa6c48de64cfe7a817b9a21569d6cf2d15bd;hb=daa6e3aec14f907c2f317ecfcda8bebbd4fd5dbf;hp=178a3b800a536e411aadcc720657b79c6d014e13;hpb=ad428707d2a52bbe4db21e47c5ebb26e13598484;p=metaproxy-moved-to-github.git diff --git a/src/filter_z3950_client.cpp b/src/filter_z3950_client.cpp index 178a3b8..9975aa6 100644 --- a/src/filter_z3950_client.cpp +++ b/src/filter_z3950_client.cpp @@ -1,4 +1,4 @@ -/* $Id: filter_z3950_client.cpp,v 1.15 2006-01-04 11:55:32 adam Exp $ +/* $Id: filter_z3950_client.cpp,v 1.20 2006-01-13 15:09:35 adam Exp $ Copyright (c) 2005, Index Data. %LICENSE% @@ -7,7 +7,6 @@ #include "config.hpp" #include "filter.hpp" -#include "router.hpp" #include "package.hpp" #include "util.hpp" #include "filter_z3950_client.hpp" @@ -37,7 +36,7 @@ namespace yp2 { friend class Rep; Assoc(yazpp_1::SocketManager *socket_manager, yazpp_1::IPDU_Observable *PDU_Observable, - std::string host); + std::string host, int timeout); ~Assoc(); void connectNotify(); void failNotify(); @@ -55,12 +54,14 @@ namespace yp2 { bool m_destroyed; bool m_connected; int m_queue_len; - int m_ticks; + int m_time_elapsed; + int m_time_max; std::string m_host; }; class Z3950Client::Rep { public: + int m_timeout_sec; boost::mutex m_mutex; boost::condition m_cond_session_ready; std::map m_clients; @@ -76,11 +77,12 @@ using namespace yp2; yf::Z3950Client::Assoc::Assoc(yazpp_1::SocketManager *socket_manager, yazpp_1::IPDU_Observable *PDU_Observable, - std::string host) + std::string host, int timeout_sec) : Z_Assoc(PDU_Observable), m_socket_manager(socket_manager), m_PDU_Observable(PDU_Observable), m_package(0), m_in_use(true), m_waiting(false), - m_destroyed(false), m_connected(false), m_queue_len(1), m_ticks(0), + m_destroyed(false), m_connected(false), m_queue_len(1), + m_time_elapsed(0), m_time_max(timeout_sec), m_host(host) { // std::cout << "create assoc " << this << "\n"; @@ -106,16 +108,20 @@ void yf::Z3950Client::Assoc::failNotify() if (m_package) { - m_package->response() = odr.create_close(Z_Close_peerAbort, 0); + Z_GDU *gdu = m_package->request().get(); + Z_APDU *apdu = 0; + if (gdu && gdu->which == Z_GDU_Z3950) + apdu = gdu->u.z3950; + + m_package->response() = odr.create_close(apdu, Z_Close_peerAbort, 0); m_package->session().close(); } } void yf::Z3950Client::Assoc::timeoutNotify() { - std::cout << "TIMEOUT NOTIFY\n"; - m_ticks++; - if (m_ticks == 30) + m_time_elapsed++; + if (m_time_elapsed >= m_time_max) { m_waiting = false; @@ -123,10 +129,17 @@ void yf::Z3950Client::Assoc::timeoutNotify() if (m_package) { + Z_GDU *gdu = m_package->request().get(); + Z_APDU *apdu = 0; + if (gdu && gdu->which == Z_GDU_Z3950) + apdu = gdu->u.z3950; + if (m_connected) - m_package->response() = odr.create_close(Z_Close_lackOfActivity, 0); + m_package->response() = + odr.create_close(apdu, Z_Close_lackOfActivity, 0); else - m_package->response() = odr.create_close(Z_Close_peerAbort, 0); + m_package->response() = + odr.create_close(apdu, Z_Close_peerAbort, 0); m_package->session().close(); } @@ -151,6 +164,7 @@ yazpp_1::IPDU_Observer *yf::Z3950Client::Assoc::sessionNotify( yf::Z3950Client::Z3950Client() : m_p(new yf::Z3950Client::Rep) { + m_p->m_timeout_sec = 30; } yf::Z3950Client::~Z3950Client() { @@ -202,7 +216,8 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) { yp2::odr odr; - package.response() = odr.create_close(Z_Close_protocolError, + package.response() = odr.create_close(apdu, + Z_Close_protocolError, "First PDU was not an " "Initialize Request"); package.session().close(); @@ -211,21 +226,24 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) // check virtual host const char *vhost = yaz_oi_get_string_oidval(&apdu->u.initRequest->otherInfo, - VAL_PROXY, 1, 0); + VAL_PROXY, + /* categoryValue */ 1, /* delete */ 1); if (!vhost) { yp2::odr odr; package.response() = odr.create_initResponse( + apdu, YAZ_BIB1_INIT_NEGOTIATION_OPTION_REQUIRED, "Virtual host not given"); package.session().close(); return 0; } - + yazpp_1::SocketManager *sm = new yazpp_1::SocketManager; yazpp_1::PDU_Assoc *pdu_as = new yazpp_1::PDU_Assoc(sm); - yf::Z3950Client::Assoc *as = new yf::Z3950Client::Assoc(sm, pdu_as, vhost); + yf::Z3950Client::Assoc *as = new yf::Z3950Client::Assoc(sm, pdu_as, vhost, + m_timeout_sec); m_clients[package.session()] = as; return as; } @@ -241,7 +259,7 @@ void yf::Z3950Client::Rep::send_and_receive(Package &package, if (!gdu || gdu->which != Z_GDU_Z3950) return; - c->m_ticks = 0; + c->m_time_elapsed = 0; c->m_package = &package; c->m_waiting = true; if (!c->m_connected) @@ -259,7 +277,7 @@ void yf::Z3950Client::Rep::send_and_receive(Package &package, } // prepare response - c->m_ticks = 0; + c->m_time_elapsed = 0; c->m_waiting = true; // relay the package .. @@ -325,6 +343,29 @@ void yf::Z3950Client::process(Package &package) const m_p->release_assoc(package); } +void yf::Z3950Client::configure(const xmlNode *ptr) +{ + for (ptr = ptr->children; ptr; ptr = ptr->next) + { + if (ptr->type != XML_ELEMENT_NODE) + continue; + if (!strcmp((const char *) ptr->name, "timeout")) + { + std::string timeout_str = yp2::xml::get_text(ptr); + int timeout_sec = atoi(timeout_str.c_str()); + if (timeout_sec < 2) + throw yp2::filter::FilterException("Bad timeout value " + + timeout_str); + m_p->m_timeout_sec = timeout_sec; + } + else + { + throw yp2::filter::FilterException("Bad element " + + std::string((const char *) + ptr->name)); + } + } +} static yp2::filter::Base* filter_creator() {