X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_backend_test.cpp;h=04ae7f2b882b593edce60b952aa7311c4162e942;hb=df8db6d8a539fa6d793aeb541f7c64d625c91d42;hp=f4f0b165cdf21d657d3e5f58e55353acecd58411;hpb=cf09b1981338f07c333e43e0a2c907012c841c5d;p=metaproxy-moved-to-github.git diff --git a/src/filter_backend_test.cpp b/src/filter_backend_test.cpp index f4f0b16..04ae7f2 100644 --- a/src/filter_backend_test.cpp +++ b/src/filter_backend_test.cpp @@ -1,4 +1,4 @@ -/* $Id: filter_backend_test.cpp,v 1.1 2005-10-25 11:48:30 adam Exp $ +/* $Id: filter_backend_test.cpp,v 1.14 2006-01-13 15:09:35 adam Exp $ Copyright (c) 2005, Index Data. %LICENSE% @@ -7,42 +7,47 @@ #include "config.hpp" #include "filter.hpp" -#include "router.hpp" #include "package.hpp" +#include "util.hpp" +#include "filter_backend_test.hpp" -#include +#include +#include +#include +#include -#include "filter_backend_test.hpp" +#include #include #include #include #include -#include -#include -#include - namespace yf = yp2::filter; namespace yp2 { namespace filter { + class Session_info { + int dummy; + }; class Backend_test::Rep { friend class Backend_test; private: bool m_support_named_result_sets; + + session_map m_sessions; }; } } -yf::Backend_test::Backend_test() { - m_p = new Backend_test::Rep; +using namespace yp2; + +yf::Backend_test::Backend_test() : m_p(new Backend_test::Rep) { m_p->m_support_named_result_sets = false; } yf::Backend_test::~Backend_test() { - delete m_p; } void yf::Backend_test::process(Package &package) const @@ -55,18 +60,27 @@ void yf::Backend_test::process(Package &package) const { Z_APDU *apdu_req = gdu->u.z3950; Z_APDU *apdu_res = 0; - ODR odr = odr_createmem(ODR_ENCODE); - if (apdu_req->which == Z_APDU_initRequest) + yp2::odr odr; + + if (apdu_req->which != Z_APDU_initRequest && + !m_p->m_sessions.exist(package.session())) { - apdu_res = zget_APDU(odr, Z_APDU_initResponse); + apdu_res = odr.create_close(apdu_req, + Z_Close_protocolError, + "no init for filter_backend_test"); + package.session().close(); + } + else if (apdu_req->which == Z_APDU_initRequest) + { + apdu_res = odr.create_initResponse(apdu_req, 0, 0); Z_InitRequest *req = apdu_req->u.initRequest; Z_InitResponse *resp = apdu_res->u.initResponse; int i; static const int masks[] = { - Z_Options_search, Z_Options_present, 0 + Z_Options_search, Z_Options_present, -1 }; - for (i = 0; masks[i]; i++) + for (i = 0; masks[i] != -1; i++) if (ODR_MASK_GET(req->options, masks[i])) ODR_MASK_SET(resp->options, masks[i]); if (m_p->m_support_named_result_sets) @@ -76,13 +90,27 @@ void yf::Backend_test::process(Package &package) const else m_p->m_support_named_result_sets = false; } + static const int versions[] = { + Z_ProtocolVersion_1, + Z_ProtocolVersion_2, + Z_ProtocolVersion_3, + -1 + }; + for (i = 0; versions[i] != -1; i++) + if (ODR_MASK_GET(req->protocolVersion, versions[i])) + ODR_MASK_SET(resp->protocolVersion, versions[i]); + else + break; + + Session_info info; + m_p->m_sessions.create(info, package.session()); } else if (apdu_req->which == Z_APDU_searchRequest) - { - apdu_res = zget_APDU(odr, Z_APDU_searchResponse); + { + apdu_res = odr.create_searchResponse(apdu_req, 0, 0); Z_SearchRequest *req = apdu_req->u.searchRequest; Z_SearchResponse *resp = apdu_res->u.searchResponse; - + if (!m_p->m_support_named_result_sets && strcmp(req->resultSetName, "default")) { @@ -99,18 +127,36 @@ void yf::Backend_test::process(Package &package) const } else if (apdu_req->which == Z_APDU_presentRequest) { - apdu_res = zget_APDU(odr, Z_APDU_presentResponse); + apdu_res = + odr.create_presentResponse(apdu_req, + YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, + 0); } else { - apdu_res = zget_APDU(odr, Z_APDU_close); - *apdu_res->u.close->closeReason = Z_Close_protocolError; + apdu_res = odr.create_close(apdu_req, + Z_Close_protocolError, + "bad APDU in filter_backend_test"); package.session().close(); } if (apdu_res) package.response() = apdu_res; - odr_destroy(odr); } + if (package.session().is_closed()) + m_p->m_sessions.release(package.session()); +} + +static yp2::filter::Base* filter_creator() +{ + return new yp2::filter::Backend_test; +} + +extern "C" { + struct yp2_filter_struct yp2_filter_backend_test = { + 0, + "backend_test", + filter_creator + }; }