+void yf::VirtualDB::Frontend::fixup_npr_record(ODR odr, Z_NamePlusRecord *npr,
+ BackendPtr b)
+{
+ if (npr->databaseName)
+ {
+ std::string b_database = std::string(npr->databaseName);
+
+ // consider each of the frontend databases..
+ std::list<std::string>::const_iterator db_it;
+ for (db_it = b->m_frontend_databases.begin();
+ db_it != b->m_frontend_databases.end(); db_it++)
+ {
+ // see which target it corresponds to.. (if any)
+ std::map<std::string,VirtualDB::Map>::const_iterator map_it;
+
+ map_it = m_p->m_maps.find(mp::util::database_name_normalize(*db_it));
+ if (map_it != m_p->m_maps.end())
+ {
+ VirtualDB::Map m = map_it->second;
+
+ std::list<std::string>::const_iterator t;
+ for (t = m.m_targets.begin(); t != m.m_targets.end(); t++)
+ {
+ if (*t == b_database)
+ {
+ npr->databaseName = odr_strdup(odr, (*db_it).c_str());
+ return;
+ }
+ }
+ }
+
+ }
+ db_it = b->m_frontend_databases.begin();
+ if (db_it != b->m_frontend_databases.end())
+ {
+ std::string database = *db_it;
+ npr->databaseName = odr_strdup(odr, database.c_str());
+ }
+ }
+}
+
+void yf::VirtualDB::Frontend::fixup_npr_records(ODR odr, Z_Records *records,
+ BackendPtr b)
+{
+ if (records && records->which == Z_Records_DBOSD)
+ {
+ Z_NamePlusRecordList *nprlist = records->u.databaseOrSurDiagnostics;
+ int i;
+ for (i = 0; i < nprlist->num_records; i++)
+ {
+ fixup_npr_record(odr, nprlist->records[i], b);
+ }
+ }
+}
+
+void yf::VirtualDB::Frontend::fixup_package(mp::Package &p, BackendPtr b)
+{
+ Z_GDU *gdu = p.response().get();
+ mp::odr odr;
+
+ if (gdu && gdu->which == Z_GDU_Z3950)
+ {
+ Z_APDU *apdu = gdu->u.z3950;
+ if (apdu->which == Z_APDU_presentResponse)
+ {
+ fixup_npr_records(odr, apdu->u.presentResponse->records, b);
+ p.response() = gdu;
+ }
+ else if (apdu->which == Z_APDU_searchResponse)
+ {
+ fixup_npr_records(odr, apdu->u.searchResponse->records, b);
+ p.response() = gdu;
+ }
+ }
+}
+
+void yf::VirtualDB::Frontend::present(mp::Package &package, Z_APDU *apdu_req)