#ifndef ENC_ISO8211_H #define ENC_ISO8211_H #include #include #include namespace ENC { class ISO8211 { public: typedef QVector > Data; class Field { public: Field() : _subFields(0) {} Field(quint32 tag, const QVector &subFields, const Data &data) : _tag(tag), _subFields(&subFields), _data(data) {} quint32 tag() const {return _tag;} const Data &data() const {return _data;} bool subfield(quint32 name, int *val, int idx = 0) const; bool subfield(quint32 name, uint *val, int idx = 0) const; bool subfield(quint32 name, QByteArray *val, int idx = 0) const; private: const QVariant *data(quint32 name, int idx = 0) const; quint32 _tag; const QVector *_subFields; Data _data; }; typedef QVector Record; ISO8211(const QString &path) : _file(path) {} bool readDDR(); bool readRecord(Record &record); const QString &errorString() const {return _errorString;} static const Field *field(const Record &record, quint32 name); static constexpr quint32 NAME(const char str[4]) { return static_cast(str[0]) + (static_cast(str[1]) << 8) + (static_cast(str[2]) << 16) + (static_cast(str[3]) << 24); } private: enum FieldType {Unknown, String, Array, S8, S16, S32, U8, U16, U32}; struct FieldDefinition { quint32 tag; int pos; int size; }; class SubFieldDefinition { public: SubFieldDefinition() : _type(Unknown), _size(0) {} SubFieldDefinition(FieldType type, int size) : _type(type), _size(size) {} FieldType type() const {return _type;} int size() const {return _size;} private: FieldType _type; int _size; }; class SubFields { public: SubFields() : _repeat(false) {} SubFields(const QVector &tags, const QVector &defs, bool repeat) : _tags(tags), _defs(defs), _repeat(repeat) {} const QVector &tags() const {return _tags;} const QVector &defs() const {return _defs;} bool repeat() const {return _repeat;} private: QVector _tags; QVector _defs; bool _repeat; }; typedef QMap FieldsMap; static SubFieldDefinition fieldType(const QString &str, int cnt); int readDR(QVector &fields); bool readDDA(const FieldDefinition &def, SubFields &fields); bool readUDA(quint64 pos, const FieldDefinition &def, const QVector &fields, bool repeat, Data &data); QFile _file; FieldsMap _map; QString _errorString; }; } #endif // ENC_ISO8211_H