#pragma once #include #include #include #include "logger.h" namespace N_LogView { struct MemberInformation { QString name; QString type; bool isArray = false; bool isBinary = false; bool isEnum = false; bool isPod = false; bool isString = false; bool isStruct = false; bool isVisible = true; }; struct StructInformation { QString type; QString baseStruct; QVector member; bool isVisible = false; }; struct EnumValue { QString key; int value = 0; }; struct EnumInformation { QString ns; QString type; QVector values; }; struct PodInformation { QString type; int byteLen = 0; bool isBoolean = false; bool isIntegral = false; bool isSigned = false; }; class LogViewTetraTelegramsParser { public: LogViewTetraTelegramsParser(); bool parse(const QString &filename); EnumInformation enumFromType(const QString &type) const; StructInformation structFromType(const QString &type) const; PodInformation podFromType(const QString &type) const; bool isEnum(const QString &type) const; bool isStruct(const QString &type) const; bool isPod(const QString &type) const; QHash telegramsToCreate() const { return m_visibleTelegrams; } QString nameFromTelegramId(int telId) const { return m_visibleTelegrams.value(telId); } static QString getInnerType(const QString &type); private: void insertPod(const QString &type, int byteLen, bool isSigned, bool isIntegral, bool isBoolean = false); int parseStruct(const QVector &lines, int iStartPos); int parseEnum(const QVector &lines, int iStartPos, const QString &ns, StructInformation *si = nullptr); int parseConstraint(const QVector &lines, int iStartPos); void categorizeMember(MemberInformation &mi) const; QVector tokenize(const QStringRef &line) const; static bool validStructTokens(const QVector &tokens); private: EnumInformation m_telegramIdEnum; QVector m_enums; QHash m_structs; QHash m_pods; QHash m_visibleTelegrams; NGL::INGLLogger &m_logger; }; }