diff --git a/src/map/ENC/iso8211.cpp b/src/map/ENC/iso8211.cpp index 279ffded..22014971 100644 --- a/src/map/ENC/iso8211.cpp +++ b/src/map/ENC/iso8211.cpp @@ -188,12 +188,16 @@ bool ISO8211::readDDA(QFile &file, const FieldDefinition &def, SubFields &fields return true; } -bool ISO8211::readDDR(QFile &file) +bool ISO8211::readDDR() { QVector fields; - qint64 pos = file.pos(); - int len = readDR(file, fields); + if (!_file.open(QIODevice::ReadOnly)) { + _errorString = _file.errorString(); + return false; + } + + int len = readDR(_file, fields); if (len < 0) { _errorString = "Not a ISO8211 file"; return false; @@ -201,7 +205,7 @@ bool ISO8211::readDDR(QFile &file) for (int i = 0; i < fields.size(); i++) { SubFields def; - if (!readDDA(file, fields.at(i), def)) { + if (!readDDA(_file, fields.at(i), def)) { _errorString = QString("Error reading %1 DDA field") .arg(QString(fields.at(i).tag)); return false; @@ -209,7 +213,7 @@ bool ISO8211::readDDR(QFile &file) _map.insert(fields.at(i).tag, def); } - if (file.pos() != pos + len || fields.size() < 2) { + if (_file.pos() != len || fields.size() < 2) { _errorString = "DDR format error"; return false; } @@ -231,6 +235,7 @@ bool ISO8211::readUDA(QFile &file, quint64 pos, const FieldDefinition &def, const char *dp = ba.constData(); const char *ep = ba.constData() + ba.size() - 1; + data.clear(); data.setFields(&fields); do { @@ -287,11 +292,14 @@ bool ISO8211::readUDA(QFile &file, quint64 pos, const FieldDefinition &def, return true; } -bool ISO8211::readRecord(QFile &file, Record &record) +bool ISO8211::readRecord(Record &record) { + if (_file.atEnd()) + return false; + QVector fields; - qint64 pos = file.pos(); - int len = readDR(file, fields); + qint64 pos = _file.pos(); + int len = readDR(_file, fields); if (len < 0) { _errorString = "Error reading DR"; @@ -313,7 +321,7 @@ bool ISO8211::readRecord(QFile &file, Record &record) f.setTag(def.tag); - if (!readUDA(file, pos, def, it.value(), f.rdata())) { + if (!readUDA(_file, pos, def, it.value(), f.rdata())) { _errorString = QString("Error reading %1 record") .arg(QString(def.tag)); return false; diff --git a/src/map/ENC/iso8211.h b/src/map/ENC/iso8211.h index 8bdb8177..542411eb 100644 --- a/src/map/ENC/iso8211.h +++ b/src/map/ENC/iso8211.h @@ -1,12 +1,11 @@ #ifndef ENC_ISO8211_H #define ENC_ISO8211_H +#include #include #include #include -class QFile; - #define UINT32(x) \ (((quint32)*(const uchar*)(x)) \ | ((quint32)(*((const uchar*)(x) + 1)) << 8) \ @@ -102,8 +101,9 @@ public: } }; - bool readDDR(QFile &file); - bool readRecord(QFile &file, Record &record); + ISO8211(const QString &path) : _file(path) {} + bool readDDR(); + bool readRecord(Record &record); const QString &errorString() const {return _errorString;} @@ -118,6 +118,7 @@ private: bool readUDA(QFile &file, quint64 pos, const FieldDefinition &def, const SubFields &fields, Data &data) const; + QFile _file; FieldsMap _map; QString _errorString; }; diff --git a/src/map/ENC/mapdata.cpp b/src/map/ENC/mapdata.cpp index 3f1f2451..99e0a9ad 100644 --- a/src/map/ENC/mapdata.cpp +++ b/src/map/ENC/mapdata.cpp @@ -1,4 +1,3 @@ -#include #include "common/util.h" #include "objects.h" #include "attributes.h" @@ -751,31 +750,25 @@ bool MapData::bounds(const QVector &gv, Rect &b) MapData::MapData(const QString &path): _fileName(path) { - QFile file(_fileName); QVector gv; - ISO8211 ddf; + ISO8211 ddf(_fileName); + ISO8211::Record record; uint COMF = 1; - if (!file.open(QIODevice::ReadOnly)) { - _errorString = file.errorString(); - return; - } - - if (!ddf.readDDR(file)) { + if (!ddf.readDDR()) { _errorString = ddf.errorString(); return; } - while (!file.atEnd()) { - ISO8211::Record record; - if (!ddf.readRecord(file, record)) { - _errorString = ddf.errorString(); - return; - } + while (ddf.readRecord(record)) { if (!processRecord(record, gv, COMF, _name)) { _errorString = "Invalid S-57 record"; return; } } + if (!ddf.errorString().isNull()) { + _errorString = ddf.errorString(); + return; + } Rect b; if (!bounds(gv, b)) { @@ -807,30 +800,22 @@ MapData::~MapData() void MapData::load() { - QFile file(_fileName); RecordMap vi, vc, ve, vf; QVector fe; - uint COMF = 1, SOMF = 1; - ISO8211 ddf; - uint PRIM, OBJL; + ISO8211 ddf(_fileName); + ISO8211::Record record; + uint PRIM, OBJL, COMF = 1, SOMF = 1; Poly *poly; Line *line; Point *point; double min[2], max[2]; - if (!file.open(QIODevice::ReadOnly)) + if (!ddf.readDDR()) return; - - if (!ddf.readDDR(file)) - return; - while (!file.atEnd()) { - ISO8211::Record record; - if (!ddf.readRecord(file, record)) - return; + while (ddf.readRecord(record)) if (!processRecord(record, fe, vi, vc, ve, vf, COMF, SOMF)) - return; - } + qWarning("Invalid S-57 record"); for (int i = 0; i < fe.size(); i++) { const ISO8211::Record &r = fe.at(i);