+ std::list<BackendSet>::const_iterator bsit;
+ bsit = it->second.m_backend_sets.begin();
+ for (; bsit != it->second.m_backend_sets.end(); bsit++)
+ {
+ std::list<Multi::FrontendSet::PresentJob>::const_iterator jit;
+ int start = -1;
+ int end = -1;
+
+ for (jit = jobs.begin(); jit != jobs.end(); jit++)
+ {
+ if (jit->m_backend == bsit->m_backend)
+ {
+ if (start == -1 || jit->m_pos < start)
+ start = jit->m_pos;
+ if (end == -1 || jit->m_pos > end)
+ end = jit->m_pos;
+ }
+ }
+ if (start != -1)
+ {
+ PackagePtr p = bsit->m_backend->m_package;
+
+ *req->resultSetStartPoint = start;
+ *req->numberOfRecordsRequested = end - start + 1;
+
+ p->request() = apdu_req;
+ p->copy_filter(package);
+
+ present_backend_list.push_back(bsit->m_backend);
+ }
+ }
+ multi_move(present_backend_list);
+
+ // look at each response
+ Z_Records *z_records_diag = 0;
+
+ std::list<BackendPtr>::const_iterator pbit = present_backend_list.begin();
+ for (; pbit != present_backend_list.end(); pbit++)
+ {
+ PackagePtr p = (*pbit)->m_package;
+
+ if (p->session().is_closed()) // if any backend closes, close frontend
+ package.session().close();
+
+ Z_GDU *gdu = p->response().get();
+ if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which ==
+ Z_APDU_presentResponse)
+ {
+ Z_APDU *b_apdu = gdu->u.z3950;
+ Z_PresentResponse *b_resp = b_apdu->u.presentResponse;
+
+ // see we get any errors (AKA diagnstics)
+ if (b_resp->records)
+ {
+ if (b_resp->records->which != Z_Records_DBOSD)
+ z_records_diag = b_resp->records;
+ // we may set this multiple times (TOO BAD!)
+ }
+ }
+ else
+ {
+ // if any target does not return present response - return that
+ package.response() = p->response();
+ return;
+ }
+ }
+
+ yp2::odr odr;
+ Z_APDU *f_apdu = odr.create_presentResponse(apdu_req, 0, 0);
+ Z_PresentResponse *f_resp = f_apdu->u.presentResponse;
+
+ if (z_records_diag)
+ {
+ f_resp->records = z_records_diag;
+ *f_resp->presentStatus = Z_PresentStatus_failure;
+ }
+ else
+ {
+ f_resp->records = (Z_Records *) odr_malloc(odr, sizeof(Z_Records));
+ Z_Records * records = f_resp->records;
+ records->which = Z_Records_DBOSD;
+ records->u.databaseOrSurDiagnostics =
+ (Z_NamePlusRecordList *)
+ odr_malloc(odr, sizeof(Z_NamePlusRecordList));
+ Z_NamePlusRecordList *nprl = records->u.databaseOrSurDiagnostics;
+ nprl->num_records = jobs.size();
+ nprl->records = (Z_NamePlusRecord**)
+ odr_malloc(odr, sizeof(Z_NamePlusRecord *) * nprl->num_records);
+ int i = 0;
+ std::list<Multi::FrontendSet::PresentJob>::const_iterator jit;
+ for (jit = jobs.begin(); jit != jobs.end(); jit++)
+ {
+ PackagePtr p = jit->m_backend->m_package;
+
+ Z_GDU *gdu = p->response().get();
+ Z_APDU *b_apdu = gdu->u.z3950;
+ Z_PresentResponse *b_resp = b_apdu->u.presentResponse;
+
+ nprl->records[i++] =
+ b_resp->records->u.databaseOrSurDiagnostics->
+ records[jit->m_inside_pos];
+ }
+ *f_resp->nextResultSetPosition = start + i;
+ *f_resp->numberOfRecordsReturned = i;
+ }