+ if (sru_pdu_res->u.response->num_diagnostics)
+ {
+ //sru_pdu_res = sru_pdu_res_exp;
+ package.session().close();
+ return 0;
+ }
+ return sru_pdu_req;
+ }
+ else if (0 == yaz_srw_decode(http_req, &sru_pdu_req, &soap,
+ odr_de, &charset))
+ return sru_pdu_req;
+ else
+ {
+ //sru_pdu_res = sru_pdu_res_exp;
+ package.session().close();
+ return 0;
+ }
+ return 0;
+}
+
+bool
+yf::SRUtoZ3950::Impl::check_sru_query_exists(mp::Package &package,
+ mp::odr &odr_en,
+ Z_SRW_PDU *sru_pdu_res,
+ Z_SRW_searchRetrieveRequest
+ const *sr_req)
+ const
+{
+ if( (sr_req->query_type == Z_SRW_query_type_cql && !sr_req->query.cql) )
+ {
+ yaz_add_srw_diagnostic(odr_en,
+ &(sru_pdu_res->u.response->diagnostics),
+ &(sru_pdu_res->u.response->num_diagnostics),
+ 7, "query");
+ yaz_add_srw_diagnostic(odr_en,
+ &(sru_pdu_res->u.response->diagnostics),
+ &(sru_pdu_res->u.response->num_diagnostics),
+ 10, "CQL query is empty");
+ return false;
+ }
+ if( (sr_req->query_type == Z_SRW_query_type_xcql && !sr_req->query.xcql) )
+ {
+ yaz_add_srw_diagnostic(odr_en,
+ &(sru_pdu_res->u.response->diagnostics),
+ &(sru_pdu_res->u.response->num_diagnostics),
+ 10, "XCQL query is empty");
+ return false;
+ }
+ if( (sr_req->query_type == Z_SRW_query_type_pqf && !sr_req->query.pqf) )
+ {
+ yaz_add_srw_diagnostic(odr_en,
+ &(sru_pdu_res->u.response->diagnostics),
+ &(sru_pdu_res->u.response->num_diagnostics),
+ 10, "PQF query is empty");
+ return false;
+ }
+ return true;
+};
+
+
+
+bool
+yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package,
+ const std::string &database) const
+{
+ // prepare Z3950 package
+ //Session s;
+ //Package z3950_package(s, package.origin());
+ Package z3950_package(package.session(), package.origin());
+ z3950_package.copy_filter(package);
+
+ // set initRequest APDU
+ mp::odr odr_en(ODR_ENCODE);
+ Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_initRequest);
+ Z_InitRequest *init_req = apdu->u.initRequest;
+ //TODO: add user name in apdu
+ //TODO: add user passwd in apdu
+ //init_req->idAuthentication = org_init->idAuthentication;
+ //init_req->implementationId = "IDxyz";
+ //init_req->implementationName = "NAMExyz";
+ //init_req->implementationVersion = "VERSIONxyz";
+
+ ODR_MASK_SET(init_req->options, Z_Options_search);
+ ODR_MASK_SET(init_req->options, Z_Options_present);
+ ODR_MASK_SET(init_req->options, Z_Options_namedResultSets);
+ ODR_MASK_SET(init_req->options, Z_Options_scan);
+
+ ODR_MASK_SET(init_req->protocolVersion, Z_ProtocolVersion_1);
+ ODR_MASK_SET(init_req->protocolVersion, Z_ProtocolVersion_2);
+ ODR_MASK_SET(init_req->protocolVersion, Z_ProtocolVersion_3);
+
+ z3950_package.request() = apdu;
+
+ // send Z3950 package
+ // std::cout << "z3950_init_request " << *apdu <<"\n";
+ z3950_package.move();
+
+ // dead Z3950 backend detection
+ if (z3950_package.session().is_closed()){
+ package.session().close();
+ return false;
+ }
+
+ // check successful initResponse
+ Z_GDU *z3950_gdu = z3950_package.response().get();
+
+ if (z3950_gdu && z3950_gdu->which == Z_GDU_Z3950
+ && z3950_gdu->u.z3950->which == Z_APDU_initResponse)
+ return true;
+
+ return false;
+}
+
+bool
+yf::SRUtoZ3950::Impl::z3950_close_request(mp::Package &package) const
+{
+ // close SRU package
+ package.session().close();
+
+ // prepare and close Z3950 package
+ Package z3950_package(package.session(), package.origin());
+ z3950_package.copy_filter(package);
+ z3950_package.session().close();
+
+ // set close APDU
+ //mp::odr odr_en(ODR_ENCODE);
+ //Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_close);
+ //z3950_package.request() = apdu;
+
+ z3950_package.move();
+
+ // check successful close response
+ //Z_GDU *z3950_gdu = z3950_package.response().get();
+ //if (z3950_gdu && z3950_gdu->which == Z_GDU_Z3950
+ // && z3950_gdu->u.z3950->which == Z_APDU_close)
+ // return true;
+
+ if (z3950_package.session().is_closed()){
+ return true;