diff --git a/src/map/ENC/iso8211.cpp b/src/map/ENC/iso8211.cpp index 6c4626b5..5ee607de 100644 --- a/src/map/ENC/iso8211.cpp +++ b/src/map/ENC/iso8211.cpp @@ -22,51 +22,6 @@ struct DR { char FieldTagSize; }; -const QVariant *ISO8211::data(const Field &field, quint32 name) const -{ - const QVector &v = field.data().first(); - - for (int i = 0; i < field.subFields()->size(); i++) - if (field.subFields()->at(i) == name) - return &v.at(i); - - return 0; -} - -bool ISO8211::subfield(const Field &field, quint32 name, int *val) const -{ - bool ok; - - const QVariant *v = data(field, name); - if (!v) - return false; - *val = v->toInt(&ok); - - return ok; -} - -bool ISO8211::subfield(const Field &field, quint32 name, uint *val) const -{ - bool ok; - - const QVariant *v = data(field, name); - if (!v) - return false; - *val = v->toUInt(&ok); - - return ok; -} - -bool ISO8211::subfield(const Field &field, quint32 name, QByteArray *val) const -{ - const QVariant *v = data(field, name); - if (!v) - return false; - *val = v->toByteArray(); - - return true; -} - ISO8211::SubFieldDefinition ISO8211::fieldType(const QString &str, int cnt) { if (str == "A" || str == "I" || str == "R") @@ -337,7 +292,7 @@ bool ISO8211::readRecord(Record &record) return false; } - record[i] = Field(def.tag, it->tags(), data); + record[i] = Field(def.tag, data); } return true; diff --git a/src/map/ENC/iso8211.h b/src/map/ENC/iso8211.h index fb7519ea..992f7846 100644 --- a/src/map/ENC/iso8211.h +++ b/src/map/ENC/iso8211.h @@ -15,17 +15,14 @@ public: class Field { public: - Field() : _tag(0), _subFields(0) {} - Field(quint32 tag, const QVector &subFields, const Data &data) - : _tag(tag), _subFields(&subFields), _data(data) {} + Field() : _tag(0) {} + Field(quint32 tag, const Data &data) : _tag(tag), _data(data) {} quint32 tag() const {return _tag;} const Data &data() const {return _data;} - const QVector *subFields() const {return _subFields;} private: quint32 _tag; - const QVector *_subFields; Data _data; }; @@ -34,11 +31,6 @@ public: ISO8211(const QString &path) : _file(path) {} bool readDDR(); bool readRecord(Record &record); - - bool subfield(const Field &field, quint32 name, int *val) const; - bool subfield(const Field &field, quint32 name, uint *val) const; - bool subfield(const Field &field, quint32 name, QByteArray *val) const; - const QString &errorString() const {return _errorString;} static const Field *field(const Record &record, quint32 name); @@ -102,7 +94,6 @@ private: bool readDDA(const FieldDefinition &def, SubFields &fields); bool readUDA(quint64 pos, const FieldDefinition &def, const QVector &fields, bool repeat, Data &data); - const QVariant *data(const Field &field, quint32 name) const; QFile _file; FieldsMap _map; diff --git a/src/map/ENC/mapdata.cpp b/src/map/ENC/mapdata.cpp index 98ea0828..d8ca4638 100644 --- a/src/map/ENC/mapdata.cpp +++ b/src/map/ENC/mapdata.cpp @@ -15,7 +15,6 @@ using namespace ENC; #define PRIM_L 2 #define PRIM_A 3 -constexpr quint32 RCID = ISO8211::NAME("RCID"); constexpr quint32 SG2D = ISO8211::NAME("SG2D"); constexpr quint32 SG3D = ISO8211::NAME("SG3D"); constexpr quint32 FSPT = ISO8211::NAME("FSPT"); @@ -24,9 +23,6 @@ constexpr quint32 ATTF = ISO8211::NAME("ATTF"); constexpr quint32 VRID = ISO8211::NAME("VRID"); constexpr quint32 FRID = ISO8211::NAME("FRID"); constexpr quint32 DSPM = ISO8211::NAME("DSPM"); -constexpr quint32 COMF = ISO8211::NAME("COMF"); -constexpr quint32 SOMF = ISO8211::NAME("SOMF"); -constexpr quint32 HUNI = ISO8211::NAME("HUNI"); static QMap orderMapInit() { @@ -104,22 +100,20 @@ static uint order(uint type) return (it == orderMap.constEnd()) ? (type>>16) + 512 : it.value(); } -static void warning(const ISO8211 &ddf, const ISO8211::Field &frid, uint prim) +static void warning(const ISO8211::Field &frid, uint prim) { - uint rcid; + uint rcid = frid.data().at(0).at(1).toUInt(); - if (ddf.subfield(frid, RCID, &rcid)) { - switch (prim) { - case PRIM_P: - qWarning("%u: invalid point feature", rcid); - break; - case PRIM_L: - qWarning("%u: invalid line feature", rcid); - break; - case PRIM_A: - qWarning("%u: invalid area feature", rcid); - break; - } + switch (prim) { + case PRIM_P: + qWarning("%u: invalid point feature", rcid); + break; + case PRIM_L: + qWarning("%u: invalid line feature", rcid); + break; + case PRIM_A: + qWarning("%u: invalid area feature", rcid); + break; } } @@ -761,7 +755,7 @@ MapData::Poly *MapData::polyObject(const ISO8211::Record &r, return (path.isEmpty() ? 0 : new Poly(objl, path, attributes(r), huni)); } -bool MapData::processRecord(const ISO8211 &ddf, const ISO8211::Record &record, +bool MapData::processRecord(const ISO8211::Record &record, QVector &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve, RecordMap &vf, uint &comf, uint &somf, uint &huni) { @@ -772,10 +766,14 @@ bool MapData::processRecord(const ISO8211 &ddf, const ISO8211::Record &record, quint32 tag = f.tag(); if (tag == VRID) { + bool nmok, idok; + if (f.data().at(0).size() < 2) return false; - int rcnm = f.data().at(0).at(0).toInt(); - uint rcid = f.data().at(0).at(1).toUInt(); + int rcnm = f.data().at(0).at(0).toInt(&nmok); + uint rcid = f.data().at(0).at(1).toUInt(&idok); + if (!(nmok && idok)) + return false; switch (rcnm) { case RCNM_VI: @@ -796,10 +794,15 @@ bool MapData::processRecord(const ISO8211 &ddf, const ISO8211::Record &record, } else if (tag == FRID) { fe.append(record); } else if (tag == DSPM) { - if (!(ddf.subfield(f, COMF, &comf) && ddf.subfield(f, SOMF, &somf))) - return false; - if (!ddf.subfield(f, HUNI, &huni)) + bool cok, sok, hok; + + if (f.data().at(0).size() < 12) return false; + comf = f.data().at(0).at(10).toUInt(&cok); + somf = f.data().at(0).at(11).toUInt(&sok); + huni = f.data().at(0).at(7).toUInt(&hok); + + return (cok && sok && hok); } return true; @@ -821,7 +824,7 @@ MapData::MapData(const QString &path) if (!ddf.readDDR()) return; while (ddf.readRecord(record)) - if (!processRecord(ddf, record, fe, vi, vc, ve, vf, comf, somf, huni)) + if (!processRecord(record, fe, vi, vc, ve, vf, comf, somf, huni)) qWarning("Invalid S-57 record"); for (int i = 0; i < fe.size(); i++) { @@ -847,7 +850,7 @@ MapData::MapData(const QString &path) pointBounds(point->pos(), min, max); _points.Insert(min, max, point); } else - warning(ddf, f, prim); + warning(f, prim); } break; case PRIM_L: @@ -855,14 +858,14 @@ MapData::MapData(const QString &path) rectcBounds(line->bounds(), min, max); _lines.Insert(min, max, line); } else - warning(ddf, f, prim); + warning(f, prim); break; case PRIM_A: if ((poly = polyObject(r, vc, ve, comf, objl, huni))) { rectcBounds(poly->bounds(), min, max); _areas.Insert(min, max, poly); } else - warning(ddf, f, prim); + warning(f, prim); break; } } diff --git a/src/map/ENC/mapdata.h b/src/map/ENC/mapdata.h index a7202bf9..6824173f 100644 --- a/src/map/ENC/mapdata.h +++ b/src/map/ENC/mapdata.h @@ -51,7 +51,7 @@ private: static Poly *polyObject(const ISO8211::Record &r, const RecordMap &vc, const RecordMap &ve, uint comf, uint objl, uint huni); - static bool processRecord(const ISO8211 &ddf, const ISO8211::Record &record, + static bool processRecord(const ISO8211::Record &record, QVector &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve, RecordMap &vf, uint &comf, uint &somf, uint &huni); diff --git a/src/map/encatlas.cpp b/src/map/encatlas.cpp index b2a342cf..6a9b78c2 100644 --- a/src/map/encatlas.cpp +++ b/src/map/encatlas.cpp @@ -13,12 +13,6 @@ using namespace ENC; #define TILE_SIZE 512 constexpr quint32 CATD = ISO8211::NAME("CATD"); -constexpr quint32 IMPL = ISO8211::NAME("IMPL"); -constexpr quint32 F1LE = ISO8211::NAME("FILE"); -constexpr quint32 SLAT = ISO8211::NAME("SLAT"); -constexpr quint32 WLON = ISO8211::NAME("WLON"); -constexpr quint32 NLAT = ISO8211::NAME("NLAT"); -constexpr quint32 ELON = ISO8211::NAME("ELON"); Range ENCAtlas::zooms(IntendedUsage usage) { @@ -61,8 +55,8 @@ ENCAtlas::IntendedUsage ENCAtlas::usage(const QString &path) return (IntendedUsage)iu; } -bool ENCAtlas::processRecord(const ISO8211 &ddf, const ISO8211::Record &record, - QByteArray &file, RectC &bounds) +bool ENCAtlas::processRecord(const ISO8211::Record &record, QByteArray &file, + RectC &bounds) { if (record.size() < 2) return false; @@ -70,24 +64,16 @@ bool ENCAtlas::processRecord(const ISO8211 &ddf, const ISO8211::Record &record, const ENC::ISO8211::Field &field = record.at(1); if (field.tag() == CATD) { - QByteArray impl; - - if (!ddf.subfield(field, IMPL, &impl)) - return false; - if (!ddf.subfield(field, F1LE, &file)) + if (field.data().at(0).size() < 10) return false; + QByteArray impl = field.data().at(0).at(5).toByteArray(); + file = field.data().at(0).at(2).toByteArray(); if (impl == "BIN" && file.endsWith("000")) { - QByteArray slat, wlon, nlat, elon; - - if (!ddf.subfield(field, SLAT, &slat)) - return false; - if (!ddf.subfield(field, WLON, &wlon)) - return false; - if (!ddf.subfield(field, NLAT, &nlat)) - return false; - if (!ddf.subfield(field, ELON, &elon)) - return false; + QByteArray slat = field.data().at(0).at(6).toByteArray(); + QByteArray wlon = field.data().at(0).at(7).toByteArray(); + QByteArray nlat = field.data().at(0).at(8).toByteArray(); + QByteArray elon = field.data().at(0).at(9).toByteArray(); bool ok1, ok2, ok3, ok4; bounds = RectC(Coordinates(wlon.toDouble(&ok1), nlat.toDouble(&ok2)), @@ -142,7 +128,7 @@ ENCAtlas::ENCAtlas(const QString &fileName, QObject *parent) return; } while (ddf.readRecord(record)) { - if (processRecord(ddf, record, file, bounds)) + if (processRecord(record, file, bounds)) addMap(dir, file, bounds); } if (!ddf.errorString().isNull()) { diff --git a/src/map/encatlas.h b/src/map/encatlas.h index 1e8886d6..e5fdd8f7 100644 --- a/src/map/encatlas.h +++ b/src/map/encatlas.h @@ -76,8 +76,8 @@ private: void addMap(const QDir &dir, const QByteArray &file, const RectC &bounds); QList levels() const; - static bool processRecord(const ENC::ISO8211 &ddf, - const ENC::ISO8211::Record &record, QByteArray &file, RectC &bounds); + static bool processRecord(const ENC::ISO8211::Record &record, + QByteArray &file, RectC &bounds); static Range zooms(IntendedUsage usage); static IntendedUsage usage(const QString &path); diff --git a/src/map/encmap.cpp b/src/map/encmap.cpp index 15402bc7..1e1cd922 100644 --- a/src/map/encmap.cpp +++ b/src/map/encmap.cpp @@ -19,9 +19,7 @@ constexpr quint32 SG2D = ISO8211::NAME("SG2D"); constexpr quint32 SG3D = ISO8211::NAME("SG3D"); constexpr quint32 VRID = ISO8211::NAME("VRID"); constexpr quint32 DSID = ISO8211::NAME("DSID"); -constexpr quint32 DSNM = ISO8211::NAME("DSNM"); constexpr quint32 DSPM = ISO8211::NAME("DSPM"); -constexpr quint32 COMF = ISO8211::NAME("COMF"); static Range zooms(const RectC &bounds) { @@ -104,7 +102,7 @@ bool ENCMap::bounds(const QVector &gv, Rect &b) return true; } -bool ENCMap::processRecord(const ISO8211 &ddf, const ISO8211::Record &record, +bool ENCMap::processRecord(const ISO8211::Record &record, QVector &rv, uint &comf, QByteArray &dsnm) { if (record.size() < 2) @@ -116,10 +114,15 @@ bool ENCMap::processRecord(const ISO8211 &ddf, const ISO8211::Record &record, if (tag == VRID) { rv.append(record); } else if (tag == DSID) { - if (!ddf.subfield(f, DSNM, &dsnm)) + if (f.data().at(0).size() < 5) return false; + dsnm = f.data().at(0).at(4).toByteArray(); } else if (tag == DSPM) { - if (!ddf.subfield(f, COMF, &comf)) + bool ok; + if (f.data().at(0).size() < 11) + return false; + comf = f.data().at(0).at(10).toUInt(&ok); + if (!ok) return false; } @@ -141,7 +144,7 @@ ENCMap::ENCMap(const QString &fileName, QObject *parent) return; } while (ddf.readRecord(record)) { - if (!processRecord(ddf, record, gv, comf, dsnm)) { + if (!processRecord(record, gv, comf, dsnm)) { _errorString = "Invalid S-57 record"; return; } diff --git a/src/map/encmap.h b/src/map/encmap.h index eb690a02..6d66b043 100644 --- a/src/map/encmap.h +++ b/src/map/encmap.h @@ -96,9 +96,8 @@ private: static bool bounds(const ENC::ISO8211::Record &record, Rect &rect); static bool bounds(const QVector &gv, Rect &b); - static bool processRecord(const ENC::ISO8211 &ddf, - const ENC::ISO8211::Record &record, QVector &rv, - uint &comf, QByteArray &dsnm); + static bool processRecord(const ENC::ISO8211::Record &record, + QVector &rv, uint &comf, QByteArray &dsnm); QString _name; ENC::MapData *_data;