/[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 1474 by schoenebeck, Mon Nov 5 20:47:38 2007 UTC revision 2669 by capela, Sun Aug 3 16:56:18 2014 UTC
# Line 1  Line 1 
1  // qsamplerMessages.cpp  // qsamplerMessages.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2007, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2014, 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 24  Line 24 
24  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
25    
26  #include <QSocketNotifier>  #include <QSocketNotifier>
27    
28    #include <QFile>
29  #include <QTextEdit>  #include <QTextEdit>
30  #include <QTextCursor>  #include <QTextCursor>
31    #include <QTextStream>
32  #include <QTextBlock>  #include <QTextBlock>
33  #include <QScrollBar>  #include <QScrollBar>
34  #include <QDateTime>  #include <QDateTime>
# Line 33  Line 36 
36    
37  #if !defined(WIN32)  #if !defined(WIN32)
38  #include <unistd.h>  #include <unistd.h>
39    #include <fcntl.h>
40  #endif  #endif
41    
42    
43    namespace QSampler {
44    
45  // The default maximum number of message lines.  // The default maximum number of message lines.
46  #define QSAMPLER_MESSAGES_MAXLINES  1000  #define QSAMPLER_MESSAGES_MAXLINES  1000
47    
# Line 45  Line 52 
52    
53    
54  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
55  // qsamplerMessages - Messages log dockable window.  // QSampler::Messages - Messages log dockable window.
56  //  //
57    
58  // Constructor.  // Constructor.
59  qsamplerMessages::qsamplerMessages ( 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_pTextView = new QTextEdit(this);          m_pMessagesTextView = new QTextEdit(this);
72  //  QFont font(m_pTextView->font());  //  QFont font(m_pMessagesTextView->font());
73  //  font.setFamily("Fixed");  //  font.setFamily("Fixed");
74  //  m_pTextView->setFont(font);  //  m_pMessagesTextView->setFont(font);
75          m_pTextView->setLineWrapMode(QTextEdit::NoWrap);          m_pMessagesTextView->setLineWrapMode(QTextEdit::NoWrap);
76          m_pTextView->setReadOnly(true);          m_pMessagesTextView->setReadOnly(true);
77          m_pTextView->setUndoRedoEnabled(false);          m_pMessagesTextView->setUndoRedoEnabled(false);
78  //      m_pTextView->setTextFormat(Qt::LogText);  //      m_pMessagesTextView->setTextFormat(Qt::LogText);
79    
80          // Initialize default message limit.          // Initialize default message limit.
81          m_iMessagesLines = 0;          m_iMessagesLines = 0;
82          setMessagesLimit(QSAMPLER_MESSAGES_MAXLINES);          setMessagesLimit(QSAMPLER_MESSAGES_MAXLINES);
83    
84            m_pMessagesLog = NULL;
85    
86          // Prepare the dockable window stuff.          // Prepare the dockable window stuff.
87          QDockWidget::setWidget(m_pTextView);          QDockWidget::setWidget(m_pMessagesTextView);
88          QDockWidget::setFeatures(QDockWidget::AllDockWidgetFeatures);          QDockWidget::setFeatures(QDockWidget::AllDockWidgetFeatures);
89          QDockWidget::setAllowedAreas(          QDockWidget::setAllowedAreas(
90                  Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);                  Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
# Line 91  qsamplerMessages::qsamplerMessages ( QWi Line 100  qsamplerMessages::qsamplerMessages ( QWi
100    
101    
102  // Destructor.  // Destructor.
103  qsamplerMessages::~qsamplerMessages (void)  Messages::~Messages (void)
104  {  {
105      // No more notifications.          // Turn off and close logging.
106      if (m_pStdoutNotifier)          setLogging(false);
         delete m_pStdoutNotifier;  
   
     // No need to delete child widgets, Qt does it all for us.  
 }  
107    
108            // No more notifications.
109            if (m_pStdoutNotifier)
110                    delete m_pStdoutNotifier;
111    
112  void qsamplerMessages::showEvent (QShowEvent* event)          // No need to delete child widgets, Qt does it all for us.
 {  
     QDockWidget::showEvent(event);  
     emit visibilityChanged(isVisible());  
113  }  }
114    
115    
116  // Own stdout/stderr socket notifier slot.  // Own stdout/stderr socket notifier slot.
117  void qsamplerMessages::stdoutNotify ( int fd )  void Messages::stdoutNotify ( int fd )
118  {  {
119  #if !defined(WIN32)  #if !defined(WIN32)
120      char achBuffer[1024];          // Set non-blocking reads, if not already...
121      int  cchBuffer = ::read(fd, achBuffer, sizeof(achBuffer) - 1);          const int iFlags = ::fcntl(fd, F_GETFL, 0);
122      if (cchBuffer > 0) {          int iBlock = ((iFlags & O_NONBLOCK) == 0);
123          achBuffer[cchBuffer] = (char) 0;          if (iBlock)
124          appendStdoutBuffer(achBuffer);                  iBlock = ::fcntl(fd, F_SETFL, iFlags | O_NONBLOCK);
125      }          // Read as much as is available...
126            QString sTemp;
127            char achBuffer[1024];
128            const int cchBuffer = sizeof(achBuffer) - 1;
129            int cchRead = ::read(fd, achBuffer, cchBuffer);
130            while (cchRead > 0) {
131                    achBuffer[cchRead] = (char) 0;
132                    sTemp.append(achBuffer);
133                    cchRead = (iBlock ? 0 : ::read(fd, achBuffer, cchBuffer));
134            }
135            // Needs to be non-empty...
136            if (!sTemp.isEmpty())
137                    appendStdoutBuffer(sTemp);
138  #endif  #endif
139  }  }
140    
141    
142  // Stdout buffer handler -- now splitted by complete new-lines...  // Stdout buffer handler -- now splitted by complete new-lines...
143  void qsamplerMessages::appendStdoutBuffer ( const QString& s )  void Messages::appendStdoutBuffer ( const QString& s )
144  {  {
145          m_sStdoutBuffer.append(s);          m_sStdoutBuffer.append(s);
146    
147          int iLength = m_sStdoutBuffer.lastIndexOf('\n');          const int iLength = m_sStdoutBuffer.lastIndexOf('\n');
148          if (iLength > 0) {          if (iLength > 0) {
149                  QString sTemp = m_sStdoutBuffer.left(iLength);                  const QString& sTemp = m_sStdoutBuffer.left(iLength);
150                  m_sStdoutBuffer.remove(0, iLength + 1);                  m_sStdoutBuffer.remove(0, iLength + 1);
151                  QStringList list = sTemp.split('\n');                  QStringList list = sTemp.split('\n');
152                  QStringListIterator iter(list);                  QStringListIterator iter(list);
# Line 140  void qsamplerMessages::appendStdoutBuffe Line 157  void qsamplerMessages::appendStdoutBuffe
157    
158    
159  // Stdout flusher -- show up any unfinished line...  // Stdout flusher -- show up any unfinished line...
160  void qsamplerMessages::flushStdoutBuffer (void)  void Messages::flushStdoutBuffer (void)
161  {  {
162      if (!m_sStdoutBuffer.isEmpty()) {          if (!m_sStdoutBuffer.isEmpty()) {
163          appendMessagesText(m_sStdoutBuffer);                  appendMessagesText(m_sStdoutBuffer);
164          m_sStdoutBuffer.truncate(0);                  m_sStdoutBuffer.clear();
165      }          }
166  }  }
167    
168    
169  // Stdout capture accessors.  // Stdout capture accessors.
170  bool qsamplerMessages::isCaptureEnabled (void)  bool Messages::isCaptureEnabled (void)
171  {  {
172      return (bool) (m_pStdoutNotifier != NULL);          return (m_pStdoutNotifier != NULL);
173  }  }
174    
175  void qsamplerMessages::setCaptureEnabled ( bool bCapture )  void Messages::setCaptureEnabled ( bool bCapture )
176  {  {
177      // Flush current buffer.          // Flush current buffer.
178      flushStdoutBuffer();          flushStdoutBuffer();
179    
180  #if !defined(WIN32)  #if !defined(WIN32)
181          // Destroy if already enabled.          // Destroy if already enabled.
# Line 170  void qsamplerMessages::setCaptureEnabled Line 187  void qsamplerMessages::setCaptureEnabled
187                          ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);                          ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
188                          m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;                          m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;
189                  }                  }
                 if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {  
                         ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);  
                         m_fdStdout[QSAMPLER_MESSAGES_FDREAD]  = QSAMPLER_MESSAGES_FDNIL;  
                 }  
190          }          }
191          // Are we going to make up the capture?          // Are we going to make up the capture?
192          if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {          if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {
# Line 190  void qsamplerMessages::setCaptureEnabled Line 203  void qsamplerMessages::setCaptureEnabled
203    
204    
205  // Message font accessors.  // Message font accessors.
206  QFont qsamplerMessages::messagesFont (void)  QFont Messages::messagesFont (void)
207  {  {
208      return m_pTextView->font();          return m_pMessagesTextView->font();
209  }  }
210    
211  void qsamplerMessages::setMessagesFont( const QFont& font )  void Messages::setMessagesFont ( const QFont& font )
212  {  {
213      m_pTextView->setFont(font);          m_pMessagesTextView->setFont(font);
214  }  }
215    
216    
217  // Maximum number of message lines accessors.  // Maximum number of message lines accessors.
218  int qsamplerMessages::messagesLimit (void)  int Messages::messagesLimit (void)
219  {  {
220      return m_iMessagesLimit;          return m_iMessagesLimit;
221  }  }
222    
223  void qsamplerMessages::setMessagesLimit ( int iMessagesLimit )  void Messages::setMessagesLimit ( int iMessagesLimit )
224  {  {
225      m_iMessagesLimit = iMessagesLimit;          m_iMessagesLimit = iMessagesLimit;
226      m_iMessagesHigh  = iMessagesLimit + (iMessagesLimit / 3);          m_iMessagesHigh  = iMessagesLimit + (iMessagesLimit / 3);
227  }  }
228    
229    // Messages logging stuff.
230    bool Messages::isLogging (void) const
231    {
232            return (m_pMessagesLog != NULL);
233    }
234    
235  // The main utility methods.  void Messages::setLogging ( bool bEnabled, const QString& sFilename )
 void qsamplerMessages::appendMessages ( const QString& s )  
236  {  {
237      appendMessagesColor(s, "#999999");          if (m_pMessagesLog) {
238                    appendMessages(tr("Logging stopped --- %1 ---")
239                            .arg(QDateTime::currentDateTime().toString()));
240                    m_pMessagesLog->close();
241                    delete m_pMessagesLog;
242                    m_pMessagesLog = NULL;
243            }
244    
245            if (bEnabled) {
246                    m_pMessagesLog = new QFile(sFilename);
247                    if (m_pMessagesLog->open(QIODevice::Text | QIODevice::Append)) {
248                            appendMessages(tr("Logging started --- %1 ---")
249                                    .arg(QDateTime::currentDateTime().toString()));
250                    } else {
251                            delete m_pMessagesLog;
252                            m_pMessagesLog = NULL;
253                    }
254            }
255  }  }
256    
257  void qsamplerMessages::appendMessagesColor ( const QString& s, const QString &c )  
258    // Messages log output method.
259    void Messages::appendMessagesLog ( const QString& s )
260  {  {
261          appendMessagesText("<font color=\"" + c + "\">"          if (m_pMessagesLog) {
262                  + QTime::currentTime().toString("hh:mm:ss.zzz")                  QTextStream(m_pMessagesLog) << s << endl;
263                  + ' ' + s + "</font>");                  m_pMessagesLog->flush();
264            }
265  }  }
266    
267  void qsamplerMessages::appendMessagesText ( const QString& s )  // Messages widget output method.
268    void Messages::appendMessagesLine ( const QString& s )
269  {  {
270      // Check for message line limit...          // Check for message line limit...
271      if (m_iMessagesLines > m_iMessagesHigh) {          if (m_iMessagesLines > m_iMessagesHigh) {
272                  m_pTextView->setUpdatesEnabled(false);                  m_pMessagesTextView->setUpdatesEnabled(false);
273                  QTextCursor textCursor(m_pTextView->document()->begin());                  QTextCursor textCursor(m_pMessagesTextView->document()->begin());
274                  while (m_iMessagesLines > m_iMessagesLimit) {                  while (m_iMessagesLines > m_iMessagesLimit) {
275                          // Move cursor extending selection                          // Move cursor extending selection
276                          // from start to next line-block...                          // from start to next line-block...
# Line 242  void qsamplerMessages::appendMessagesTex Line 280  void qsamplerMessages::appendMessagesTex
280                  }                  }
281                  // Remove the excessive line-blocks...                  // Remove the excessive line-blocks...
282                  textCursor.removeSelectedText();                  textCursor.removeSelectedText();
283                  m_pTextView->setUpdatesEnabled(true);                  m_pMessagesTextView->setUpdatesEnabled(true);
284      }          }
285    
286          // Count always as a new line out there...          m_pMessagesTextView->append(s);
         m_pTextView->append(s);  
287          m_iMessagesLines++;          m_iMessagesLines++;
288  }  }
289    
290    
291    // The main utility methods.
292    void Messages::appendMessages ( const QString& s )
293    {
294            appendMessagesColor(s, "#999999");
295    }
296    
297    void Messages::appendMessagesColor ( const QString& s, const QString &c )
298    {
299            const QString& sText
300                    = QTime::currentTime().toString("hh:mm:ss.zzz") + ' ' + s;
301            appendMessagesLine("<font color=\"" + c + "\">" + sText + "</font>");
302            appendMessagesLog(sText);
303    }
304    
305    void Messages::appendMessagesText ( const QString& s )
306    {
307            appendMessagesLine(s);
308            appendMessagesLog(s);
309    }
310    
311    
312  // History reset.  // History reset.
313  void qsamplerMessages::clear (void)  void Messages::clear (void)
314  {  {
315          m_iMessagesLines = 0;          m_iMessagesLines = 0;
316          m_pTextView->clear();          m_pMessagesTextView->clear();
317  }  }
318    
319    } // namespace QSampler
320    
321    
322  // end of qsamplerMessages.cpp  // end of qsamplerMessages.cpp

Legend:
Removed from v.1474  
changed lines
  Added in v.2669

  ViewVC Help
Powered by ViewVC