Skip to content
Snippets Groups Projects
Commit 11620c95 authored by stefan's avatar stefan
Browse files

Python Exports for new logging stuff

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2605 5a81b35b-ba03-0410-adc8-b2c5c5119f08
parent 5075dc26
No related branches found
No related tags found
No related merge requests found
......@@ -20,11 +20,23 @@
using namespace boost::python;
#include <ost/log.hh>
#include <ost/log_sink.hh>
#include <ost/dyn_cast.hh>
using namespace ost;
namespace {
struct WrappedLogSink : public LogSink, wrapper<LogSink>
{
virtual void LogMessage(const String& message , int severity) {
call<void>(this->get_override("LogMessage").ptr(),message,severity);
}
};
typedef boost::shared_ptr<WrappedLogSink> WrappedLogSinkPtr;
void push_verb(int n)
{
if(n<0){
......@@ -44,11 +56,81 @@ void pop_verb_file()
Logger::Instance().PopFile();
}
void pop_log_sink()
{
Logger::Instance().PopSink();
}
void push_verb_file(const String& filename)
{
Logger::Instance().PushFile(filename);
}
void push_log_sink_1(LogSinkPtr& sink)
{
Logger::Instance().PushSink(sink);
}
void push_log_sink_2(WrappedLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
Logger::Instance().PushSink(lsp);
}
void push_log_sink_3(ObservableLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
Logger::Instance().PushSink(lsp);
}
void push_log_sink_4(FileLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
Logger::Instance().PushSink(lsp);
}
void push_log_sink_5(NullLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
Logger::Instance().PushSink(lsp);
}
void add_observer_1(ObservableLogSinkPtr& obs_sink, WrappedLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
obs_sink->AddObserver(lsp);
}
void add_observer_2(ObservableLogSinkPtr& obs_sink, FileLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
obs_sink->AddObserver(lsp);
}
void add_observer_3(ObservableLogSinkPtr& obs_sink, NullLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
obs_sink->AddObserver(lsp);
}
void remove_observer_1(ObservableLogSinkPtr& obs_sink, WrappedLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
obs_sink->RemoveObserver(lsp);
}
void remove_observer_2(ObservableLogSinkPtr& obs_sink, FileLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
obs_sink->RemoveObserver(lsp);
}
void remove_observer_3(ObservableLogSinkPtr& obs_sink, NullLogSinkPtr& sink)
{
LogSinkPtr lsp = dyn_cast<LogSink>(sink);
obs_sink->RemoveObserver(lsp);
}
void log_error(const String& m) {LOGN_ERROR(m);}
void log_message(const String& m) {LOGN_MESSAGE(m);}
void log_verbose(const String& m) {LOGN_VERBOSE(m);}
......@@ -58,12 +140,40 @@ void log_debug(const String& m) {LOGN_DEBUG(m);}
void export_Logger()
{
class_<WrappedLogSink, WrappedLogSinkPtr, LogSink, boost::noncopyable>("LogSink",init<>())
.def("LogMessage",pure_virtual(&WrappedLogSink::LogMessage))
;
class_<ObservableLogSink, ObservableLogSinkPtr, bases<LogSink>, boost::noncopyable >("ObservableLogSink", init<>())
.def("LogMessage",&ObservableLogSink::LogMessage)
.def("AddObserver",&ObservableLogSink::AddObserver)
.def("AddObserver",add_observer_1)
.def("AddObserver",add_observer_2)
.def("AddObserver",add_observer_3)
.def("RemoveObserver",&ObservableLogSink::RemoveObserver)
.def("RemoveObserver",remove_observer_1)
.def("RemoveObserver",remove_observer_2)
.def("RemoveObserver",remove_observer_3)
;
class_<FileLogSink, FileLogSinkPtr, bases<LogSink>, boost::noncopyable >("FileLogSink", init<const String&>())
.def("LogMessage",&FileLogSink::LogMessage)
;
class_<NullLogSink, NullLogSinkPtr, bases<LogSink>, boost::noncopyable >("NullLogSink", init<>())
.def("LogMessage",&NullLogSink::LogMessage)
;
def("PushVerbosityLevel",push_verb);
def("PopVerbosityLevel",pop_verb);
def("PushVerbosityFile",push_verb_file);
def("PopVerbosityFile",pop_verb_file);
def("PushLogSink",push_log_sink_1);
def("PushLogSink",push_log_sink_2);
def("PushLogSink",push_log_sink_3);
def("PushLogSink",push_log_sink_4);
def("PushLogSink",push_log_sink_5);
def("PopLogSink",pop_log_sink);
def("LogError",log_error);
def("LogMessage",log_message);
def("LogVerbose",log_verbose);
......
......@@ -23,7 +23,7 @@ namespace ost {
ObservableLogSink::ObservableLogSink(){}
bool ObservableLogSink::AddObserver(LogObserverPtr& observer){
bool ObservableLogSink::AddObserver(LogSinkPtr& observer){
if((std::find( this->observers_.begin(), this->observers_.end(), observer )) == this->observers_.end())
{
this->observers_.push_back( observer );
......@@ -32,8 +32,8 @@ 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);
bool ObservableLogSink::RemoveObserver(LogSinkPtr& observer){
std::vector<LogSinkPtr>::iterator found = std::find( this->observers_.begin(), this->observers_.end(), observer);
if( found != this->observers_.end() ){
this->observers_.erase(found);
return true;
......@@ -42,7 +42,7 @@ bool ObservableLogSink::RemoveObserver(LogObserverPtr& observer){
}
void ObservableLogSink::LogMessage(const String& message, int severity){
std::vector<LogObserverPtr>::const_iterator observers_it = this->observers_.begin() ;
std::vector<LogSinkPtr>::const_iterator observers_it = this->observers_.begin() ;
while( observers_it != this->observers_.end() )
{
( *observers_it )->LogMessage(message, severity);
......
......@@ -21,6 +21,7 @@
#include <ostream>
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
......@@ -42,6 +43,7 @@ namespace {
class DLLEXPORT_OST_BASE LogSink {
public:
LogSink(){};
virtual void LogMessage(const String& message, int severity = 0)=0;
};
......@@ -56,6 +58,7 @@ private:
std::ostream null_;
};
typedef boost::shared_ptr<NullLogSink> NullLogSinkPtr;
class DLLEXPORT_OST_BASE StdLogSink : public LogSink {
public:
......@@ -68,20 +71,34 @@ private:
std::ostream& stream_;
};
class DLLEXPORT_OST_BASE LogObserver {
class DLLEXPORT_OST_BASE FileLogSink : public LogSink {
public:
virtual void LogMessage(const String& message, int severity)=0;
FileLogSink(const String& file_name):stream_(file_name.c_str(), std::ios::out){}
virtual void LogMessage(const String& message, int severity){
if (stream_.is_open()){
stream_ << message;
stream_.flush();
}
}
~FileLogSink(){
stream_.close();
}
private:
std::ofstream stream_;
};
typedef boost::shared_ptr<LogObserver> LogObserverPtr;
typedef boost::shared_ptr<FileLogSink> FileLogSinkPtr;
class DLLEXPORT_OST_BASE ObservableLogSink : public LogSink {
public:
ObservableLogSink();
bool AddObserver(LogObserverPtr& observer);
bool RemoveObserver(LogObserverPtr& observer);
bool AddObserver(LogSinkPtr& observer);
bool RemoveObserver(LogSinkPtr& observer);
void LogMessage(const String& message, int severity);
private:
std::vector<LogObserverPtr> observers_;
std::vector<LogSinkPtr> observers_;
};
typedef boost::shared_ptr<ObservableLogSink> ObservableLogSinkPtr;
......
......@@ -29,11 +29,8 @@ namespace ost { namespace gui {
LogReader::LogReader(QObject* parent) :
QObject(parent) {
ost::Logger& logger = ost::Logger::Instance();
ObservableLogSinkPtr olsp = ObservableLogSinkPtr(new ObservableLogSink());
LogSinkPtr lsp = LogSinkPtr(olsp);
logger.SetSink(lsp);
LogObserverPtr losp = LogObserverPtr(this);
olsp->AddObserver(losp);
LogSinkPtr lsp = LogSinkPtr(this);
logger.PushSink(lsp);
}
void LogReader::LogMessage(const String& message, int severity){
......@@ -75,8 +72,7 @@ QMessageBox::Icon LogReader::GetIconForSeverity(int severity){
LogReader::~LogReader() {
ost::Logger& logger = ost::Logger::Instance();
LogSinkPtr olsp = LogSinkPtr(new StdLogSink(std::cerr));
logger.SetSink(olsp);
logger.PopSink();
}
}
......
......@@ -33,7 +33,7 @@
namespace ost { namespace gui {
class DLLEXPORT_OST_GUI LogReader: public QObject, public LogObserver
class DLLEXPORT_OST_GUI LogReader: public QObject, public LogSink
{
Q_OBJECT;
public:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment