+yf::Log::LFile::LFile(std::string fname) : m_fname(fname)
+{
+ out.open(fname.c_str());
+}
+
+void yf::Log::Rep::openfile(const std::string &fname)
+{
+ std::list<LFilePtr>::const_iterator it = filter_log_files.begin();
+ for (; it != filter_log_files.end(); it++)
+ {
+ if ((*it)->m_fname == fname)
+ {
+ m_file = *it;
+ return;
+ }
+ }
+ LFilePtr newfile(new LFile(fname));
+ filter_log_files.push_back(newfile);
+ m_file = newfile;
+}
+
+void yf::Log::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_p->m_msg = mp::xml::get_text(ptr);
+ else if (!strcmp((const char *) ptr->name, "filename"))
+ {
+ std::string fname = mp::xml::get_text(ptr);
+ m_p->openfile(fname);
+ }
+ 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, "request-apdu"))
+ m_p->m_req_apdu = mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name, "response-apdu"))
+ m_p->m_res_apdu = mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name, "apdu"))
+ {
+ m_p->m_req_apdu = mp::xml::get_bool(attr->children, true);
+ m_p->m_res_apdu = m_p->m_req_apdu;
+ }
+ else if (!strcmp((const char *) attr->name,
+ "request-session"))
+ m_p->m_req_session =
+ mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name,
+ "response-session"))
+ m_p->m_res_session =
+ mp::xml::get_bool(attr->children, true);
+ else if (!strcmp((const char *) attr->name,
+ "session"))
+ {
+ m_p->m_req_session =
+ mp::xml::get_bool(attr->children, true);
+ m_p->m_res_session = m_p->m_req_session;
+ }
+ else if (!strcmp((const char *) attr->name,
+ "init-options"))
+ m_p->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));
+ }
+ }
+ if (!m_p->m_file)
+ m_p->openfile("metaproxy.log");
+}
+
+static mp::filter::Base* filter_creator()
+{
+ return new mp::filter::Log;
+}
+
+extern "C" {
+ struct metaproxy_1_filter_struct metaproxy_1_filter_log = {
+ 0,
+ "log",
+ filter_creator
+ };
+}