1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-04-21 20:59:11 +02:00

Compare commits

..

No commits in common. "8c67df7bbde82ac88ae68eb6e1d59528fac0e156" and "7bf7385cf10b0ff545cc6d48cd77d2a849d48068" have entirely different histories.

8 changed files with 125 additions and 98 deletions

View File

@ -1,4 +1,4 @@
version: 13.9.{build}
version: 13.8.{build}
configuration:
- Release

View File

@ -3,7 +3,7 @@ unix:!macx:!android {
} else {
TARGET = GPXSee
}
VERSION = 13.9
VERSION = 13.8
QT += core \

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 260 B

View File

@ -1648,7 +1648,7 @@
<key>UTTypeIdentifier</key>
<string>int.iho.s57-catalogue</string>
<key>UTTypeReferenceURL</key>
<string>https://iho.int/uploads/user/pubs/standards/s-57/20ApB1.pdf</string>
<string>https://iho.int/uploads/user/pubs/standards/s-57/31Main.pdf</string>
<key>UTTypeDescription</key>
<string>IHO S-57 Electronic Navigation Catalogue</string>
<key>UTTypeConformsTo</key>

View File

@ -37,7 +37,7 @@ Unicode true
; The name of the installer
Name "GPXSee"
; Program version
!define VERSION "13.9"
!define VERSION "13.8"
; The file to write
OutFile "GPXSee-${VERSION}_x64.exe"

View File

@ -28,23 +28,12 @@ struct DR {
char FieldTagSize;
};
const QVariant *ISO8211::Field::data(const QByteArray &name, int idx) const
{
const QVector<QVariant> &v = _data.at(idx);
for (int i = 0; i < _subFields.size(); i++)
if (_subFields.at(i) == name)
return &v.at(i);
return 0;
}
bool ISO8211::Field::subfield(const char *name, int *val, int idx) const
{
const QVariant *v;
bool ok;
const QVariant *v = data(name, idx);
v = data().field(name, idx);
if (!v)
return false;
*val = v->toInt(&ok);
@ -54,9 +43,10 @@ bool ISO8211::Field::subfield(const char *name, int *val, int idx) const
bool ISO8211::Field::subfield(const char *name, uint *val, int idx) const
{
const QVariant *v;
bool ok;
const QVariant *v = data(name, idx);
v = data().field(name, idx);
if (!v)
return false;
*val = v->toUInt(&ok);
@ -66,7 +56,9 @@ bool ISO8211::Field::subfield(const char *name, uint *val, int idx) const
bool ISO8211::Field::subfield(const char *name, QByteArray *val, int idx) const
{
const QVariant *v = data(name, idx);
const QVariant *v;
v = data().field(name, idx);
if (!v)
return false;
*val = v->toByteArray();
@ -74,24 +66,25 @@ bool ISO8211::Field::subfield(const char *name, QByteArray *val, int idx) const
return true;
}
ISO8211::SubFieldDefinition ISO8211::fieldType(const QString &str, int cnt)
ISO8211::SubFieldDefinition ISO8211::fieldType(const QString &str, int cnt,
const QByteArray &tag)
{
if (str == "A" || str == "I" || str == "R")
return SubFieldDefinition(String, cnt);
return SubFieldDefinition(tag, String, cnt);
else if (str == "B")
return SubFieldDefinition(Array, cnt / 8);
return SubFieldDefinition(tag, Array, cnt / 8);
else if (str == "b11")
return SubFieldDefinition(U8, 1);
return SubFieldDefinition(tag, U8, 1);
else if (str == "b12")
return SubFieldDefinition(U16, 2);
return SubFieldDefinition(tag, U16, 2);
else if (str == "b14")
return SubFieldDefinition(U32, 4);
return SubFieldDefinition(tag, U32, 4);
else if (str == "b21")
return SubFieldDefinition(S8, 1);
return SubFieldDefinition(tag, S8, 1);
else if (str == "b22")
return SubFieldDefinition(S16, 2);
return SubFieldDefinition(tag, S16, 2);
else if (str == "b24")
return SubFieldDefinition(S32, 4);
return SubFieldDefinition(tag, S32, 4);
else
return SubFieldDefinition();
}
@ -145,7 +138,6 @@ bool ISO8211::readDDA(const FieldDefinition &def, SubFields &fields)
QByteArray ba;
bool repeat = false;
QVector<SubFieldDefinition> defs;
QVector<QByteArray> defTags;
ba.resize(def.size);
if (!(_file.seek(def.pos) && _file.read(ba.data(), ba.size()) == ba.size()))
@ -163,7 +155,6 @@ bool ISO8211::readDDA(const FieldDefinition &def, SubFields &fields)
int tag = 0;
defs.resize(tags.size());
defTags.resize(tags.size());
while (it.hasNext()) {
QRegularExpressionMatch match = it.next();
@ -185,17 +176,16 @@ bool ISO8211::readDDA(const FieldDefinition &def, SubFields &fields)
}
for (uint i = 0; i < cnt; i++) {
SubFieldDefinition sfd(fieldType(typeStr, size));
SubFieldDefinition sfd(fieldType(typeStr, size, tags.at(tag)));
if (sfd.type() == Unknown)
return false;
defs[tag] = sfd;
defTags[tag] = tags.at(tag);
tag++;
}
}
}
fields = SubFields(defTags, defs, repeat);
fields = SubFields(defs, repeat);
return true;
}
@ -233,8 +223,7 @@ bool ISO8211::readDDR()
return true;
}
bool ISO8211::readUDA(quint64 pos, const FieldDefinition &def,
const QVector<SubFieldDefinition> &fields, bool repeat, Data &data)
bool ISO8211::readUDA(quint64 pos, const FieldDefinition &def, Data &data)
{
QByteArray ba;
@ -249,10 +238,10 @@ bool ISO8211::readUDA(quint64 pos, const FieldDefinition &def,
do {
QVector<QVariant> row;
row.resize(fields.size());
row.resize(data.fields()->size());
for (int i = 0; i < fields.size(); i++) {
const SubFieldDefinition &f = fields.at(i);
for (int i = 0; i < data.fields()->size(); i++) {
const SubFieldDefinition &f = data.fields()->at(i);
switch (f.type()) {
case String:
@ -298,7 +287,7 @@ bool ISO8211::readUDA(quint64 pos, const FieldDefinition &def,
}
data.append(row);
} while (repeat && dp < ep);
} while (data.fields()->repeat() && dp < ep);
return true;
}
@ -310,9 +299,9 @@ bool ISO8211::readRecord(Record &record)
QVector<FieldDefinition> fields;
qint64 pos = _file.pos();
int len = readDR(fields);
if (readDR(fields) < 0) {
if (len < 0) {
_errorString = "Error reading DR";
return false;
}
@ -321,7 +310,6 @@ bool ISO8211::readRecord(Record &record)
for (int i = 0; i < fields.size(); i++) {
const FieldDefinition &def = fields.at(i);
Data data;
FieldsMap::const_iterator it = _map.find(def.tag);
if (it == _map.constEnd()) {
@ -329,13 +317,15 @@ bool ISO8211::readRecord(Record &record)
return false;
}
if (!readUDA(pos, def, it->defs(), it->repeat(), data)) {
Data data(&it.value());
if (!readUDA(pos, def, data)) {
_errorString = QString("Error reading %1 record")
.arg(QString(def.tag));
return false;
}
record[i] = Field(def.tag, it->tags(), data);
record[i] = Field(def.tag, data);
}
return true;

View File

@ -17,17 +17,87 @@ namespace ENC {
class ISO8211
{
public:
typedef QVector<QVector<QVariant> > Data;
enum FieldType {Unknown, String, Array, S8, S16, S32, U8, U16, U32};
struct FieldDefinition
{
QByteArray tag;
int pos;
int size;
};
class SubFieldDefinition
{
public:
SubFieldDefinition() : _type(Unknown), _size(0) {}
SubFieldDefinition(const QByteArray &tag, FieldType type, int size)
: _tag(tag), _type(type), _size(size) {}
const QByteArray &tag() const {return _tag;}
FieldType type() const {return _type;}
int size() const {return _size;}
private:
QByteArray _tag;
FieldType _type;
int _size;
};
class SubFields
{
public:
SubFields() : _repeat(false) {}
SubFields(const QVector<SubFieldDefinition> &defs, bool repeat)
: _defs(defs), _repeat(repeat) {}
int size() const {return _defs.size();}
const SubFieldDefinition &at(int i) const {return _defs.at(i);}
bool repeat() const {return _repeat;}
private:
QVector<SubFieldDefinition> _defs;
bool _repeat;
};
class Data
{
public:
Data() : _fields(0) {}
Data(const SubFields *fields) : _fields(fields) {}
int size() const {return _data.size();}
const QVector<QVariant> &at(int i) const {return _data.at(i);}
const SubFields *fields() const {return _fields;}
const QVariant *field(const QByteArray &name, int idx = 0) const
{
const QVector<QVariant> &v = _data.at(idx);
for (int i = 0; i < _fields->size(); i++)
if (_fields->at(i).tag() == name)
return &v.at(i);
return 0;
}
private:
friend class ISO8211;
void append(QVector<QVariant> &row) {_data.append(row);}
QVector<QVector<QVariant> > _data;
const SubFields *_fields;
};
class Field
{
public:
Field() {}
Field(const QByteArray &tag, const QVector<QByteArray> &subFields,
const Data &data) : _tag(tag), _subFields(subFields), _data(data) {}
Field(const QByteArray &tag, const Data &data)
: _tag(tag), _data(data) {}
const QByteArray &tag() const {return _tag;}
const QVector<QByteArray> subFields() const {return _subFields;}
const Data &data() const {return _data;}
bool subfield(const char *name, int *val, int idx = 0) const;
@ -35,10 +105,7 @@ public:
bool subfield(const char *name, QByteArray *val, int idx = 0) const;
private:
const QVariant *data(const QByteArray &name, int idx = 0) const;
QByteArray _tag;
QVector<QByteArray> _subFields;
Data _data;
};
@ -53,57 +120,14 @@ public:
static const Field *field(const Record &record, const QByteArray &name);
private:
enum FieldType {Unknown, String, Array, S8, S16, S32, U8, U16, U32};
struct FieldDefinition
{
QByteArray 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<QByteArray> &tags,
const QVector<SubFieldDefinition> &defs, bool repeat)
: _tags(tags), _defs(defs), _repeat(repeat) {}
const QVector<QByteArray> &tags() const {return _tags;}
const QVector<SubFieldDefinition> &defs() const {return _defs;}
bool repeat() const {return _repeat;}
private:
QVector<QByteArray> _tags;
QVector<SubFieldDefinition> _defs;
bool _repeat;
};
typedef QMap<QByteArray, SubFields> FieldsMap;
static SubFieldDefinition fieldType(const QString &str, int cnt);
static SubFieldDefinition fieldType(const QString &str, int cnt,
const QByteArray &tag);
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);
bool readUDA(quint64 pos, const FieldDefinition &def, Data &data);
QFile _file;
FieldsMap _map;
@ -111,9 +135,22 @@ private:
};
#ifndef QT_NO_DEBUG
inline QDebug operator<<(QDebug dbg, const ISO8211::FieldDefinition &def)
{
dbg.nospace() << "FieldDefinition(" << def.tag << ", " << def.size << ")";
return dbg.space();
}
inline QDebug operator<<(QDebug dbg, const ISO8211::SubFieldDefinition &def)
{
dbg.nospace() << "SubField(" << def.tag() << ", " << def.type() << ", "
<< def.size() << ")";
return dbg.space();
}
inline QDebug operator<<(QDebug dbg, const ISO8211::Field &field)
{
dbg.nospace() << "Field(" << field.tag() << ", " << field.subFields() << ")";
dbg.nospace() << "Field(" << field.tag() << ")";
return dbg.space();
}
#endif // QT_NO_DEBUG