+ cql_transform_t cqlt = 0;
+ if (sptr->rpn2cql_fname.length())
+ {
+ char fullpath[1024];
+ char *cp = yaz_filepath_resolve(sptr->rpn2cql_fname.c_str(),
+ m_p->file_path.c_str(), 0, fullpath);
+ if (cp)
+ cqlt = cql_transform_open_fname(fullpath);
+ }
+ else
+ cqlt = cql_transform_create();
+
+ if (!cqlt)
+ {
+ *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
+ *addinfo = odr_strdup(odr, "zoom: missing/invalid cql2rpn file");
+ BackendPtr b;
+ xsltFreeStylesheet(xsp);
+ return b;
+ }
+
+ m_backend.reset();
+
+ BackendPtr b(new Backend);
+
+ b->cqlt = cqlt;
+ b->sptr = sptr;
+ b->xsp = xsp;
+ b->m_frontend_database = database;
+ b->enable_cproxy = param_nocproxy ? false : true;
+
+ if (sptr->query_encoding.length())
+ b->set_option("rpnCharset", sptr->query_encoding);
+
+ std::string extraArgs = sptr->extraArgs;
+
+ b->set_option("timeout", m_p->zoom_timeout.c_str());
+
+ if (m_p->apdu_log)
+ b->set_option("apdulog", "1");
+
+ if (sptr->piggyback && sptr->sru.length())
+ b->set_option("count", "1"); /* some SRU servers INSIST on getting
+ maximumRecords > 0 */
+ b->set_option("piggyback", sptr->piggyback ? "1" : "0");
+
+ if (authentication.length() == 0)
+ authentication = sptr->authentication;
+
+ if (proxy.length() == 0)
+ proxy = sptr->cfProxy;
+ b->m_proxy = proxy;
+
+ if (sptr->cfAuth.length())
+ {
+ // A CF target
+ b->set_option("user", sptr->cfAuth);
+ if (authentication.length())
+ {
+ size_t found = authentication.find('/');
+ if (found != std::string::npos)
+ {
+ out_names[no_out_args] = "user";
+ out_values[no_out_args++] =
+ odr_strdup(odr, authentication.substr(0, found).c_str());
+
+ out_names[no_out_args] = "password";
+ out_values[no_out_args++] =
+ odr_strdup(odr, authentication.substr(found+1).c_str());
+ }
+ else
+ {
+ out_names[no_out_args] = "user";
+ out_values[no_out_args++] =
+ odr_strdup(odr, authentication.c_str());
+ }
+ }
+ if (proxy.length())
+ {
+ out_names[no_out_args] = "proxy";
+ out_values[no_out_args++] = odr_strdup(odr, proxy.c_str());
+ }
+ if (sptr->cfSubDB.length())
+ {
+ out_names[no_out_args] = "subdatabase";
+ out_values[no_out_args++] = odr_strdup(odr, sptr->cfSubDB.c_str());
+ }
+ if (!param_nocproxy && b->sptr->contentConnector.length())
+ param_nocproxy = "1";
+
+ if (param_nocproxy)
+ {
+ out_names[no_out_args] = "nocproxy";
+ out_values[no_out_args++] = odr_strdup(odr, param_nocproxy);
+ }
+ }
+ else
+ {
+ const char *auth = authentication.c_str();
+ const char *cp1 = strchr(auth, ' ');
+ if (!cp1 && sptr->sru.length())
+ cp1 = strchr(auth, '/');
+ if (!cp1)
+ {
+ /* Z39.50 user/password style, or no password for SRU */
+ b->set_option("user", auth);
+ }
+ else
+ {
+ /* now consider group as well */
+ const char *cp2 = strchr(cp1 + 1, ' ');
+
+ b->set_option("user", auth, cp1 - auth);
+ if (!cp2)
+ b->set_option("password", cp1 + 1);
+ else
+ {
+ b->set_option("group", cp1 + 1, cp2 - cp1 - 1);
+ b->set_option("password", cp2 + 1);
+ }
+ }
+ if (sptr->authenticationMode.length())
+ b->set_option("authenticationMode", sptr->authenticationMode);
+ if (proxy.length())
+ b->set_option("proxy", proxy);
+ }
+ if (extraArgs.length())
+ b->set_option("extraArgs", extraArgs);
+
+ std::string url(sptr->target);
+ if (sptr->sru.length())
+ {
+ b->set_option("sru", sptr->sru);
+ if (url.find("://") == std::string::npos)
+ url = "http://" + url;
+ if (sptr->sru_version.length())
+ b->set_option("sru_version", sptr->sru_version);
+ }
+ if (no_out_args)
+ {
+ char *x_args = 0;
+ out_names[no_out_args] = 0; // terminate list
+
+ yaz_array_to_uri(&x_args, odr, (char **) out_names,
+ (char **) out_values);
+ url += "," + std::string(x_args);
+ }
+ package.log("zoom", YLOG_LOG, "url: %s", url.c_str());
+ b->connect(url, error, addinfo, odr);
+ if (*error == 0 && b->enable_cproxy)
+ create_content_session(package, b, error, addinfo, odr,
+ content_authentication.length() ?
+ content_authentication : authentication,
+ content_proxy.length() ? content_proxy : proxy,
+ realm);
+ if (*error == 0)
+ m_backend = b;
+ return b;
+}
+
+void yf::Zoom::Frontend::prepare_elements(BackendPtr b,
+ Odr_oid *preferredRecordSyntax,
+ const char *element_set_name,
+ bool &enable_pz2_retrieval,
+ bool &enable_pz2_transform,
+ bool &enable_record_transform,
+ bool &assume_marc8_charset)
+{
+ char oid_name_str[OID_STR_MAX];
+ const char *syntax_name = 0;
+
+ if (preferredRecordSyntax &&
+ !oid_oidcmp(preferredRecordSyntax, yaz_oid_recsyn_xml))
+ {
+ if (element_set_name &&
+ !strcmp(element_set_name, m_p->element_transform.c_str()))
+ {
+ enable_pz2_retrieval = true;
+ enable_pz2_transform = true;
+ }
+ else if (element_set_name &&
+ !strcmp(element_set_name, m_p->element_raw.c_str()))
+ {
+ enable_pz2_retrieval = true;
+ }
+ else if (m_p->record_xsp)
+ {
+ enable_pz2_retrieval = true;
+ enable_pz2_transform = true;
+ enable_record_transform = true;
+ }
+ }
+
+ if (enable_pz2_retrieval)
+ {
+ std::string configured_request_syntax = b->sptr->request_syntax;
+ if (configured_request_syntax.length())
+ {
+ syntax_name = configured_request_syntax.c_str();
+ const Odr_oid *syntax_oid =
+ yaz_string_to_oid(yaz_oid_std(), CLASS_RECSYN, syntax_name);
+ if (!oid_oidcmp(syntax_oid, yaz_oid_recsyn_usmarc)
+ || !oid_oidcmp(syntax_oid, yaz_oid_recsyn_opac))
+ assume_marc8_charset = true;
+ }
+ }
+ else if (preferredRecordSyntax)
+ syntax_name =
+ yaz_oid_to_string_buf(preferredRecordSyntax, 0, oid_name_str);
+
+ if (b->sptr->sru.length())
+ syntax_name = "XML";
+