+ if (!ptr1)
+ return ;
+ for (ptr1 = ptr1->children; ptr1; ptr1 = ptr1->next)
+ {
+ if (ptr1->type != XML_ELEMENT_NODE)
+ continue;
+ if (!strcmp((const char *) ptr1->name, "record"))
+ {
+ const xmlNode *ptr2 = ptr1;
+ for (ptr2 = ptr2->children; ptr2; ptr2 = ptr2->next)
+ {
+ if (ptr2->type != XML_ELEMENT_NODE)
+ continue;
+ if (!strcmp((const char *) ptr2->name, "layer"))
+ {
+ std::string database;
+ std::string target;
+ std::string route;
+ std::string sru;
+ std::string query_encoding;
+ const xmlNode *ptr3 = ptr2;
+ for (ptr3 = ptr3->children; ptr3; ptr3 = ptr3->next)
+ {
+ if (ptr3->type != XML_ELEMENT_NODE)
+ continue;
+ if (!strcmp((const char *) ptr3->name, "id"))
+ {
+ database = mp::xml::get_text(ptr3);
+ }
+ else if (!strcmp((const char *) ptr3->name, "zurl"))
+ {
+ target = mp::xml::get_text(ptr3);
+ }
+ else if (!strcmp((const char *) ptr3->name, "sru"))
+ {
+ sru = mp::xml::get_text(ptr3);
+ }
+ else if (!strcmp((const char *) ptr3->name,
+ "queryEncoding"))
+ {
+ query_encoding = mp::xml::get_text(ptr3);
+ }
+ }
+ if (database.length() && target.length())
+ {
+ yaz_log(YLOG_LOG, "add db=%s target=%s",
+ database.c_str(), target.c_str());
+ Zoom::Searchable searchable(
+ mp::util::database_name_normalize(database),
+ target);
+ searchable.query_encoding = query_encoding;
+ searchable.sru = sru;
+ m_searchables.push_back(searchable);
+ }
+ }
+ }
+ }
+ }
+}
+
+
+void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only)
+{
+ for (ptr = ptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type != XML_ELEMENT_NODE)
+ continue;
+ if (!strcmp((const char *) ptr->name, "records"))
+ {
+ parse_torus(ptr);
+ }
+ else if (!strcmp((const char *) ptr->name, "torus"))
+ {
+ std::string url;
+ const struct _xmlAttr *attr;
+ for (attr = ptr->properties; attr; attr = attr->next)
+ {
+ if (!strcmp((const char *) attr->name, "url"))
+ url = mp::xml::get_text(attr->children);
+ else
+ throw mp::filter::FilterException(
+ "Bad attribute " + std::string((const char *)
+ attr->name));
+ }
+ torus.read_searchables(url);
+ xmlDoc *doc = torus.get_doc();
+ if (doc)
+ {
+ xmlNode *ptr = xmlDocGetRootElement(doc);
+ parse_torus(ptr);
+ }
+ }
+ else
+ {
+ throw mp::filter::FilterException
+ ("Bad element "
+ + std::string((const char *) ptr->name)
+ + " in zoom filter");
+ }
+ }