#include <set>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/utility.hpp>
+#include <boost/type_traits/is_convertible.hpp>
#include "../singleton.hh"
#include "../mpl.hh"
#include "StreamRegistry.hh"
///////////////////////////////////////////////////////////////////////////
// Types
+ enum action_t { ACCEPT, REJECT };
+
+ struct RoutingEntry
+ {
+ RoutingEntry();
+ bool operator==(RoutingEntry const & other);
+
+ std::string stream() const;
+ std::string area() const;
+ unsigned level() const;
+ action_t action() const;
+
+ private:
+ RoutingEntry(detail::StreamBase const * stream, detail::AreaBase const * area,
+ unsigned level, action_t action);
+
+ detail::StreamBase const * stream_;
+ detail::AreaBase const * area_;
+ unsigned level_;
+ action_t action_;
+
+ friend class Target;
+ };
+
+ private:
+ typedef std::vector<RoutingEntry> RIB;
+
+ public:
+ typedef RIB::const_iterator iterator;
+
///////////////////////////////////////////////////////////////////////////
///\name Structors and default members
///@{
///@}
- template <class Stream>
- void route();
-
- template <class Stream, class Arg0>
- void route();
-
- template <class Stream, class Area, class Level>
- void route();
-
- protected:
-
- std::string timestamp();
+ template <class Stream> void route(
+ action_t action = ACCEPT, int index = -1);
+ template <class Stream, class Level> void route(
+ action_t action = ACCEPT, int index = -1,
+ typename boost::enable_if< boost::is_convertible<Level*,
+ detail::LevelBase *> >::type * = 0);
+ template <class Stream, class Area> void route(
+ action_t action = ACCEPT, int index = -1,
+ typename boost::enable_if< boost::is_convertible<Area*,
+ detail::AreaBase *> >::type * = 0);
+ template <class Stream, class AreaClass> void route(
+ action_t action = ACCEPT, int index = -1,
+ typename boost::enable_if< boost::is_convertible<typename AreaClass::SENFLogArea *,
+ detail::AreaBase *> >::type * = 0);
+ template <class Stream, class Area, class Level> void route(
+ action_t action = ACCEPT, int index = -1,
+ typename boost::enable_if< boost::is_convertible<Area *,
+ detail::AreaBase *> >::type * = 0);
+ template <class Stream, class AreaClass, class Level> void route(
+ action_t action = ACCEPT, int index = -1,
+ typename boost::enable_if< boost::is_convertible<typename AreaClass::SENFLogArea *,
+ detail::AreaBase *> >::type * = 0);
+
+ void route(std::string const & stream, std::string const & area = "",
+ unsigned level = NONE::value, action_t action = ACCEPT, int index = -1);
+
+ template <class Stream> void unroute(
+ action_t action = ACCEPT);
+ template <class Stream, class Level> void unroute(
+ action_t action = ACCEPT,
+ typename boost::enable_if< boost::is_convertible<Level*,
+ detail::LevelBase *> >::type * = 0);
+ template <class Stream, class Area> void unroute(
+ action_t action = ACCEPT,
+ typename boost::enable_if< boost::is_convertible<Area*,
+ detail::AreaBase *> >::type * = 0);
+ template <class Stream, class AreaClass> void unroute(
+ action_t action = ACCEPT,
+ typename boost::enable_if< boost::is_convertible<typename AreaClass::SENFLogArea *,
+ detail::AreaBase *> >::type * = 0);
+ template <class Stream, class Area, class Level> void unroute(
+ action_t action = ACCEPT,
+ typename boost::enable_if< boost::is_convertible<Area*,
+ detail::AreaBase *> >::type * = 0);
+ template <class Stream, class AreaClass, class Level> void unroute(
+ action_t action = ACCEPT,
+ typename boost::enable_if< boost::is_convertible<typename AreaClass::SENFLogArea *,
+ detail::AreaBase *> >::type * = 0);
+
+ void unroute(std::string const & stream, std::string const & area = "",
+ unsigned level = NONE::value, action_t action = ACCEPT);
+ void unroute(int index);
+
+ struct InvalidStreamException : public std::exception
+ { virtual char const * what() const throw()
+ { return "senf::log::Target::InvalidStreamException"; } };
+
+ struct InvalidAreaException : public std::exception
+ { virtual char const * what() const throw()
+ { return "senf::log::Target::InvalidAreaException"; } };
+ iterator begin() const;
+ iterator end() const;
+
private:
-
void route(detail::StreamBase const * stream, detail::AreaBase const * area,
- unsigned level);
+ unsigned level, action_t action, int index);
void unroute(detail::StreamBase const * stream, detail::AreaBase const * area,
- unsigned level);
-
- template <class Area>
- void route(detail::StreamBase const * stream, detail::AreaBase const *);
-
- template <class Level>
- void route(detail::StreamBase const * stream, detail::LevelBase const *);
+ unsigned level, action_t action);
- void updateAreaCache(detail::AreaBase const & area, detail::StreamBase const * stream,
- unsigned level);
+ void updateRoutingCache(detail::StreamBase const * stream, detail::AreaBase const * area);
void write(boost::posix_time::ptime timestamp, detail::StreamBase const & stream,
detail::AreaBase const & area, unsigned level, std::string const & message);
private:
# endif
- struct RoutingEntry
- {
- RoutingEntry(detail::StreamBase const * stream_, detail::AreaBase const * area_,
- unsigned level_)
- : stream(stream_), area(area_), level(level_) {}
- RoutingEntry()
- : stream(0), area(0), level(0) {}
-
- bool operator==(RoutingEntry const & other)
- { return stream == other.stream && area == other.area && level == other.level; }
-
- detail::StreamBase const * stream;
- detail::AreaBase const * area;
- unsigned level;
- };
-
- typedef std::vector<RoutingEntry> RIB;
-
RIB rib_;
- friend class TargetRegistry;
+ friend class detail::AreaBase;
};
/** \brief Target registry