-#include <stdio.h>
-#include <stdlib.h>
-
#include <QEvent>
+#include <QFile>
#include "trace.h"
int Trace::indent;
QtMsgType Trace::level = QtDebugMsg;
+QFile Trace::file;
Trace::EventName Trace::eventTab[] = {
{QEvent::None, "QEvent::None"},
{QEvent::UngrabMouse, "QEvent::UngrabMouse"},
{QEvent::GrabKeyboard, "QEvent::GrabKeyboard"},
{QEvent::UngrabKeyboard, "QEvent::UngrabKeyboard"},
- {QEvent::CocoaRequestModal, "QEvent::CocoaRequestModal"},
{QEvent::MacGLClearDrawable, "QEvent::MacGLClearDrawable"},
{QEvent::StateMachineSignal, "QEvent::StateMachineSignal"},
{0, 0}
};
+Trace::Trace(const QString &s): name(s)
+{
+ messageHandler(QtDebugMsg, QString(">%1").arg(name).toAscii().constData());
+ indent++;
+}
+
+Trace::~Trace()
+{
+ if (--indent < 0) {
+ indent = 0;
+ }
+ messageHandler(QtDebugMsg, QString("<%1").arg(name).toAscii().constData());
+}
+
+QString Trace::event(QEvent::Type t)
+{
+ for (int i = 0; eventTab[i].name; i++) {
+ if (eventTab[i].type == t) {
+ return eventTab[i].name;
+ }
+ }
+ if (t >= QEvent::User) {
+ return QString("QEvent::User+%1").arg(t - QEvent::User);
+ } else {
+ return QString("Unknown event %1").arg(t);
+ }
+}
+
+QString Trace::prefix()
+{
+ return QTime::currentTime().toString("hh:mm:ss.zzz ") +
+ QString(" ").repeated(indent);
+}
+
void Trace::messageHandler(QtMsgType type, const char *msg)
{
if (type >= Trace::level) {
+ QtMsgHandler oldHandler = qInstallMsgHandler(0);
switch (type) {
case QtDebugMsg:
- fprintf(stderr, "%s\n", msg);
- break;
- case QtWarningMsg:
- fprintf(stderr, "Warning: %s\n", msg);
+ qt_message_output(QtDebugMsg, (prefix()+msg).toUtf8().constData());
break;
- case QtCriticalMsg:
- fprintf(stderr, "Critical: %s\n", msg);
- break;
- case QtFatalMsg:
- fprintf(stderr, "Fatal: %s\n", msg);
- abort();
+ default:
+ qt_message_output(type, msg);
+ }
+ qInstallMsgHandler(oldHandler);
+ if (Trace::file.isOpen()) {
+ Trace::file.write((prefix() + msg + "\n").toUtf8());
+ Trace::file.flush();
}
}
}
+
+void Trace::setFileName(const QString &fileName)
+{
+ Trace::file.close();
+ Trace::file.setFileName(fileName);
+ if (!fileName.isEmpty()) {
+ (void)Trace::file.open(QIODevice::WriteOnly);
+ }
+}
+
+QString Trace::fileName()
+{
+ return Trace::file.fileName();
+}