Fix documentation build under maverick (doxygen 1.7.1)
[senf.git] / senf / Utils / Logger / Target.cc
index 9c883dc..2884449 100644 (file)
 #include <algorithm>
 #include <boost/format.hpp>
 #include "ConsoleTarget.hh"
-#include "../Console/Console.hh"
-#include "../Console/Sysdir.hh"
-#include "../membind.hh"
+#include <senf/Utils/Console/Console.hh>
 
 //#include "Target.mpp"
 #define prefix_
-///////////////////////////////cc.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::log::Target
 
 namespace senf {
@@ -48,7 +46,7 @@ namespace log {
 
 namespace detail {
 
-    SENF_CONSOLE_REGISTER_ENUM_MEMBER( TargetRegistry, Level, 
+    SENF_CONSOLE_REGISTER_ENUM_MEMBER( TargetRegistry, Level,
                                        (VERBOSE)(NOTICE)(MESSAGE)(IMPORTANT)(CRITICAL)(FATAL) );
 
 }}}
@@ -56,68 +54,78 @@ namespace detail {
 prefix_ senf::log::Target::Target(std::string const & name)
 {
     namespace kw = senf::console::kw;
+    namespace fty = senf::console::factory;
 
     detail::TargetRegistry::instance().registerTarget(this, name);
-    consoleDir_().add("list", senf::membind(&Target::consoleList, this))
-        .doc("Show routing table\n"
-             "\n"
-             "Columns:\n"
-             "    #       rule index\n"
-             "    STREAM  stream to match, empty to match all streams\n"
-             "    AREA    area to match, empty to match all targets\n"
-             "    LEVEL   match messages with level above this. Log levels in increasing order\n"
-             "            are:\n"
-             "                verbose, notice, message, important, critical, fatal\n"
-             "    ACTION  action to take: accept or reject");
-    consoleDir_().add("route", senf::membind(&Target::consoleRoute, this))
-        .arg("index", "index at which to insert new rule")
-        .arg("parameters", "log parameters. The log parameters select the log stream, log area\n"
-             "              and log level. You may specify any combination of these parameterse\n"
-             "              in any order. Use the '/sys/log/stream' and '/sys/log/areas' commands\n"
-             "              to list all valid streams and areas. Valid log levels are:\n"
-             "                  VERBOSE NOTICE MESSAGE IMPORTANT CRITICAL FATAL")
-        .arg("action", "routing action, one of: ACCEPT, REJECT",
-             kw::default_value=ACCEPT)
-        .doc("Add routing entry. Log messages are matched against the routing table beginning\n"
-             "with the first entry. The action of the first matching entry determines the\n"
-             "handling of the message.\n"
-             "\n"
-             "Examples:\n"
-             "\n"
-             "    route ()\n"
-             "        route all messages to this target.\n"
-             "\n"
-             "    route 1 (my::Class)\n"
-             "        route all messages which are in the my::Class area. Insert this route after\n"
-             "        the first route,\n"
-             "\n"
-             "    route (senf::log::Debug VERBOSE) REJECT\n"
-             "    route (VERBOSE)\n"
-             "        route all messages not in the senf::log::Debug stream to the current area.\n"
-             "\n"
-             "The additional optional index argument identifies the position in the routing table\n"
-             "where the new routing entry will be added. Positive numbers count from the\n"
-             "beginning, 0 being the first routing entry. Negative values count from the end.");
-    consoleDir_().add("route", boost::function<void (detail::LogParameters, action_t)>(
-                          boost::bind(&Target::consoleRoute, this, -1, _1, _2)))
-        .arg("parameters")
-        .arg("action", kw::default_value=ACCEPT);
-    consoleDir_().add("unroute",
-                      senf::membind(static_cast<void (Target::*)(int)>(&Target::unroute), this))
-        .arg("index", "index of routing entry to remove")
-        .overloadDoc("Remove routing entry with the given index");
-    consoleDir_().add("unroute", senf::membind(&Target::consoleUnroute, this))
-        .arg("parameters", "log parameters. The log parameters select the log stream, log area\n"
-             "              and log level. You may specify any combination of these parameterse\n"
-             "              in any order. Use the '/sys/log/stream' and '/sys/log/areas' commands\n"
-             "              to list all valid streams and areas. Valid log levels are:\n"
-             "                  VERBOSE NOTICE MESSAGE IMPORTANT CRITICAL FATAL")
-        .arg("action", "routing action, one of: ACCEPT, REJECT",
-             kw::default_value=ACCEPT)
-        .overloadDoc("Remove the routing entry matching the specified arguments.");
-    consoleDir_().add("flush", senf::membind(&Target::flush, this))
-        .doc("Remove all routing entries clearing the routing table. This will disable all\n"
-             "logging output on this target.");
+    consoleDir_()
+        .add("list", fty::Command(&Target::consoleList, this)
+             .doc("Show routing table\n"
+                  "\n"
+                  "Columns:\n"
+                  "    #       rule index\n"
+                  "    STREAM  stream to match, empty to match all streams\n"
+                  "    AREA    area to match, empty to match all targets\n"
+                  "    LEVEL   match messages with level above this. Log levels in increasing order\n"
+                  "            are:\n"
+                  "                verbose, notice, message, important, critical, fatal\n"
+                  "            If the log level is listed as 'default', the streams default limit\n"
+                  "            applies.\n"
+                  "    ACTION  action to take: accept or reject") );
+    consoleDir_()
+        .add("route", fty::Command(&Target::consoleRoute, this)
+             .arg("index", "index at which to insert new rule")
+             .arg("parameters", "log parameters. The log parameters select the log stream, log area\n"
+                  "              and log level. You may specify any combination of these parameters\n"
+                  "              in any order. Use the '/sys/log/stream' and '/sys/log/areas' commands\n"
+                  "              to list all valid streams and areas. Valid log levels are:\n"
+                  "                  VERBOSE NOTICE MESSAGE IMPORTANT CRITICAL FATAL")
+             .arg("action", "routing action, one of: ACCEPT, REJECT",
+                  kw::default_value=ACCEPT)
+             .doc("Add routing entry. Log messages are matched against the routing table beginning\n"
+                  "with the first entry. The action of the first matching entry determines the\n"
+                  "handling of the message.\n"
+                  "\n"
+                  "Examples:\n"
+                  "\n"
+                  "    route ()\n"
+                  "        route all messages with level above each streams default log limit to this\n"
+                  "        target.\n"
+                  "\n"
+                  "    route 1 (my::Class VERBOSE)\n"
+                  "        route all messages which are in the my::Class area. Insert this route after\n"
+                  "        the first route,\n"
+                  "\n"
+                  "    route (senf::log::Debug VERBOSE) REJECT\n"
+                  "    route (VERBOSE)\n"
+                  "        route all messages not in the senf::log::Debug stream to the current area.\n"
+                  "\n"
+                  "The additional optional index argument identifies the position in the routing table\n"
+                  "where the new routing entry will be added. Positive numbers count from the\n"
+                  "beginning, 0 being the first routing entry. Negative values count from the end.") );
+    consoleDir_()
+        .add("route", fty::Command<void (detail::LogParameters, action_t)>(
+                 boost::bind(&Target::consoleRoute, this, -1, _1, _2))
+             .arg("parameters")
+             .arg("action", kw::default_value=ACCEPT) );
+    consoleDir_()
+        .add("unroute",
+             fty::Command(static_cast<void (Target::*)(int)>(&Target::unroute), this)
+             .arg("index", "index of routing entry to remove")
+             .overloadDoc("Remove routing entry with the given index") );
+    consoleDir_()
+        .add("unroute", fty::Command(&Target::consoleUnroute, this)
+             .arg("parameters", "log parameters. The log parameters select the log stream, log area\n"
+                  "              and log level. You may specify any combination of these parameters\n"
+                  "              in any order. Use the '/sys/log/stream' and '/sys/log/areas' commands\n"
+                  "              to list all valid streams and areas. Valid log levels are:\n"
+                  "                  VERBOSE NOTICE MESSAGE IMPORTANT CRITICAL FATAL")
+             .arg("action", "routing action, one of: ACCEPT, REJECT",
+                  kw::default_value=ACCEPT)
+             .overloadDoc("Remove the routing entry matching the specified arguments.") );
+    consoleDir_()
+        .add("flush", fty::Command(&Target::flush, this)
+             .doc("Remove all routing entries clearing the routing table. This will disable all\n"
+                  "logging output on this target.") );
 }
 
 prefix_ senf::log::Target::~Target()
@@ -207,7 +215,7 @@ prefix_ void senf::log::Target::flush()
             updateRoutingCache(i->stream_, i->area_);
 }
 
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // protected members
 
 prefix_ senf::console::ScopedDirectory<> & senf::log::Target::consoleDir()
@@ -215,7 +223,7 @@ prefix_ senf::console::ScopedDirectory<> & senf::log::Target::consoleDir()
     return consoleDir_();
 }
 
-////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // private members
 
 prefix_ void senf::log::Target::route(detail::StreamBase const * stream,
@@ -318,22 +326,26 @@ namespace {
             return l.substr(l.size()-29);
         return l;
     }
+
+    char const * levelNames[] = {
+        "NONE", "VERBOSE", "NOTICE", "MESSAGE", "IMPORTANT", "CRITICAL", "FATAL", "DISABLED" };
+
+    char const * levelNamesList[] = {
+        "default", "verbose", "notice", "message", "important", "critical", "fatal", "disabled" };
 }
 
 prefix_ void senf::log::Target::consoleList(std::ostream & os)
 {
-    static char const * levels[] = { 
-        "verbose", "verbose", "notice", "message", "important", "critical", "fatal", "disabled" };
 
     boost::format fmt ("%2d %-29s %-29s %-9s %-6s\n");
     os << fmt % "#" % "STREAM" % "AREA" % "LEVEL" % "ACTION";
     unsigned n (0);
     for (iterator i (begin()); i != end(); ++i, ++n)
-        os << fmt 
-            % n 
+        os << fmt
+            % n
             % formatLabel(i->stream())
             % formatLabel(i->area())
-            % levels[i->level()]
+            % levelNamesList[i->level()]
             % (i->action() == ACCEPT ? "accept" : "reject");
 }
 
@@ -347,15 +359,17 @@ prefix_ void senf::log::Target::consoleUnroute(detail::LogParameters const & pm,
     unroute(pm.stream, pm.area, pm.level, action);
 }
 
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::log::detail::TargetRegistry
 
 prefix_ void senf::log::detail::TargetRegistry::dynamicTarget(std::auto_ptr<Target> target)
 {
-    target->consoleDir().add("remove", boost::function<void ()>(
-                                 boost::bind(
-                                     &TargetRegistry::consoleRemoveTarget, this, target.get())))
-        .doc("Remove target.");
+    namespace fty = senf::console::factory;
+
+    target->consoleDir()
+        .add("remove", fty::Command<void ()>(
+                 boost::bind(&TargetRegistry::consoleRemoveTarget, this, target.get()))
+             .doc("Remove target.") );
     dynamicTargets_.insert(target.release());
 }
 
@@ -389,36 +403,41 @@ prefix_ senf::log::detail::TargetRegistry::TargetRegistry()
     : fallbackRouting_(true)
 {
     namespace kw = senf::console::kw;
+    namespace fty = senf::console::factory;
 
     console::sysdir().add("log", consoleDir_());
-    consoleDir_().add("areas", senf::membind(&TargetRegistry::consoleAreas, this))
-        .doc("List all areas");
-    consoleDir_().add("streams", senf::membind(&TargetRegistry::consoleStreams, this))
-        .doc("List all streams");
-    consoleDir_().add("message", senf::membind(&TargetRegistry::consoleWrite, this))
-        .arg("parameters", "log parameters. The log parameters select the log stream, log area\n"
-             "              and log level. You may specify any combination of these parameterse\n"
-             "              in any order. Use the '/sys/log/stream' and '/sys/log/areas' commands\n"
-             "              to list all valid streams and areas. Valid log levels are:\n"
-             "                  VERBOSE NOTICE MESSAGE IMPORTANT CRITICAL FATAL",
-             kw::default_value = LogParameters::defaultParameters())
-        .arg("message", "message to write")
-        .doc("Write log message.\n"
-             "\n"
-             "Examples:\n"
-             "    message \"Test\";\n"
-             "    message (senf::log::DefaultArea NOTICE) \"Test notice\";\n"
-             "    message (FATAL) \"Program on fire\";\n"
-             "    message (VERBOSE senf::log::Debug) \"Debug message\";");
-    consoleDir_().add("self", senf::membind(&TargetRegistry::consoleSelf, this))
-        .doc("Get the log directory of the current network client. Example usage:\n"
-             "\n"
-             "Just get the log config directory\n"
-             "    $ /sys/log/self\n"
-             "    <Directory '/sys/log/client-xxx.xxx.xxx.xxx:xxx'>\n"
-             "\n"
-             "Route all messages to the currently connected client\n"
- "    $ /sys/log/self { route (); }");
+    consoleDir_()
+        .add("areas", fty::Command(&TargetRegistry::consoleAreas, this)
+             .doc("List all areas") );
+    consoleDir_()
+        .add("streams", fty::Command(&TargetRegistry::consoleStreams, this)
+             .doc("List all streams with the streams default runtime log level limit.") );
+    consoleDir_()
+        .add("message", fty::Command(&TargetRegistry::consoleWrite, this)
+             .arg("parameters", "log parameters. The log parameters select the log stream, log area\n"
+                  "              and log level. You may specify any combination of these parameters\n"
+                  "              in any order. Use the '/sys/log/stream' and '/sys/log/areas' commands\n"
+                  "              to list all valid streams and areas. Valid log levels are:\n"
+                  "                  VERBOSE NOTICE MESSAGE IMPORTANT CRITICAL FATAL",
+                  kw::default_value = LogParameters::defaultParameters())
+             .arg("message", "message to write")
+             .doc("Write log message.\n"
+                  "\n"
+                  "Examples:\n"
+                  "    message \"Test\";\n"
+                  "    message (senf::log::DefaultArea NOTICE) \"Test notice\";\n"
+                  "    message (FATAL) \"Program on fire\";\n"
+                  "    message (VERBOSE senf::log::Debug) \"Debug message\";") );
+    consoleDir_()
+        .add("self", fty::Command(&TargetRegistry::consoleSelf, this)
+             .doc("Get the log directory of the current network client. Example usage:\n"
+                  "\n"
+                  "Just get the log config directory\n"
+                  "    $ /sys/log/self\n"
+                  "    <Directory '/sys/log/client-xxx.xxx.xxx.xxx:xxx'>\n"
+                  "\n"
+                  "Route all messages to the currently connected client\n"
+                  "    $ /sys/log/self { route () ); }") );
 }
 
 prefix_ senf::log::detail::TargetRegistry::~TargetRegistry()
@@ -441,8 +460,10 @@ prefix_ void senf::log::detail::TargetRegistry::consoleStreams(std::ostream & os
 {
     StreamRegistry::iterator i (StreamRegistry::instance().begin());
     StreamRegistry::iterator const i_end (StreamRegistry::instance().end());
-    for (; i != i_end; ++i)
-        os << *i << "\n";
+    for (; i != i_end; ++i) {
+        os << *i << " "
+           << levelNames[StreamRegistry::instance().lookup(*i)->defaultRuntimeLimit()] << "\n";
+    }
 }
 
 prefix_ void senf::log::detail::TargetRegistry::consoleWrite(LogParameters pm,
@@ -456,9 +477,9 @@ prefix_ boost::shared_ptr<senf::console::DirectoryNode>
 senf::log::detail::TargetRegistry::consoleSelf(std::ostream & os)
 {
     return senf::console::Client::get(os).consoleDir().node().thisptr();
-}                                            
+}
 
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // senf::log::detail::LogParameters
 
 prefix_ void senf::log::detail::LogParameters::clear()
@@ -487,22 +508,19 @@ senf::log::detail::LogParameters::defaultParameters()
     return pm;
 }
 
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // namespace members
 
 prefix_ std::ostream & senf::log::operator<<(std::ostream & os, senf::log::Target::action_t const & action)
 {
-    if( action == Target::ACCEPT) os << "ACCEPT";
-    else if( action == Target::REJECT) os << "REJECT";
+    if (action == Target::ACCEPT) os << "ACCEPT";
+    else if (action == Target::REJECT) os << "REJECT";
     else os << "unknown action";
     return os;
 }
 
 namespace {
 
-    char const * levelNames[] = { 
-        "NONE", "VERBOSE", "NOTICE", "MESSAGE", "IMPORTANT", "CRITICAL", "FATAL", "DISABLED" };
-
     void parseParamToken(std::string const & value, senf::log::detail::LogParameters & out)
     {
         senf::log::detail::StreamBase const * s (
@@ -522,7 +540,7 @@ namespace {
             out.area = a;
             return;
         }
-        
+
         char const ** i (
             std::find(levelNames+1, levelNames+sizeof(levelNames)/sizeof(levelNames[0])-1, value));
         if (i == levelNames+sizeof(levelNames)/sizeof(levelNames[0])-1)
@@ -555,13 +573,13 @@ senf_console_parse_argument(console::ParseCommandInfo::TokensRange const & token
                             LogParameters & out)
 {
     out.clear();
-    
+
     for (console::ParseCommandInfo::TokensRange::iterator i (tokens.begin());
          i != tokens.end(); ++i)
         parseParamToken(i->value(), out);
 }
 
-//////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 // I need to put this here, otherwise the file target will not be registered
 // if it is not used ... :-(
 
@@ -569,11 +587,11 @@ senf::log::FileTarget::RegisterConsole senf::log::FileTarget::RegisterConsole::i
 senf::log::SyslogTarget::RegisterConsole senf::log::SyslogTarget::RegisterConsole::instance;
 senf::log::SyslogUDPTarget::RegisterConsole senf::log::SyslogUDPTarget::RegisterConsole::instance;
 
-///////////////////////////////cc.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 #undef prefix_
 //#include "Target.mpp"
 
-
+\f
 // Local Variables:
 // mode: c++
 // fill-column: 100