1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-04-19 19:59:11 +02:00
GPXSee/src/map/ENC/iso8211.h

115 lines
2.6 KiB
C++

#ifndef ENC_ISO8211_H
#define ENC_ISO8211_H
#include <QFile>
#include <QByteArray>
#include <QVariant>
namespace ENC {
class ISO8211
{
public:
typedef QVector<QVector<QVariant> > Data;
class Field
{
public:
Field() : _subFields(0) {}
Field(quint32 tag, const QVector<quint32> &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<quint32> *_subFields;
Data _data;
};
typedef QVector<Field> 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<quint32>(str[0])
+ (static_cast<quint32>(str[1]) << 8)
+ (static_cast<quint32>(str[2]) << 16)
+ (static_cast<quint32>(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<quint32> &tags,
const QVector<SubFieldDefinition> &defs, bool repeat)
: _tags(tags), _defs(defs), _repeat(repeat) {}
const QVector<quint32> &tags() const {return _tags;}
const QVector<SubFieldDefinition> &defs() const {return _defs;}
bool repeat() const {return _repeat;}
private:
QVector<quint32> _tags;
QVector<SubFieldDefinition> _defs;
bool _repeat;
};
typedef QMap<quint32, SubFields> FieldsMap;
static SubFieldDefinition fieldType(const QString &str, int cnt);
int readDR(QVector<FieldDefinition> &fields);
bool readDDA(const FieldDefinition &def, SubFields &fields);
bool readUDA(quint64 pos, const FieldDefinition &def,
const QVector<SubFieldDefinition> &fields, bool repeat, Data &data);
QFile _file;
FieldsMap _map;
QString _errorString;
};
}
#endif // ENC_ISO8211_H