+ BackendInstanceList::iterator it = m_backend_list.begin();
+
+ while (it != m_backend_list.end())
+ {
+ if (*it == b)
+ {
+ mp::odr odr;
+ (*it)->m_close_package->response() = odr.create_close(
+ 0, Z_Close_lackOfActivity, 0);
+ (*it)->m_close_package->session().close();
+ (*it)->m_close_package->move();
+
+ it = m_backend_list.erase(it);
+ }
+ else
+ it++;
+ }
+}
+
+
+
+yf::SessionShared::BackendInstancePtr
+yf::SessionShared::BackendClass::get_backend(
+ const mp::Package &frontend_package)
+{
+ {
+ boost::mutex::scoped_lock lock(m_mutex_backend_class);
+
+ BackendInstanceList::const_iterator it = m_backend_list.begin();
+
+ BackendInstancePtr backend1; // null
+
+ for (; it != m_backend_list.end(); it++)
+ {
+ if (!(*it)->m_in_use)
+ {
+ if (!backend1
+ || (*it)->m_sequence_this < backend1->m_sequence_this)
+ backend1 = *it;
+ }
+ }
+ if (backend1)
+ {
+ use_backend(backend1);
+ return backend1;
+ }
+ }
+ return create_backend(frontend_package);
+}
+
+void yf::SessionShared::BackendClass::use_backend(BackendInstancePtr backend)
+{
+ backend->m_in_use = true;
+ backend->m_sequence_this = m_sequence_top++;
+}
+
+void yf::SessionShared::BackendInstance::timestamp()
+{
+ assert(m_in_use);
+ time(&m_time_last_use);
+}
+
+yf::SessionShared::BackendInstance::~BackendInstance()
+{
+ delete m_close_package;
+}
+
+yf::SessionShared::BackendInstancePtr yf::SessionShared::BackendClass::create_backend(
+ const mp::Package &frontend_package)
+{
+ BackendInstancePtr bp(new BackendInstance);
+ BackendInstancePtr null;
+
+ bp->m_close_package =
+ new mp::Package(bp->m_session, frontend_package.origin());
+ bp->m_close_package->copy_filter(frontend_package);
+
+ Package init_package(bp->m_session, frontend_package.origin());
+
+ init_package.copy_filter(frontend_package);
+
+ yazpp_1::GDU actual_init_request = m_init_request;
+ Z_GDU *init_pdu = actual_init_request.get();
+
+ assert(init_pdu->which == Z_GDU_Z3950);
+ assert(init_pdu->u.z3950->which == Z_APDU_initRequest);
+
+ Z_InitRequest *req = init_pdu->u.z3950->u.initRequest;
+ ODR_MASK_ZERO(req->options);
+
+ ODR_MASK_SET(req->options, Z_Options_search);
+ ODR_MASK_SET(req->options, Z_Options_present);
+ ODR_MASK_SET(req->options, Z_Options_namedResultSets);
+ ODR_MASK_SET(req->options, Z_Options_scan);
+
+ ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_1);
+ ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2);
+ ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3);
+
+ if (m_preferredMessageSize)
+ *req->preferredMessageSize = m_preferredMessageSize;
+ if (m_maximumRecordSize)
+ *req->maximumRecordSize = m_maximumRecordSize;
+
+ init_package.request() = init_pdu;
+
+ init_package.move();
+
+ boost::mutex::scoped_lock lock(m_mutex_backend_class);
+
+ m_named_result_sets = false;
+ Z_GDU *gdu = init_package.response().get();
+
+ if (gdu && gdu->which == Z_GDU_Z3950
+ && gdu->u.z3950->which == Z_APDU_initResponse)
+ {
+ Z_InitResponse *res = gdu->u.z3950->u.initResponse;
+ m_init_response = gdu->u.z3950;
+ if (ODR_MASK_GET(res->options, Z_Options_namedResultSets))
+ {
+ m_named_result_sets = true;
+ }
+ if (*gdu->u.z3950->u.initResponse->result
+ && !init_package.session().is_closed())
+ {
+ bp->m_in_use = true;
+ time(&bp->m_time_last_use);
+ bp->m_sequence_this = 0;
+ bp->m_result_set_sequence = 0;
+ m_backend_list.push_back(bp);
+ return bp;
+ }
+ }
+ else
+ {
+ yazpp_1::GDU empty_gdu;
+ m_init_response = empty_gdu;
+ }
+
+ if (!init_package.session().is_closed())
+ {
+ init_package.copy_filter(frontend_package);
+ init_package.session().close();
+ init_package.move();
+ }
+ return null;