#pragma once #include #include "JTerminal.h" #include "JExtTerminal.h" // для отладки на ANDROID // 07.02.2020 namespace Incart::Common { class JMessageHandler { // static JExtTerminal* EJT; public: static void Init() { qInstallMessageHandler(handler); JTerminal() << __FUNCTION__ << "ok"; } static JExtTerminal* ExtTerminal(JExtTerminal* jt = nullptr, bool rst = false) { static JExtTerminal* JET = nullptr; if (rst) JET = nullptr; if (jt) JET = jt; return JET; } static char* getTime() { static QString str; static QByteArray buf; str = "[" + QTime::currentTime().toString("hh:mm:ss.zzz") + "]"; buf = str.toLocal8Bit(); return reinterpret_cast(buf.data()); } static char* get_esc_color(char clr) { static char esc[8][6] = { "\x1b[0m","\x1b[31m","\x1b[32m","\x1b[33m","\x1b[34m","\x1b[35m","\x1b[36m","\x1b[37m" }; return esc[clr&7]; } private: static void handler(QtMsgType type, const QMessageLogContext&, const QString& msg) { static char DEBUG_BUFFER[400]; char color; if (msg.isEmpty()) return; // не смог очистить строку в QDebug - см JTerminal // из-за того, что мне не удалось или не захотелось возиться с подменой QDebug // - цвет я убрал тут маразматическим способом uint len = MIN(sizeof(DEBUG_BUFFER) - 1, static_cast(msg.size())); memcpy(DEBUG_BUFFER,msg.toLocal8Bit(),len); DEBUG_BUFFER[len] = 0; color = DEBUG_BUFFER[0]&7; char* data = DEBUG_BUFFER + 2; if (ExtTerminal()) ExtTerminal()->out(color, getTime(), QString("Debug").toUtf8().data(), data); //QByteArray localMsg = msg.toLocal8Bit(); //const char *file = context.file ? context.file : ""; //const char *function = context.function ? context.function : ""; switch (type) { case QtInfoMsg: //fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); fprintf(stdout, "%s%s %s\n", get_esc_color(color), getTime(), data); break; case QtDebugMsg: //fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); fprintf(stdout, "#%s\n", DEBUG_BUFFER); break; case QtWarningMsg: //fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); fprintf(stderr, "#%s\n", DEBUG_BUFFER); break; case QtCriticalMsg: //fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); fprintf(stderr, "#%s\n", DEBUG_BUFFER); // красный break; case QtFatalMsg: //fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function); fprintf(stderr, "#%s\n", DEBUG_BUFFER); // красный break; } } }; } // namespace Incart::Common