+ Z_APDU *apdu_req = gdu->u.z3950;
+ if (apdu_req->which == Z_APDU_searchRequest)
+ {
+ int error_code = 0;
+ const char *addinfo = 0;
+ mp::odr odr;
+ Z_SearchRequest *req = apdu_req->u.searchRequest;
+
+ if (m_stylesheet)
+ {
+ xmlDocPtr doc_input = 0;
+ yaz_query2xml(req->query, &doc_input);
+
+ if (!doc_input)
+ {
+ error_code = YAZ_BIB1_MALFORMED_QUERY;
+ addinfo = "converion from Query to XML failed";
+ }
+ else
+ {
+ xmlDocPtr doc_res = xsltApplyStylesheet(m_stylesheet,
+ doc_input, 0);
+ if (!doc_res)
+ {
+ error_code = YAZ_BIB1_MALFORMED_QUERY;
+ addinfo = "XSLT transform failed for query";
+ }
+ else
+ {
+ const xmlNode *root_element = xmlDocGetRootElement(doc_res);
+ yaz_xml2query(root_element, &req->query, odr,
+ &error_code, &addinfo);
+ xmlFreeDoc(doc_res);
+ }
+ xmlFreeDoc(doc_input);
+ }
+ }
+ if (!error_code && charset_to.length() && charset_from.length() &&
+ (req->query->which == Z_Query_type_1
+ || req->query->which == Z_Query_type_101))
+ {
+ yaz_iconv_t cd = yaz_iconv_open(charset_to.c_str(),
+ charset_from.c_str());
+ if (cd)
+ {
+ int r = yaz_query_charset_convert_rpnquery_check(
+ req->query->u.type_1, odr, cd);
+ yaz_iconv_close(cd);
+ if (r)
+ { /* query could not be char converted */
+ error_code = YAZ_BIB1_MALFORMED_QUERY;
+ addinfo = "could not convert query to target charset";
+ }
+ }
+ }
+ if (error_code)
+ {
+ Z_APDU *f_apdu =
+ odr.create_searchResponse(apdu_req, error_code, addinfo);
+ package.response() = f_apdu;
+ return;
+ }
+ package.request() = gdu;
+ }
+ }