void failNotify();
void timeoutNotify();
void recv_GDU(Z_GDU *gdu, int len);
+ void fixup_nsd(ODR odr, Z_Records *records);
yazpp_1::IPDU_Observer* sessionNotify(
yazpp_1::IPDU_Observable *the_PDU_Observable,
int fd);
}
}
+void yf::Z3950Client::Assoc::fixup_nsd(ODR odr, Z_Records *records)
+{
+ if (records && records->which == Z_Records_NSD)
+ {
+ Z_DefaultDiagFormat *nsd = records->u.nonSurrogateDiagnostic;
+ if (nsd->which == Z_DiagRec_defaultFormat)
+ {
+ std::string addinfo;
+
+ if (nsd->u.v2Addinfo)
+ {
+ addinfo.assign(nsd->u.v2Addinfo);
+ addinfo += " ";
+ }
+ addinfo += "(backend=" + m_host + ")";
+ nsd->u.v2Addinfo = odr_strdup(odr, addinfo.c_str());
+ }
+ }
+}
+
void yf::Z3950Client::Assoc::recv_GDU(Z_GDU *gdu, int len)
{
m_waiting = false;
if (m_package)
+ {
+ mp::odr odr; // must be in scope for response() = assignment
+ if (gdu && gdu->which == Z_GDU_Z3950)
+ {
+ Z_APDU *apdu = gdu->u.z3950;
+ switch (apdu->which)
+ {
+ case Z_APDU_searchResponse:
+ fixup_nsd(odr, apdu->u.searchResponse->records);
+ break;
+ case Z_APDU_presentResponse:
+ fixup_nsd(odr, apdu->u.presentResponse->records);
+ break;
+ }
+ }
m_package->response() = gdu;
+ }
}
yazpp_1::IPDU_Observer *yf::Z3950Client::Assoc::sessionNotify(
c->m_waiting = true;
if (!c->m_connected)
{
- c->client(c->m_host.c_str());
+ if (c->client(c->m_host.c_str()))
+ {
+ mp::odr odr;
+ package.response() =
+ odr.create_close(gdu->u.z3950, Z_Close_peerAbort, 0);
+ package.session().close();
+ return;
+ }
c->timeout(1); // so timeoutNotify gets called once per second
+
while (!c->m_destroyed && c->m_waiting
&& c->m_socket_manager->processEvent() > 0)
}
}
-void yf::Z3950Client::configure(const xmlNode *ptr, bool test_only)
+void yf::Z3950Client::configure(const xmlNode *ptr, bool test_only,
+ const char *path)
{
for (ptr = ptr->children; ptr; ptr = ptr->next)
{
continue;
if (!strcmp((const char *) ptr->name, "timeout"))
{
- m_p->m_timeout_sec = mp::xml::get_int(ptr->children, 30);
+ m_p->m_timeout_sec = mp::xml::get_int(ptr, 30);
}
else if (!strcmp((const char *) ptr->name, "default_target"))
{
}
else if (!strcmp((const char *) ptr->name, "max-sockets"))
{
- m_p->m_max_sockets = mp::xml::get_int(ptr->children, 0);
+ m_p->m_max_sockets = mp::xml::get_int(ptr, 0);
}
else if (!strcmp((const char *) ptr->name, "force_close"))
{
- m_p->m_force_close = mp::xml::get_bool(ptr->children, 0);
+ m_p->m_force_close = mp::xml::get_bool(ptr, 0);
}
else
{