+ // to be used when we do scan
+ if (false && z3950_init_request(package))
+ {
+ z3950_scan_request(package, odr_en, sru_pdu_res, sr_req);
+ z3950_close_request(package);
+ }
+ }
+ else
+ {
+ //std::cout << "SRU OPERATION NOT SUPPORTED \n";
+ sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_explain_response);
+
+ // TODO: make nice diagnostic return package
+ package.session().close();
+ return;
+ }
+
+ //mp_util::build_sru_debug_package(package);
+ mp_util::build_sru_response(package, odr_en, soap,
+ sru_pdu_res, charset, stylesheet);
+ return;
+}
+
+
+
+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;
+ }
+ return false;
+}
+
+bool
+yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
+ mp::odr &odr_en,
+ Z_SRW_PDU *sru_pdu_res,
+ Z_SRW_searchRetrieveRequest
+ const *sr_req) const
+{
+
+ assert(sru_pdu_res->u.response);
+
+ Package z3950_package(package.session(), package.origin());
+ z3950_package.copy_filter(package);