+void yf::Log::Impl::configure(const xmlNode *ptr)
+{
+ for (ptr = ptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type != XML_ELEMENT_NODE)
+ continue;
+ if (!strcmp((const char *) ptr->name, "message"))
+ m_msg_config = mp::xml::get_text(ptr);
+ else if (!strcmp((const char *) ptr->name, "filename"))
+ {
+ std::string fname = mp::xml::get_text(ptr);
+ openfile(fname);
+ }
+ else if (!strcmp((const char *) ptr->name, "time-format"))
+ {
+ m_time_format = mp::xml::get_text(ptr);
+ }
+ else if (!strcmp((const char *) ptr->name, "category"))
+ {
+ const struct _xmlAttr *attr;
+ for (attr = ptr->properties; attr; attr = attr->next)
+ {
+ if (!strcmp((const char *) attr->name, "access"))
+ m_access = mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name, "user-access"))
+ m_user_access = mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name, "request-apdu"))
+ m_req_apdu = mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name, "response-apdu"))
+ m_res_apdu = mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name, "apdu"))
+ {
+ m_req_apdu = mp::xml::get_bool(attr->children, true);
+ m_res_apdu = m_req_apdu;
+ }
+ else if (!strcmp((const char *) attr->name,
+ "request-session"))
+ m_req_session =
+ mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name,
+ "response-session"))
+ m_res_session =
+ mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name,
+ "session"))
+ {
+ m_req_session =
+ mp::xml::get_bool(attr->children, true);
+ m_res_session = m_req_session;
+ }
+ else if (!strcmp((const char *) attr->name,
+ "init-options"))
+ m_init_options =
+ mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name,
+ "init-options"))
+ m_init_options =
+ mp::xml::get_bool(attr->children, true);
+ else
+ throw mp::filter::FilterException(
+ "Bad attribute " + std::string((const char *)
+ attr->name));
+ }
+ }
+ else
+ {
+ throw mp::filter::FilterException("Bad element "
+ + std::string((const char *)
+ ptr->name));
+ }
+ }
+}
+
+void yf::Log::Impl::process(mp::Package &package)
+{
+ Z_GDU *gdu = package.request().get();
+ std::string user("-");
+
+ yaz_timing_t timer = yaz_timing_create();
+
+ // scope for session lock
+ {
+ boost::mutex::scoped_lock scoped_lock(m_session_mutex);
+
+ if (gdu && gdu->which == Z_GDU_Z3950)
+ {
+ Z_APDU *apdu_req = gdu->u.z3950;
+ if (apdu_req->which == Z_APDU_initRequest)
+ {
+ Z_InitRequest *req = apdu_req->u.initRequest;
+ Z_IdAuthentication *a = req->idAuthentication;
+ if (a)
+ {
+ if (a->which == Z_IdAuthentication_idPass)
+ user = a->u.idPass->userId;
+ else if (a->which == Z_IdAuthentication_open)
+ user = a->u.open;
+
+ m_sessions[package.session()] = user;
+ }
+ }