stream_redirect.cpp
Go to the documentation of this file.
00001 // g2o - General Graph Optimization
00002 // Copyright (C) 2011 R. Kuemmerle, G. Grisetti, W. Burgard
00003 // 
00004 // g2o is free software: you can redistribute it and/or modify
00005 // it under the terms of the GNU Lesser General Public License as published
00006 // by the Free Software Foundation, either version 3 of the License, or
00007 // (at your option) any later version.
00008 // 
00009 // g2o is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU Lesser General Public License for more details.
00013 // 
00014 // You should have received a copy of the GNU Lesser General Public License
00015 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
00016 
00017 #include "stream_redirect.h"
00018 
00019 #include <QPlainTextEdit>
00020 #include <QString>
00021 
00022 #include <iostream>
00023 using namespace std;
00024 
00025 StreamRedirect::StreamRedirect(std::ostream &stream, QPlainTextEdit* te):
00026   _stream(stream), _te(te)
00027 {
00028   _old_buf = stream.rdbuf();
00029   _stream.rdbuf(this);
00030 }
00031 
00032 StreamRedirect::~StreamRedirect()
00033 {
00034   if (!_buffer.empty())
00035     xsputn(_buffer.c_str(), _buffer.size());
00036   _stream.rdbuf(_old_buf);
00037 }
00038 
00039 std::char_traits<char>::int_type StreamRedirect::overflow(int_type v)
00040 {
00041   _mutex.lock();
00042   if (v == '\n') {
00043     _te->appendPlainText(QString::fromAscii(_buffer.c_str(), _buffer.size()));
00044     _buffer.clear();
00045   }
00046   else
00047     _buffer.push_back(v);
00048 
00049   _mutex.unlock();
00050   return v;
00051 }
00052 
00053 std::streamsize StreamRedirect::xsputn(const char *p, std::streamsize n)
00054 {
00055   _mutex.lock();
00056   _buffer.append(p, p + n);
00057 
00058   std::string::size_type pos = 0;
00059   while (1) {
00060     pos = _buffer.find('\n');
00061     if (pos != std::string::npos) {
00062       _te->appendPlainText(QString::fromAscii(_buffer.c_str(), pos));
00063       _buffer.erase(_buffer.begin(), _buffer.begin() + pos + 1);
00064     } else
00065       break;
00066   }
00067 
00068   _mutex.unlock();
00069   return n;
00070 }


re_vision
Author(s): Dorian Galvez-Lopez
autogenerated on Sun Jan 5 2014 11:33:00