737 Z_GDU *gdu = package.request().get();
739 if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which ==
740 Z_APDU_initRequest && !f->m_is_virtual)
742 Z_InitRequest *req = gdu->u.z3950->u.initRequest;
744 std::list<std::string> vhosts;
745 mp::util::get_vhost_otherinfo(req->otherInfo, vhosts);
747 if (vhosts.size() > 0 &&
m_p->pass_vhosts)
756 Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0);
757 Z_InitResponse *resp = apdu->u.initResponse;
760 static const int masks[] = {
763 Z_Options_namedResultSets,
767 for (i = 0; masks[i] != -1; i++)
768 if (ODR_MASK_GET(req->options, masks[i]))
769 ODR_MASK_SET(resp->options, masks[i]);
771 static const int versions[] = {
777 for (i = 0; versions[i] != -1; i++)
778 if (ODR_MASK_GET(req->protocolVersion, versions[i]))
779 ODR_MASK_SET(resp->protocolVersion, versions[i]);
783 *resp->preferredMessageSize = *req->preferredMessageSize;
784 *resp->maximumRecordSize = *req->maximumRecordSize;
786 package.response() = apdu;
787 f->m_is_virtual =
true;
790 else if (!f->m_is_virtual)
792 else if (gdu && gdu->which == Z_GDU_Z3950)
794 Z_APDU *apdu = gdu->u.z3950;
795 if (apdu->which == Z_APDU_initRequest)
799 package.response() = odr.create_close(
801 Z_Close_protocolError,
804 package.session().close();
806 else if (apdu->which == Z_APDU_searchRequest)
808 f->search(package, apdu);
810 else if (apdu->which == Z_APDU_presentRequest)
812 f->present(package, apdu);
814 else if (apdu->which == Z_APDU_scanRequest)
816 f->scan(package, apdu);
818 else if (apdu->which == Z_APDU_close)
820 if (f->relay_apdu(package, apdu) == 0)
824 package.response() = odr.create_close(
825 apdu, Z_Close_finished,
"virt_db");
827 package.session().close();
834 package.response() = odr.create_close(
835 apdu, Z_Close_protocolError,
836 "unsupported APDU in filter_virt_db");
838 package.session().close();
841 m_p->release_frontend(package);