From 5075dc260b6b28da40c97a5aaef8dd7f3e52bbe8 Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Thu, 29 Jul 2010 09:22:49 +0000
Subject: [PATCH] Logging, difference type of logging

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2604 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 modules/base/src/log.hh                   | 24 +++++++-------
 modules/base/src/log_sink.cc              |  6 ++--
 modules/base/src/log_sink.hh              | 10 +++---
 modules/gui/src/info_widget/log_reader.cc | 39 +++++++++++++++++++++--
 modules/gui/src/info_widget/log_reader.hh |  8 +++--
 5 files changed, 63 insertions(+), 24 deletions(-)

diff --git a/modules/base/src/log.hh b/modules/base/src/log.hh
index b3326d411..edaee14d1 100644
--- a/modules/base/src/log.hh
+++ b/modules/base/src/log.hh
@@ -70,17 +70,17 @@ private:
 #define PUSH_VERBOSITY(n) ::ost::Logger::Instance().PushVerbosityLevel(n)
 #define POP_VERBOSITY(n) ::ost::Logger::Instance().PopVerbosityLevel()
 
-#define LOG_ERROR(m) ::ost::Logger::Instance()(::ost::Logger::QUIET) << m;
-#define LOGN_ERROR(m) ::ost::Logger::Instance()(::ost::Logger::QUIET) << m << std::endl;
+#define LOG_ERROR(m) if(true){std::stringstream tmp_stream__;tmp_stream__ << m ;::ost::Logger::Instance()(::ost::Logger::QUIET)->LogMessage(tmp_stream__.str());}
+#define LOGN_ERROR(m) if(true){std::stringstream tmp_stream__;tmp_stream__ << m << std::endl;::ost::Logger::Instance()(::ost::Logger::QUIET)->LogMessage(tmp_stream__.str());}
 
-#define LOG_MESSAGE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::NORMAL) {(::ost::Logger::Instance()(::ost::Logger::NORMAL)) << m ;}
-#define LOGN_MESSAGE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::NORMAL) {(::ost::Logger::Instance()(::ost::Logger::NORMAL)) << m << std::endl;}
+#define LOG_MESSAGE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::NORMAL) {std::stringstream tmp_stream__;tmp_stream__ << m ;::ost::Logger::Instance()(::ost::Logger::NORMAL)->LogMessage(tmp_stream__.str(),::ost::Logger::NORMAL);}
+#define LOGN_MESSAGE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::NORMAL) {std::stringstream tmp_stream__; tmp_stream__ << m <<std::endl;::ost::Logger::Instance()(::ost::Logger::NORMAL)->LogMessage(tmp_stream__.str(),::ost::Logger::NORMAL);}
 
-#define LOG_VERBOSE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::VERBOSE) {(::ost::Logger::Instance()(::ost::Logger::VERBOSE)) << m ;}
-#define LOGN_VERBOSE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::VERBOSE) {(::ost::Logger::Instance()(::ost::Logger::VERBOSE)) << m << std::endl;}
+#define LOG_VERBOSE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::VERBOSE) {std::stringstream tmp_stream__;tmp_stream__ << m ;::ost::Logger::Instance()(::ost::Logger::VERBOSE)->LogMessage(tmp_stream__.str(),::ost::Logger::VERBOSE);}
+#define LOGN_VERBOSE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::VERBOSE) {std::stringstream tmp_stream__; tmp_stream__ << m <<std::endl;::ost::Logger::Instance()(::ost::Logger::VERBOSE)->LogMessage(tmp_stream__.str(),::ost::Logger::VERBOSE);}
 
-#define LOG_DEBUG(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::DEBUG) {(::ost::Logger::Instance()(::ost::Logger::DEBUG)) << m ;}
-#define LOGN_DEBUG(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::DEBUG) {(::ost::Logger::Instance()(::ost::Logger::DEBUG)) << m << std::endl;}
+#define LOG_DEBUG(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::DEBUG) {std::stringstream tmp_stream__;tmp_stream__ << m ;::ost::Logger::Instance()(::ost::Logger::DEBUG)->LogMessage(tmp_stream__.str(),::ost::Logger::DEBUG);}
+#define LOGN_DEBUG(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::DEBUG) {std::stringstream tmp_stream__; tmp_stream__ << m <<std::endl;::ost::Logger::Instance()(::ost::Logger::DEBUG)->LogMessage(tmp_stream__.str(),::ost::Logger::DEBUG);}
 
 #ifdef NDEBUG
 
@@ -92,11 +92,11 @@ private:
 
 #else
 
-#  define LOG_DUMP(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::DUMP) {(::ost::Logger::Instance()(::ost::Logger::DUMP)) << m ;}
-#  define LOGN_DUMP(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::DUMP) {(::ost::Logger::Instance()(::ost::Logger::DUMP)) << m << std::endl;}
+#  define LOG_DUMP(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::DUMP) {std::stringstream tmp_stream__;tmp_stream__ << m ;::ost::Logger::Instance()(::ost::Logger::DUMP)->LogMessage(tmp_stream__.str(),::ost::Logger::DUMP);}
+#  define LOGN_DUMP(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::DUMP) {std::stringstream tmp_stream__; tmp_stream__ << m <<std::endl;::ost::Logger::Instance()(::ost::Logger::DUMP)->LogMessage(tmp_stream__.str(),::ost::Logger::DUMP);}
 
-#  define LOG_TRACE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::TRACE) {(::ost::Logger::Instance()(::ost::Logger::TRACE)) << m ;}
-#  define LOGN_TRACE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::TRACE) {(::ost::Logger::Instance()(::ost::Logger::TRACE)) << m << std::endl;}
+#  define LOG_TRACE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::TRACE) {std::stringstream tmp_stream__;tmp_stream__ << m ;::ost::Logger::Instance()(::ost::Logger::TRACE)->LogMessage(tmp_stream__.str(),::ost::Logger::TRACE);}
+#  define LOGN_TRACE(m) if(::ost::Logger::Instance().GetLogLevel()>=::ost::Logger::TRACE) {std::stringstream tmp_stream__; tmp_stream__ << m <<std::endl;::ost::Logger::Instance()(::ost::Logger::TRACE)->LogMessage(tmp_stream__.str(),::ost::Logger::TRACE);}
 
 #endif
 
diff --git a/modules/base/src/log_sink.cc b/modules/base/src/log_sink.cc
index c798ed018..eef34318b 100644
--- a/modules/base/src/log_sink.cc
+++ b/modules/base/src/log_sink.cc
@@ -16,6 +16,7 @@
 // along with this library; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 //------------------------------------------------------------------------------
+#include <ost/log.hh>
 #include <ost/log_sink.hh>
 #include <iostream>
 namespace ost {
@@ -30,6 +31,7 @@ bool ObservableLogSink::AddObserver(LogObserverPtr& observer){
   }
   return false;
 }
+
 bool ObservableLogSink::RemoveObserver(LogObserverPtr& observer){
   std::vector<LogObserverPtr>::iterator found = std::find( this->observers_.begin(), this->observers_.end(), observer);
   if( found != this->observers_.end() ){
@@ -39,11 +41,11 @@ bool ObservableLogSink::RemoveObserver(LogObserverPtr& observer){
   return false;
 }
 
-void ObservableLogSink::LogMessage(const String& message){
+void ObservableLogSink::LogMessage(const String& message, int severity){
   std::vector<LogObserverPtr>::const_iterator observers_it = this->observers_.begin() ;
   while( observers_it != this->observers_.end() )
   {
-    ( *observers_it )->LogMessage(message) ;
+    ( *observers_it )->LogMessage(message, severity);
     observers_it++;
   }
 }
diff --git a/modules/base/src/log_sink.hh b/modules/base/src/log_sink.hh
index 8712e0f41..8819668f9 100644
--- a/modules/base/src/log_sink.hh
+++ b/modules/base/src/log_sink.hh
@@ -42,7 +42,7 @@ namespace {
 
 class DLLEXPORT_OST_BASE LogSink {
 public:
-  virtual void LogMessage(const String& message)=0;
+  virtual void LogMessage(const String& message, int severity = 0)=0;
 };
 
 typedef boost::shared_ptr<LogSink> LogSinkPtr;
@@ -50,7 +50,7 @@ typedef boost::shared_ptr<LogSink> LogSinkPtr;
 class DLLEXPORT_OST_BASE NullLogSink : public LogSink {
 public:
   NullLogSink():null_(new DevNull()){}
-  virtual void LogMessage(const String& message){null_ << message;}
+  virtual void LogMessage(const String& message, int severity){null_ << message;}
 
 private:
   std::ostream null_;
@@ -60,7 +60,7 @@ private:
 class DLLEXPORT_OST_BASE StdLogSink : public LogSink {
 public:
   StdLogSink(std::ostream& stream):stream_(stream){}
-  virtual void LogMessage(const String& message){
+  virtual void LogMessage(const String& message, int severity){
     stream_ << message;
   }
 
@@ -70,7 +70,7 @@ private:
 
 class DLLEXPORT_OST_BASE LogObserver {
 public:
-  virtual void LogMessage(const String& message)=0;
+  virtual void LogMessage(const String& message, int severity)=0;
 };
 typedef boost::shared_ptr<LogObserver> LogObserverPtr;
 
@@ -79,7 +79,7 @@ public:
   ObservableLogSink();
   bool AddObserver(LogObserverPtr& observer);
   bool RemoveObserver(LogObserverPtr& observer);
-  void LogMessage(const String& message);
+  void LogMessage(const String& message, int severity);
 private:
   std::vector<LogObserverPtr> observers_;
 };
diff --git a/modules/gui/src/info_widget/log_reader.cc b/modules/gui/src/info_widget/log_reader.cc
index f98411f3e..d93284b3e 100644
--- a/modules/gui/src/info_widget/log_reader.cc
+++ b/modules/gui/src/info_widget/log_reader.cc
@@ -36,15 +36,48 @@ LogReader::LogReader(QObject* parent) :
   olsp->AddObserver(losp);
 }
 
-void LogReader::LogMessage(const String& message){
+void LogReader::LogMessage(const String& message, int severity){
   if(this->parent()){
     if(InfoWidget* info_widget = qobject_cast<InfoWidget*>(this->parent())){
-      info_widget->LogMessage(message.c_str());
+      QString q_message(message.c_str());
+      if(q_message.endsWith("\n")){
+        q_message.remove(q_message.size()-1,q_message.size()-1);
+        if(!log_cache_.contains(severity)){
+          info_widget->LogMessage(q_message,GetIconForSeverity(severity));
+        }
+        else{
+          info_widget->LogMessage(log_cache_[severity]+q_message,GetIconForSeverity(severity));
+          log_cache_.remove(severity);
+        }
+      }
+      else{
+        if(!log_cache_.contains(severity)){
+          log_cache_[severity] = message.c_str();
+        }
+        else{
+          log_cache_[severity].append(message.c_str());
+        }
+      }
     }
   }
 }
 
-LogReader::~LogReader() {}
+QMessageBox::Icon LogReader::GetIconForSeverity(int severity){
+  switch (severity) {
+    case 1:
+      return QMessageBox::Warning;
+    case 0:
+      return QMessageBox::Critical;
+    default :
+      return QMessageBox::Information;
+  }
+}
+
+LogReader::~LogReader() {
+  ost::Logger& logger = ost::Logger::Instance();
+  LogSinkPtr olsp = LogSinkPtr(new StdLogSink(std::cerr));
+  logger.SetSink(olsp);
+}
 
 }
 } // ns
diff --git a/modules/gui/src/info_widget/log_reader.hh b/modules/gui/src/info_widget/log_reader.hh
index 87a85b49b..4a2cc972b 100644
--- a/modules/gui/src/info_widget/log_reader.hh
+++ b/modules/gui/src/info_widget/log_reader.hh
@@ -20,6 +20,8 @@
 #define OST_GUI_INFO_WIDGET_LOG_READER_HH
 
 #include <QObject>
+#include <QMap>
+#include <QMessageBox>
 
 #include <ost/log_sink.hh>
 
@@ -38,9 +40,11 @@ public:
   LogReader(QObject* parent=NULL);
   ~LogReader();
 
-public:
-  void LogMessage(const String& message);
+  void LogMessage(const String& message, int severity);
 
+private:
+  QMap<int, QString> log_cache_;
+  QMessageBox::Icon GetIconForSeverity(int severity);
 };
 
 }} // ns
-- 
GitLab