- Z_APDU *apdu = gdu->u.z3950;
- if (apdu->which == Z_APDU_initRequest)
- {
- yp2::odr odr;
-
- package.response() = odr.create_close(
- apdu,
- Z_Close_protocolError,
- "double init");
-
- package.session().close();
- }
- else if (apdu->which == Z_APDU_searchRequest)
- {
- f->search(package, apdu);
- }
- else if (apdu->which == Z_APDU_presentRequest)
- {
- f->present(package, apdu);
- }
- else if (apdu->which == Z_APDU_scanRequest)
- {
- f->scan(package, apdu);
- }
- else
- {
- yp2::odr odr;
-
- package.response() = odr.create_close(
- apdu, Z_Close_protocolError,
- "unsupported APDU in filter_virt_db");
-
- package.session().close();
- }
+ f->m_init_gdu = gdu;
+
+ mp::odr odr;
+ Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0);
+ Z_InitResponse *resp = apdu->u.initResponse;
+
+ int i;
+ static const int masks[] = {
+ Z_Options_search,
+ Z_Options_present,
+ Z_Options_namedResultSets,
+ Z_Options_scan,
+ -1
+ };
+ for (i = 0; masks[i] != -1; i++)
+ if (ODR_MASK_GET(req->options, masks[i]))
+ ODR_MASK_SET(resp->options, masks[i]);
+
+ static const int versions[] = {
+ Z_ProtocolVersion_1,
+ Z_ProtocolVersion_2,
+ Z_ProtocolVersion_3,
+ -1
+ };
+ for (i = 0; versions[i] != -1; i++)
+ if (ODR_MASK_GET(req->protocolVersion, versions[i]))
+ ODR_MASK_SET(resp->protocolVersion, versions[i]);
+ else
+ break;
+
+ package.response() = apdu;
+ f->m_is_virtual = true;
+ }
+ }
+ else if (!f->m_is_virtual)
+ package.move();
+ else if (gdu && gdu->which == Z_GDU_Z3950)
+ {
+ Z_APDU *apdu = gdu->u.z3950;
+ if (apdu->which == Z_APDU_initRequest)
+ {
+ mp::odr odr;
+
+ package.response() = odr.create_close(
+ apdu,
+ Z_Close_protocolError,
+ "double init");
+
+ package.session().close();
+ }
+ else if (apdu->which == Z_APDU_searchRequest)
+ {
+ f->search(package, apdu);
+ }
+ else if (apdu->which == Z_APDU_presentRequest)
+ {
+ f->present(package, apdu);
+ }
+ else if (apdu->which == Z_APDU_scanRequest)
+ {
+ f->scan(package, apdu);
+ }
+ else if (apdu->which == Z_APDU_close)
+ {
+ package.session().close();
+ }
+ else
+ {
+ mp::odr odr;
+
+ package.response() = odr.create_close(
+ apdu, Z_Close_protocolError,
+ "unsupported APDU in filter_virt_db");
+
+ package.session().close();