/[svn]/qsampler/trunk/src/qsamplerMessages.cpp
ViewVC logotype

Diff of /qsampler/trunk/src/qsamplerMessages.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1738 by capela, Wed May 14 15:24:22 2008 UTC revision 3358 by capela, Wed Oct 18 08:57:21 2017 UTC
# Line 1  Line 1 
1  // qsamplerMessages.cpp  // qsamplerMessages.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2008, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2017, rncbc aka Rui Nuno Capela. All rights reserved.
5     Copyright (C) 2007, Christian Schoenebeck     Copyright (C) 2007, Christian Schoenebeck
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
# Line 34  Line 34 
34  #include <QDateTime>  #include <QDateTime>
35  #include <QIcon>  #include <QIcon>
36    
37  #if !defined(WIN32)  #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32)
38  #include <unistd.h>  #include <unistd.h>
39    #include <fcntl.h>
40  #endif  #endif
41    
42    
# Line 49  namespace QSampler { Line 50  namespace QSampler {
50  #define QSAMPLER_MESSAGES_FDREAD    0  #define QSAMPLER_MESSAGES_FDREAD    0
51  #define QSAMPLER_MESSAGES_FDWRITE   1  #define QSAMPLER_MESSAGES_FDWRITE   1
52    
53    
54  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
55  // QSampler::Messages - Messages log dockable window.  // QSampler::Messages - Messages log dockable window.
56  //  //
57    
58  // Constructor.  // Constructor.
59  Messages::Messages ( QWidget *pParent )  Messages::Messages ( QWidget *pParent )
60      : QDockWidget(pParent)          : QDockWidget(pParent)
61  {  {
62          // Surely a name is crucial (e.g.for storing geometry settings)          // Surely a name is crucial (e.g.for storing geometry settings)
63          QDockWidget::setObjectName("qsamplerMessages");          QDockWidget::setObjectName("qsamplerMessages");
64    
65      // Intialize stdout capture stuff.          // Intialize stdout capture stuff.
66      m_pStdoutNotifier = NULL;          m_pStdoutNotifier = NULL;
67      m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;          m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;
68      m_fdStdout[QSAMPLER_MESSAGES_FDWRITE] = QSAMPLER_MESSAGES_FDNIL;          m_fdStdout[QSAMPLER_MESSAGES_FDWRITE] = QSAMPLER_MESSAGES_FDNIL;
69    
70          // Create local text view widget.          // Create local text view widget.
71          m_pMessagesTextView = new QTextEdit(this);          m_pMessagesTextView = new QTextEdit(this);
# Line 100  Messages::Messages ( QWidget *pParent ) Line 102  Messages::Messages ( QWidget *pParent )
102  // Destructor.  // Destructor.
103  Messages::~Messages (void)  Messages::~Messages (void)
104  {  {
105            // Turn off and close logging.
106          setLogging(false);          setLogging(false);
107    
108      // No more notifications.          // No more notifications.
109      if (m_pStdoutNotifier)          if (m_pStdoutNotifier)
110          delete m_pStdoutNotifier;                  delete m_pStdoutNotifier;
111    
112      // No need to delete child widgets, Qt does it all for us.          // No need to delete child widgets, Qt does it all for us.
113  }  }
114    
115    
116  void Messages::showEvent ( QShowEvent *pEvent )  // Set stdout/stderr blocking mode.
117    bool Messages::stdoutBlock ( int fd, bool bBlock ) const
118  {  {
119      QDockWidget::showEvent(pEvent);  #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32)
120      emit visibilityChanged(isVisible());          const int iFlags = ::fcntl(fd, F_GETFL, 0);
121            const bool bNonBlock = bool(iFlags & O_NONBLOCK);
122            if (bBlock && bNonBlock)
123                    bBlock = (::fcntl(fd, F_SETFL, iFlags & ~O_NONBLOCK) == 0);
124            else
125            if (!bBlock && !bNonBlock)
126                    bBlock = (::fcntl(fd, F_SETFL, iFlags |  O_NONBLOCK) != 0);
127    #endif
128            return bBlock;
129  }  }
130    
131    
132  // Own stdout/stderr socket notifier slot.  // Own stdout/stderr socket notifier slot.
133  void Messages::stdoutNotify ( int fd )  void Messages::stdoutNotify ( int fd )
134  {  {
135  #if !defined(WIN32)  #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32)
136      char achBuffer[1024];          // Set non-blocking reads, if not already...
137      int  cchBuffer = ::read(fd, achBuffer, sizeof(achBuffer) - 1);          const bool bBlock = stdoutBlock(fd, false);
138      if (cchBuffer > 0) {          // Read as much as is available...
139          achBuffer[cchBuffer] = (char) 0;          QString sTemp;
140          appendStdoutBuffer(achBuffer);          char achBuffer[1024];
141      }          const int cchBuffer = sizeof(achBuffer) - 1;
142            int cchRead = ::read(fd, achBuffer, cchBuffer);
143            while (cchRead > 0) {
144                    achBuffer[cchRead] = (char) 0;
145                    sTemp.append(achBuffer);
146                    cchRead = (bBlock ? 0 : ::read(fd, achBuffer, cchBuffer));
147            }
148            // Needs to be non-empty...
149            if (!sTemp.isEmpty())
150                    appendStdoutBuffer(sTemp);
151  #endif  #endif
152  }  }
153    
# Line 136  void Messages::appendStdoutBuffer ( cons Line 157  void Messages::appendStdoutBuffer ( cons
157  {  {
158          m_sStdoutBuffer.append(s);          m_sStdoutBuffer.append(s);
159    
160          int iLength = m_sStdoutBuffer.lastIndexOf('\n');          const int iLength = m_sStdoutBuffer.lastIndexOf('\n');
161          if (iLength > 0) {          if (iLength > 0) {
162                  QString sTemp = m_sStdoutBuffer.left(iLength);                  const QString& sTemp = m_sStdoutBuffer.left(iLength);
163                  m_sStdoutBuffer.remove(0, iLength + 1);                  m_sStdoutBuffer.remove(0, iLength + 1);
164                  QStringList list = sTemp.split('\n');                  QStringList list = sTemp.split('\n');
165                  QStringListIterator iter(list);                  QStringListIterator iter(list);
# Line 151  void Messages::appendStdoutBuffer ( cons Line 172  void Messages::appendStdoutBuffer ( cons
172  // Stdout flusher -- show up any unfinished line...  // Stdout flusher -- show up any unfinished line...
173  void Messages::flushStdoutBuffer (void)  void Messages::flushStdoutBuffer (void)
174  {  {
175      if (!m_sStdoutBuffer.isEmpty()) {          if (!m_sStdoutBuffer.isEmpty()) {
176          appendMessagesText(m_sStdoutBuffer);                  appendMessagesText(m_sStdoutBuffer);
177          m_sStdoutBuffer.truncate(0);                  m_sStdoutBuffer.clear();
178      }          }
179  }  }
180    
181    
182  // Stdout capture accessors.  // Stdout capture accessors.
183  bool Messages::isCaptureEnabled (void)  bool Messages::isCaptureEnabled (void)
184  {  {
185      return (bool) (m_pStdoutNotifier != NULL);          return (m_pStdoutNotifier != NULL);
186  }  }
187    
188  void Messages::setCaptureEnabled ( bool bCapture )  void Messages::setCaptureEnabled ( bool bCapture )
189  {  {
190      // Flush current buffer.          // Flush current buffer.
191      flushStdoutBuffer();          flushStdoutBuffer();
192    
193  #if !defined(WIN32)  #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32)
194          // Destroy if already enabled.          // Destroy if already enabled.
195          if (!bCapture && m_pStdoutNotifier) {          if (!bCapture && m_pStdoutNotifier) {
196                  delete m_pStdoutNotifier;                  delete m_pStdoutNotifier;
# Line 179  void Messages::setCaptureEnabled ( bool Line 200  void Messages::setCaptureEnabled ( bool
200                          ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);                          ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
201                          m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;                          m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;
202                  }                  }
                 if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {  
                         ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);  
                         m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;  
                 }  
203          }          }
204          // Are we going to make up the capture?          // Are we going to make up the capture?
205          if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {          if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {
# Line 201  void Messages::setCaptureEnabled ( bool Line 218  void Messages::setCaptureEnabled ( bool
218  // Message font accessors.  // Message font accessors.
219  QFont Messages::messagesFont (void)  QFont Messages::messagesFont (void)
220  {  {
221      return m_pMessagesTextView->font();          return m_pMessagesTextView->font();
222  }  }
223    
224  void Messages::setMessagesFont ( const QFont& font )  void Messages::setMessagesFont ( const QFont& font )
225  {  {
226      m_pMessagesTextView->setFont(font);          m_pMessagesTextView->setFont(font);
227  }  }
228    
229    
230  // Maximum number of message lines accessors.  // Maximum number of message lines accessors.
231  int Messages::messagesLimit (void)  int Messages::messagesLimit (void)
232  {  {
233      return m_iMessagesLimit;          return m_iMessagesLimit;
234  }  }
235    
236  void Messages::setMessagesLimit ( int iMessagesLimit )  void Messages::setMessagesLimit ( int iMessagesLimit )
237  {  {
238      m_iMessagesLimit = iMessagesLimit;          m_iMessagesLimit = iMessagesLimit;
239      m_iMessagesHigh  = iMessagesLimit + (iMessagesLimit / 3);          m_iMessagesHigh  = iMessagesLimit + (iMessagesLimit / 3);
240  }  }
241    
242  // Messages logging stuff.  // Messages logging stuff.
# Line 287  void Messages::appendMessagesLine ( cons Line 304  void Messages::appendMessagesLine ( cons
304  // The main utility methods.  // The main utility methods.
305  void Messages::appendMessages ( const QString& s )  void Messages::appendMessages ( const QString& s )
306  {  {
307      appendMessagesColor(s, "#999999");          appendMessagesColor(s, "#999999");
308  }  }
309    
310  void Messages::appendMessagesColor ( const QString& s, const QString &c )  void Messages::appendMessagesColor ( const QString& s, const QString &c )
311  {  {
312          QString sText = QTime::currentTime().toString("hh:mm:ss.zzz") + ' ' + s;          const QString& sText
313                            = QTime::currentTime().toString("hh:mm:ss.zzz") + ' ' + s;
314          appendMessagesLine("<font color=\"" + c + "\">" + sText + "</font>");          appendMessagesLine("<font color=\"" + c + "\">" + sText + "</font>");
315          appendMessagesLog(sText);          appendMessagesLog(sText);
316  }  }

Legend:
Removed from v.1738  
changed lines
  Added in v.3358

  ViewVC Help
Powered by ViewVC