+
+
+ // TODO: Z3950 response parsing and translation to SRU package
+ bool ok = true;
+
+ Z_SRW_PDU *sru_pdu_req = 0;
+ mp::odr odr_de(ODR_DECODE);
+
+ Z_SRW_PDU *sru_pdu_res = 0;
+ mp::odr odr_en(ODR_ENCODE);
+
+ Z_SOAP *soap = 0;
+ char *charset = 0;
+ const char *stylesheet = 0;
+
+ if (! (sru_pdu_req = decode_sru_request(package, odr_de, soap,
+ charset, stylesheet)))
+ {
+ sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_explain_response);
+ std::cout << "TODO: correct error when SRW package could not be"
+ " parsed\n";
+ //build_sru_debug_package(package);
+ build_sru_response(package, odr_en, soap,
+ sru_pdu_res, charset, stylesheet);
+ return;
+ }
+
+
+ // SRU request package translation to Z3950 package
+ if (sru_pdu_req)
+ std::cout << *sru_pdu_req << "\n";
+ else
+ std::cout << "SRU empty\n";
+
+
+ // explain
+ if (sru_pdu_req && sru_pdu_req->which == Z_SRW_explain_request)
+ {
+ //Z_SRW_searchRetrieveRequest *sr_req = sru_pdu_req->u.request;
+ sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_explain_response);
+ std::cout << "TODO: implement explain response";
+
+ }
+
+
+ // searchRetrieve
+ if (sru_pdu_req && sru_pdu_req->which == Z_SRW_searchRetrieve_request)
+ {
+ Z_SRW_searchRetrieveRequest *sr_req = sru_pdu_req->u.request;
+
+ sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_searchRetrieve_response);
+
+ // TODO: checking of unsupported operations and proper diagnostic setup
+
+ // recordXPath unsupported.
+ //if (sr_req->recordXPath)
+ // yaz_add_srw_diagnostic(odr_decode(),
+ // &diag, &num_diags, 72, 0);
+ // sort unsupported
+ // if (sr_req->sort_type != Z_SRW_sort_type_none)
+ // yaz_add_srw_diagnostic(odr_decode(),
+ // &diag, &num_diags, 80, 0);
+
+
+ if (z3950_init_request(package))
+ {
+ {
+ ok = z3950_search_request(package, odr_en,
+ sru_pdu_res, sr_req);
+
+ if (ok && sru_pdu_res->u.response->numberOfRecords
+ && *(sru_pdu_res->u.response->numberOfRecords))
+
+ ok = z3950_present_request(package, odr_en,
+ sru_pdu_res,
+ sr_req);
+ z3950_close_request(package);
+ }
+ }
+ }
+
+ // scan
+ else if (sru_pdu_req && sru_pdu_req->which == Z_SRW_scan_request)
+ {
+ Z_SRW_scanRequest *sr_req = sru_pdu_req->u.scan_request;
+
+ sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_scan_response);
+
+ if (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;
+ }
+
+ //build_sru_debug_package(package);
+ build_sru_response(package, odr_en, soap,
+ sru_pdu_res, charset, stylesheet);
+ return;
+
+
+
+
+
+
+
+}
+
+bool yf::SRUtoZ3950::Rep::build_sru_debug_package(mp::Package &package) const
+{
+ Z_GDU *zgdu_req = package.request().get();
+ if (zgdu_req && zgdu_req->which == Z_GDU_HTTP_Request)
+ {
+ Z_HTTP_Request* http_req = zgdu_req->u.HTTP_Request;
+ std::string content = debug_http(*http_req);
+ int http_code = 400;
+ http_response(package, content, http_code);
+ return true;
+ }
+ package.session().close();
+ return false;
+}
+
+
+bool yf::SRUtoZ3950::Rep::build_sru_response(mp::Package &package,
+ mp::odr &odr_en,
+ Z_SOAP *soap,
+ const Z_SRW_PDU *sru_pdu_res,
+ char *charset,
+ const char *stylesheet)
+ const
+{
+
+ // SRU request package translation to Z3950 package
+ if (sru_pdu_res)
+ std::cout << *(const_cast<Z_SRW_PDU *>(sru_pdu_res)) << "\n";
+ else
+ std::cout << "SRU empty\n";
+
+
+ Z_GDU *zgdu_req = package.request().get();
+ if (zgdu_req && zgdu_req->which == Z_GDU_HTTP_Request)
+ {
+ Z_GDU *zgdu_res //= z_get_HTTP_Response(odr_en, 200);
+ = odr_en.create_HTTP_Response(package.session(),
+ zgdu_req->u.HTTP_Request,
+ 200);
+ Z_HTTP_Response * http_res = zgdu_res->u.HTTP_Response;
+
+ static Z_SOAP_Handler soap_handlers[4] = {
+ {"http://www.loc.gov/zing/srw/", 0,
+ (Z_SOAP_fun) yaz_srw_codec},
+ {"http://www.loc.gov/zing/srw/v1.0/", 0,
+ (Z_SOAP_fun) yaz_srw_codec},
+ {"http://www.loc.gov/zing/srw/update/", 0,
+ (Z_SOAP_fun) yaz_ucp_codec},
+ {0, 0, 0}
+ };
+
+ //if (!stylesheet && assoc->server)
+ //stylesheet = assoc->server->stylesheet;
+
+ /* empty stylesheet means NO stylesheet */
+ //if (stylesheet && *stylesheet == '\0')
+ // stylesheet = 0;
+ //ret = z_soap_codec_enc_xsl(assoc->encode, &soap_package,
+ //&hres->content_buf, &hres->content_len,
+ // soap_handlers, charset, stylesheet);
+
+ // encoding SRU package
+
+ soap->u.generic->p = (void*) sru_pdu_res;
+ //int ret =
+ z_soap_codec_enc_xsl(odr_en, &soap,
+ &http_res->content_buf, &http_res->content_len,
+ soap_handlers, charset, 0);
+
+ package.response() = zgdu_res;
+ return true;
+ }
+ package.session().close();
+ return false;
+}
+
+
+
+ Z_SRW_PDU * yf::SRUtoZ3950::Rep::decode_sru_request(mp::Package &package,
+ mp::odr &odr_de,
+ Z_SOAP *&soap,
+ char *charset,
+ const char *stylesheet)
+ const
+{
+ Z_GDU *zgdu_req = package.request().get();
+ Z_SRW_PDU *sru_pdu_req = 0;
+
+ // ignoring all non HTTP_Request packages
+ if (!zgdu_req || !(zgdu_req->which == Z_GDU_HTTP_Request)){
+ return 0;
+ }
+