64 lines
1.4 KiB
C++
64 lines
1.4 KiB
C++
#include "StdOutRedirector.h"
|
|
|
|
#include <QTimer>
|
|
#include <QDebug>
|
|
|
|
StdOutRedirector::StdOutRedirector()
|
|
: QObject()
|
|
{
|
|
#ifdef __linux__
|
|
if (pipe(mFdguistd) == -1)
|
|
printf("failed!");
|
|
#else
|
|
// Redirect
|
|
if (_pipe(mFdguistd, 4096, _O_BINARY) == -1)
|
|
printf("failed!");
|
|
#endif
|
|
//int tr = fcntl(fdguistd, O_NONBLOCK);
|
|
// Duplicate stdout file descriptor (next line will close original)
|
|
mFdStdOut = dup(fileno(stdout));
|
|
// Duplicate write end of pipe to stdout file descriptor
|
|
if (dup2(mFdguistd[1], fileno(stdout)) != 0)
|
|
printf("failed!");
|
|
// Close original
|
|
close(1);
|
|
// Duplicate write end of original
|
|
dup2(mFdguistd[1], 1);
|
|
|
|
mBuffer = new char[mBufferSize];
|
|
}
|
|
|
|
StdOutRedirector::~StdOutRedirector()
|
|
{
|
|
delete[] mBuffer;
|
|
}
|
|
|
|
void StdOutRedirector::readOutsToTF()
|
|
{
|
|
size_t len;
|
|
char* copy;
|
|
|
|
int n_out;
|
|
QString str;
|
|
fflush(stdout);
|
|
//Perhaps there is a non-blocking version of _read() that you can call ?
|
|
memset(mBuffer, 0, mBufferSize);
|
|
n_out = read(mFdguistd[0], mBuffer, mBufferSize);
|
|
if (n_out <= 0)
|
|
{
|
|
return;
|
|
}
|
|
if (n_out >= 1)
|
|
{
|
|
str.append(QString(mBuffer));
|
|
int con = str.lastIndexOf('\n');
|
|
int remv = str.at(con - 1) == '\n' ? 1 : 0;
|
|
if (con > 0)
|
|
{
|
|
str = str.remove(con - remv, str.length());
|
|
mOutput->append(str);
|
|
}
|
|
}
|
|
return;
|
|
}
|