l_maliakal_d c21d674e89 changed uint in qDebugStream so that qtabmessages work on 64bit machine
git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorGui@129 af1100a4-978c-4157-bff7-07162d2ba061
2012-12-18 16:33:30 +00:00

121 lines
3.2 KiB
C++

/*
* qDebugStream.h
*
* Created on: Jun 28, 2012
* Author: Anna Bergamaschi
*/
#ifndef QDEBUGSTREAM_H_
#define QDEBUGSTREAM_H_
#include <QApplication>
#include <QWidget>
#include <QString>
#include <QEvent>
#include <QCustomEvent>
#include <iostream>
#include <streambuf>
#include <string>
using namespace std;
#define STREAMEVENT 60001
//-------------------------------------------------------------------------------------------------------------------------------------------------
class qStreamEvent:public QEvent{
public:
qStreamEvent(QString s):QEvent(static_cast<QEvent::Type>(STREAMEVENT)) {str=s;};
/** \returns the progress index */
QString getString() {return str;};
private:
QString str;
};
//-------------------------------------------------------------------------------------------------------------------------------------------------
class qDebugStream : public basic_streambuf<char> {
public:
qDebugStream(ostream &stream, ostream &estream, QWidget* w) : m_stream(stream), e_stream(estream), log_window(w) {
m_old_buf = stream.rdbuf();
stream.rdbuf(this);
//e_old_buf = stream.rdbuf();
//estream.rdbuf(this);
};
//-------------------------------------------------------------------------------------------------------------------------------------------------
~qDebugStream(){
// output anything that is left
if (!m_string.empty()) {
qStreamEvent *ce=new qStreamEvent(m_string.c_str());
QApplication::postEvent(log_window, ce);
#ifdef VERBOSE
cerr << m_string << endl;
#endif
}
m_stream.rdbuf(m_old_buf);
e_stream.rdbuf(e_old_buf);
}
//-------------------------------------------------------------------------------------------------------------------------------------------------
protected:
virtual int_type overflow(int_type v){
if (v == '\n'){
qStreamEvent *ce=new qStreamEvent(m_string.c_str());
QApplication::postEvent(log_window, ce);
#ifdef VERBOSE
cerr << m_string << endl;
#endif
m_string.erase(m_string.begin(), m_string.end());
}
else
m_string += v;
return v;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------
virtual streamsize xsputn(const char *p, streamsize n) {
m_string.append(p, p + n);
//changed from uint because of 64 bit
int pos = 0;
while (pos != string::npos)
{
pos = m_string.find('\n');
if (pos != string::npos)
{
string tmp(m_string.begin(), m_string.begin() + pos);
qStreamEvent *ce=new qStreamEvent(tmp.c_str());
QApplication::postEvent(log_window, ce);
#ifdef VERBOSE
cerr << tmp << endl;
#endif
m_string.erase(m_string.begin(), m_string.begin() + pos + 1);
}
}
return n;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------
private:
ostream &m_stream;
streambuf *m_old_buf;
ostream &e_stream;
streambuf *e_old_buf;
string m_string;
QWidget* log_window;
};
//-------------------------------------------------------------------------------------------------------------------------------------------------
#endif /* QDEBUGSTREAM_H_ */