+bool mp_util::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)
+{
+
+ // 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);
+
+ // adding HTTP response code and headers
+ Z_HTTP_Response * http_res = zgdu_res->u.HTTP_Response;
+ //http_res->code = http_code;
+
+ std::string ctype("text/xml");
+ if (charset)
+ {
+ ctype += "; charset=";
+ ctype += charset;
+ }
+
+ z_HTTP_header_add(odr_en,
+ &http_res->headers, "Content-Type", ctype.c_str());
+
+ // packaging Z_SOAP into HTML response
+ static Z_SOAP_Handler soap_handlers[4] = {
+ {(char *)YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec},
+ {(char *)YAZ_XMLNS_SRU_v1_0, 0, (Z_SOAP_fun) yaz_srw_codec},
+ {(char *)YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec},
+ {0, 0, 0}
+ };
+
+
+ // empty stylesheet means NO stylesheet
+ if (stylesheet && *stylesheet == '\0')
+ stylesheet = 0;
+
+ // 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, stylesheet);
+
+
+ package.response() = zgdu_res;
+ return true;
+ }
+ package.session().close();
+ return false;
+}
+
+
+
+Z_SRW_PDU * mp_util::decode_sru_request(mp::Package &package,
+ mp::odr &odr_de,
+ mp::odr &odr_en,
+ Z_SRW_PDU *sru_pdu_res,
+ Z_SOAP **soap,
+ char *charset)
+{
+ Z_GDU *zgdu_req = package.request().get();
+ Z_SRW_PDU *sru_pdu_req = 0;
+
+ //assert((zgdu_req->which == Z_GDU_HTTP_Request));
+
+ //ignoring all non HTTP_Request packages
+ if (!zgdu_req || !(zgdu_req->which == Z_GDU_HTTP_Request))
+ {
+ return 0;
+ }
+
+ Z_HTTP_Request* http_req = zgdu_req->u.HTTP_Request;
+ if (! http_req)
+ return 0;
+
+ // checking if we got a SRU GET/POST/SOAP HTTP package
+ // closing connection if we did not ...
+ if (0 == yaz_sru_decode(http_req, &sru_pdu_req, soap,
+ odr_de, &charset,
+ &(sru_pdu_res->u.explain_response->diagnostics),
+ &(sru_pdu_res->u.explain_response->num_diagnostics)))
+ {
+ if (sru_pdu_res->u.explain_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
+mp_util::check_sru_query_exists(mp::Package &package,
+ mp::odr &odr_en,
+ Z_SRW_PDU *sru_pdu_res,
+ Z_SRW_searchRetrieveRequest const *sr_req)
+{
+#ifdef Z_SRW_query_type_cql
+ 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),
+ YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED,
+ "query");
+ yaz_add_srw_diagnostic(odr_en,
+ &(sru_pdu_res->u.response->diagnostics),
+ &(sru_pdu_res->u.response->num_diagnostics),
+ YAZ_SRW_QUERY_SYNTAX_ERROR,
+ "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),
+ YAZ_SRW_QUERY_SYNTAX_ERROR,
+ "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),
+ YAZ_SRW_QUERY_SYNTAX_ERROR,
+ "PQF query is empty");
+ return false;
+ }
+#else
+ if (!sr_req->query)
+ {
+ yaz_add_srw_diagnostic(odr_en,
+ &(sru_pdu_res->u.response->diagnostics),
+ &(sru_pdu_res->u.response->num_diagnostics),
+ YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED,
+ "query");
+ yaz_add_srw_diagnostic(odr_en,
+ &(sru_pdu_res->u.response->diagnostics),
+ &(sru_pdu_res->u.response->num_diagnostics),
+ YAZ_SRW_QUERY_SYNTAX_ERROR,
+ "CQL query is empty");
+ return false;
+ }
+#endif
+ return true;
+}
+
+
+Z_ElementSetNames *
+mp_util::build_esn_from_schema(mp::odr &odr_en, const char *schema)
+{
+ if (!schema)
+ return 0;
+
+ Z_ElementSetNames *esn
+ = (Z_ElementSetNames *) odr_malloc(odr_en, sizeof(Z_ElementSetNames));
+ esn->which = Z_ElementSetNames_generic;
+ esn->u.generic = odr_strdup(odr_en, schema);
+ return esn;
+}
+
+
+std::ostream& std::operator<<(std::ostream& os, Z_SRW_PDU& srw_pdu)