diff options
Diffstat (limited to 'DebugEngine.h')
-rw-r--r-- | DebugEngine.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/DebugEngine.h b/DebugEngine.h new file mode 100644 index 0000000..7a75264 --- /dev/null +++ b/DebugEngine.h @@ -0,0 +1,131 @@ +/** \file DebugEngine.h +\brief Define the class for the debug +\author alpha_one_x86 +\note This class don't need be thread safe because ultracopier is done with one thread, but I have implement some basic thread protection +\licence GPL3, see the file COPYING */ + +#ifndef DEBUG_ENGINE_H +#define DEBUG_ENGINE_H + +#include <QObject> +#include <QString> +#include <string> +#include <QFile> +#include <QMutex> +#include <QTime> +#include <QTimer> +#include <QList> +#include <QCoreApplication> +#include <QAbstractTableModel> +#include <QRegularExpression> +#include <regex> + +#include "Variable.h" +#include "PlatformMacro.h" +#include "StructEnumDefinition.h" +#include "StructEnumDefinition_UltracopierSpecific.h" + +#ifdef ULTRACOPIER_DEBUG + +class DebugModel : public QAbstractTableModel +{ + Q_OBJECT +public: + /// \brief the transfer item displayed + struct DebugItem + { + unsigned int time; + DebugLevel_custom level; + std::string function; + std::string text; + std::string file; + std::string location; + }; + + static DebugModel *debugModel; + DebugModel(); + ~DebugModel(); + + virtual int columnCount(const QModelIndex& parent = QModelIndex()) const; + virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; + virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; + virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + virtual bool setData(const QModelIndex&, const QVariant&, int = Qt::EditRole); + + void addDebugInformation(const int &time, const DebugLevel_custom &level, const std::string& function, const std::string& text, const std::string &file="", const unsigned int& ligne=0, const std::string& location="Core"); + void setupTheTimer(); + QTimer *updateDisplayTimer; + bool displayed; + bool inWaitOfDisplay; +private: + std::vector<DebugItem> list; +private slots: + void updateDisplay(); +}; + +/** \brief Define the class for the debug + +This class provide all needed for the debug mode of ultracopier */ +class DebugEngine : public QObject +{ + Q_OBJECT + public: + /// \brief Initiate the ultracopier event dispatcher and check if no other session is running + DebugEngine(); + /** \brief Destroy the ultracopier event dispatcher + \note This function is thread safe */ + ~DebugEngine(); + /** \brief Get the html text info for re-show it + \note This function is thread safe */ + std::string getTheDebugHtml(); + /// \brief Enumeration of backend + enum Backend + { + Memory, //Do intensive usage of memory, used only if the file backend is not available + File //Store all directly into file, at crash the backtrace is into the file + }; + /// \brief return the current backend + Backend getCurrentBackend(); + /// \brief Get the html end + std::string getTheDebugEnd(); + /** \brief For add message info, this function + \note This function is reentrant */ + static void addDebugInformationStatic(const Ultracopier::DebugLevel &level,const std::string& function,const std::string& text,const std::string& file="",const int& ligne=-1,const std::string& location="Core"); + static void addDebugNote(const std::string& text); + static DebugEngine *debugEngine; + public slots: + /** \brief ask to the user where save the bug report + \warning This function can be only call by the graphical thread */ + void saveBugReport(); + void addDebugInformation(const DebugLevel_custom &level,const std::string& fonction,const std::string& text,std::string file="",const int& ligne=-1,const std::string& location="Core"); + private: + /// \brief Path for log file + QFile logFile; + /// \brief Path for lock file + QFile lockFile; + /// \brief Internal function to remove the lock file + bool removeTheLockFile(); + /** \brief Do thread safe part for the addDebugInformation() + \see addDebugInformation() */ + QMutex mutex; + QMutex mutexList; + /// \brief For record the start time + QTime startTime; + /// \brief String for the end of log file + std::string endOfLogFile; + /// \brief Drop the html entities + std::string htmlEntities(const std::string &text); + /// \brief To store the debug informations + std::string debugHtmlContent; + /// \brief The current backend + Backend currentBackend; + /// try connect to send to the current running instance the arguements + bool tryConnect(); + int addDebugInformationCallNumber; + bool quit; + //std::regex fileNameCleaner;don't clean, too many performance heart +}; + +#endif // ULTRACOPIER_DEBUG + +#endif // DEBUG_ENGINE_H |