From 49a0cb0879b8568de7044dd23afc4aa62b845152 Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Tue, 7 Jul 2009 10:59:36 +0000
Subject: [PATCH] Utils: Add hexdumpQuote() utility Utils: Optimize
 ExceptionMixin implementation Utils/Console: Add error logging to UDPServer

---
 Scheduler/Scheduler.cc     |  2 +-
 Utils/Console/UDPServer.cc | 16 +++++++++-------
 Utils/Exception.cc         |  4 +++-
 Utils/Exception.cci        | 20 ++++++++++++++++----
 Utils/Exception.hh         |  6 ++++--
 Utils/Logger/TimeSource.ih |  5 +++--
 Utils/hexdump.ct           |  9 +++++++++
 Utils/hexdump.hh           |  7 +++++--
 8 files changed, 50 insertions(+), 19 deletions(-)

diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc
index 471b743a2..1f9464364 100644
--- a/Scheduler/Scheduler.cc
+++ b/Scheduler/Scheduler.cc
@@ -165,7 +165,7 @@ prefix_ void senf::scheduler::hiresTimers()
 prefix_ senf::log::time_type senf::scheduler::LogTimeSource::operator()()
     const
 {
-    return now();
+    return senf::scheduler::now();
 }
 
 ///////////////////////////////////////////////////////////////////////////
diff --git a/Utils/Console/UDPServer.cc b/Utils/Console/UDPServer.cc
index 312a03de1..8a0c33bbe 100644
--- a/Utils/Console/UDPServer.cc
+++ b/Utils/Console/UDPServer.cc
@@ -45,7 +45,7 @@ prefix_ senf::console::UDPServer::UDPServer(senf::INet4SocketAddress const & add
 {
     if (address.address().multicast())
         handle_.facet<senf::INet4MulticastSocketProtocol>().mcAddMembership(address.address());
-    SENF_LOG(("UDP Console server started at " << address));
+    SENF_LOG(("UDP Console server started at " << address ));
 }
 
 prefix_ senf::console::UDPServer::UDPServer(senf::INet6SocketAddress const & address)
@@ -58,7 +58,7 @@ prefix_ senf::console::UDPServer::UDPServer(senf::INet6SocketAddress const & add
 {
     if (address.address().multicast())
         handle_.facet<senf::INet6MulticastSocketProtocol>().mcAddMembership(address.address());
-    SENF_LOG(("UDP Console server started at " << address));
+    SENF_LOG(("UDP Console server started at " << address ));
 }
 
 prefix_ senf::console::UDPServer & senf::console::UDPServer::replies(bool enable)
@@ -123,12 +123,14 @@ prefix_ void senf::console::UDPServer::handleInput(int events)
     catch (Executor::ExitException &) {
         // Ignored
     }
+    catch (ExceptionMixin & ex) {
+        stream << ex.message() << '\n';
+        SENF_LOG((senf::log::IMPORTANT)("Error: " << ex.message()));
+        SENF_LOG((senf::log::NOTICE)(ex.backtrace()));
+    }
     catch (std::exception & ex) {
-        std::string msg (ex.what());
-        std::string::size_type i (msg.find("-- \n"));
-        if (i != std::string::npos)
-            msg = msg.substr(i+4);
-        stream << msg << std::endl;
+        stream << ex.what() << '\n';
+        SENF_LOG((senf::log::IMPORTANT)("Error: " << ex.what()));
     }
     if (replies_ && (emptyReplies_ || ! stream.str().empty())) {
         if (target_)
diff --git a/Utils/Exception.cc b/Utils/Exception.cc
index 737214da9..ee1ec1860 100644
--- a/Utils/Exception.cc
+++ b/Utils/Exception.cc
@@ -47,7 +47,9 @@ prefix_ void senf::ExceptionMixin::addBacktrace()
     std::stringstream ss;
     ss << "\nException at\n";
     formatBacktrace(ss, entries, nEntries);
-    ss << "-- \n" << message_;
+    ss << "-- \n";
+    excLen_ = ss.str().size();
+    ss << what_;
     what_ = ss.str();
 }
 #endif
diff --git a/Utils/Exception.cci b/Utils/Exception.cci
index 3366fe234..852852aa0 100644
--- a/Utils/Exception.cci
+++ b/Utils/Exception.cci
@@ -31,23 +31,35 @@
 // senf::ExceptionMixin
 
 prefix_ senf::ExceptionMixin::ExceptionMixin(std::string const & description)
-    : what_(description),
-      message_(description)
+    : what_(description)
 {
 #ifdef SENF_DEBUG
     addBacktrace();
 #endif
 }
 
-prefix_ std::string const & senf::ExceptionMixin::message()
+prefix_ std::string senf::ExceptionMixin::message()
     const
 {
+#ifdef SENF_DEBUG
+    return what_.substr(excLen_);
+#else
     return message_;
+#endif
+}
+
+prefix_ std::string senf::ExceptionMixin::backtrace()
+    const
+{
+#ifdef SENF_DEBUG
+    return what_.substr(0,excLen_-4);
+#else
+    return "";
+#endif
 }
 
 prefix_ void senf::ExceptionMixin::append(std::string text)
 {
-    message_ += text;
     what_ += text;
 }
 
diff --git a/Utils/Exception.hh b/Utils/Exception.hh
index a91b157d2..c6f325727 100644
--- a/Utils/Exception.hh
+++ b/Utils/Exception.hh
@@ -140,7 +140,8 @@ namespace senf {
     class ExceptionMixin
     {
     public:
-        std::string const & message() const; ///< get exception description
+        std::string message() const; ///< get exception description
+        std::string backtrace() const; ///< Return backtrace (if available)
 
         void append(std::string text);  ///< Extend exception description
                                         /**< Adds \a text to the description text. */
@@ -152,12 +153,13 @@ namespace senf {
                                              string. This should probably be a string constant
                                              describing the exception for most derived
                                              exceptions. */
+
         std::string what_;
     private:
 #ifdef SENF_DEBUG
         void addBacktrace();
+        std::string::size_type excLen_;
 #endif
-        std::string message_;
     };
 
     /** \brief Extensible exception base-class
diff --git a/Utils/Logger/TimeSource.ih b/Utils/Logger/TimeSource.ih
index 9d02972e2..d1a73b1ca 100644
--- a/Utils/Logger/TimeSource.ih
+++ b/Utils/Logger/TimeSource.ih
@@ -40,16 +40,17 @@ namespace detail {
         : public senf::singleton<TimeSourceManager>
     {
     public:
-        TimeSourceManager();
-
         using senf::singleton<TimeSourceManager>::instance;
 
         time_type now();
         void timeSource(std::auto_ptr<TimeSource> source);
         
     private:
+        TimeSourceManager();
         
         boost::scoped_ptr<TimeSource> timeSource_;
+
+        friend class senf::singleton<TimeSourceManager>;
     };
 
 }}}
diff --git a/Utils/hexdump.ct b/Utils/hexdump.ct
index 76abf997d..277c6711d 100644
--- a/Utils/hexdump.ct
+++ b/Utils/hexdump.ct
@@ -40,6 +40,15 @@ prefix_ void senf::hexdump(Iterator i, Iterator i_end, std::ostream & stream,
         dumper(*i);
 }
 
+template <class Iterator>
+prefix_ std::string senf::hexdumpQuote(Iterator i, Iterator i_end)
+{
+    std::string s;
+    for (; i != i_end; ++i)
+        s.push_back(*i >= ' ' && *i <= 126 ? *i : '.');
+    return s;
+}
+
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_
 //#include "hexdump.mpp"
diff --git a/Utils/hexdump.hh b/Utils/hexdump.hh
index f5a60e681..f43f50554 100644
--- a/Utils/hexdump.hh
+++ b/Utils/hexdump.hh
@@ -34,10 +34,13 @@
 
 namespace senf {
 
-    /** \brief Write range [ i, i_end ) to output stream in hexadecimal format
-     */
+    /** \brief Write range [ i, i_end ) to output stream in hexadecimal format */
     template <class Iterator>
     void hexdump(Iterator i, Iterator i_end, std::ostream & stream, unsigned block_size=16);
+
+    /** \brief Return quoted iterator range */
+    template <class Iterator>
+    std::string hexdumpQuote(Iterator i, Iterator i_end);
 }
 
 ///////////////////////////////hh.e////////////////////////////////////////
-- 
GitLab