From 7a161fa364991a489807efa45448e3e571aeb474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20T=C5=AFma?= Date: Fri, 3 Jan 2025 19:17:30 +0100 Subject: [PATCH] Improved error handling --- src/map/IMG/demfile.h | 2 +- src/map/IMG/gmapdata.cpp | 21 +++++++++----------- src/map/IMG/gmapdata.h | 6 ++---- src/map/IMG/imgdata.cpp | 3 +-- src/map/IMG/lblfile.h | 2 +- src/map/IMG/mapdata.cpp | 8 ++++---- src/map/IMG/netfile.h | 2 +- src/map/IMG/nodfile.h | 2 +- src/map/IMG/rastertile.cpp | 2 +- src/map/IMG/rgnfile.h | 2 +- src/map/IMG/style.cpp | 8 ++++---- src/map/IMG/style.h | 4 ++-- src/map/IMG/subfile.h | 15 ++++++++++----- src/map/IMG/trefile.cpp | 4 ++-- src/map/IMG/trefile.h | 2 +- src/map/IMG/vectortile.cpp | 39 ++++++++++++++++++++------------------ src/map/IMG/vectortile.h | 16 ++++++++++++++-- 17 files changed, 76 insertions(+), 62 deletions(-) diff --git a/src/map/IMG/demfile.h b/src/map/IMG/demfile.h index 7d4cb617..dce210b9 100644 --- a/src/map/IMG/demfile.h +++ b/src/map/IMG/demfile.h @@ -11,7 +11,7 @@ class DEMFile : public SubFile { public: DEMFile(const IMGData *img) : SubFile(img) {} - DEMFile(const QString *path) : SubFile(path) {} + DEMFile(const QString &path) : SubFile(path) {} DEMFile(const SubFile *gmp, quint32 offset) : SubFile(gmp, offset) {} bool load(Handle &hdl); diff --git a/src/map/IMG/gmapdata.cpp b/src/map/IMG/gmapdata.cpp index 1e15c1e2..f5239dd7 100644 --- a/src/map/IMG/gmapdata.cpp +++ b/src/map/IMG/gmapdata.cpp @@ -87,12 +87,16 @@ bool GMAPData::loadTile(const QDir &dir) const QFileInfo &fi = ml.at(i); SubFile::Type tt = tileType(fi.suffix()); if (VectorTile::isTileFile(tt)) { - _files.append(new QString(fi.absoluteFilePath())); - tile->addFile(_files.last(), tt); + if (!tile->addFile(fi.absoluteFilePath(), tt)) { + qWarning("%s: Invalid map tile structure", + qPrintable(dir.path())); + delete tile; + return false; + } } } - if (!tile->init(0)) { + if (!tile->init()) { qWarning("%s: Invalid map tile", qPrintable(dir.path())); delete tile; return false; @@ -131,10 +135,8 @@ GMAPData::GMAPData(const QString &fileName) : MapData(fileName) loadTile(QDir(fi.absoluteFilePath())); } - if (baseDir.exists(typFilePath)) { - _files.append(new QString(baseDir.filePath(typFilePath))); - _typ = new SubFile(_files.last()); - } + if (baseDir.exists(typFilePath)) + _typ = new SubFile(baseDir.filePath(typFilePath)); if (!_tileTree.Count()) _errorString = "No usable map tile found"; @@ -143,8 +145,3 @@ GMAPData::GMAPData(const QString &fileName) : MapData(fileName) computeZooms(); } - -GMAPData::~GMAPData() -{ - qDeleteAll(_files); -} diff --git a/src/map/IMG/gmapdata.h b/src/map/IMG/gmapdata.h index aff4596c..b7ae17a9 100644 --- a/src/map/IMG/gmapdata.h +++ b/src/map/IMG/gmapdata.h @@ -12,15 +12,13 @@ class GMAPData : public MapData { public: GMAPData(const QString &fileName); - ~GMAPData(); private: bool readXML(const QString &path, QString &dataDir, QString &typFile); - void mapProduct(QXmlStreamReader &reader, QString &dataDir, QString &typFile); + void mapProduct(QXmlStreamReader &reader, QString &dataDir, + QString &typFile); void subProduct(QXmlStreamReader &reader, QString &dataDir); bool loadTile(const QDir &dir); - - QList _files; }; } diff --git a/src/map/IMG/imgdata.cpp b/src/map/IMG/imgdata.cpp index 41ea1a4e..a14cebad 100644 --- a/src/map/IMG/imgdata.cpp +++ b/src/map/IMG/imgdata.cpp @@ -117,8 +117,7 @@ bool IMGData::readFAT(QFile *file, TileMap &tileMap) } else tile = *it; - SubFile *subFile = part ? tile->file(tt) - : tile->addFile(this, tt); + SubFile *subFile = part ? tile->file(tt) : tile->addFile(this, tt); if (!(subFile && readSubFileBlocks(file, offset, subFile))) return false; } else if (tt == SubFile::TYP) { diff --git a/src/map/IMG/lblfile.h b/src/map/IMG/lblfile.h index 5f866732..0ee5b6d3 100644 --- a/src/map/IMG/lblfile.h +++ b/src/map/IMG/lblfile.h @@ -18,7 +18,7 @@ public: LBLFile(const IMGData *img) : SubFile(img), _huffmanText(0), _imgIdSize(0), _poiShift(0), _shift(0), _encoding(0) {} - LBLFile(const QString *path) + LBLFile(const QString &path) : SubFile(path), _huffmanText(0), _imgIdSize(0), _poiShift(0), _shift(0), _encoding(0) {} LBLFile(const SubFile *gmp, quint32 offset) diff --git a/src/map/IMG/mapdata.cpp b/src/map/IMG/mapdata.cpp index 68c031a5..aa412c94 100644 --- a/src/map/IMG/mapdata.cpp +++ b/src/map/IMG/mapdata.cpp @@ -99,14 +99,14 @@ void MapData::load(qreal ratio) Q_ASSERT(!_style); if (_typ) - _style = new Style(0, ratio, _typ); + _style = new Style(ratio, _typ); else { QString typFile(ProgramPaths::typFile()); if (QFileInfo::exists(typFile)) { - SubFile typ(&typFile); - _style = new Style(0, ratio, &typ); + SubFile typ(typFile); + _style = new Style(ratio, &typ); } else - _style = new Style(0, ratio); + _style = new Style(ratio); } } diff --git a/src/map/IMG/netfile.h b/src/map/IMG/netfile.h index bf63a0de..7f0c191a 100644 --- a/src/map/IMG/netfile.h +++ b/src/map/IMG/netfile.h @@ -18,7 +18,7 @@ class NETFile : public SubFile public: NETFile(const IMGData *img) : SubFile(img), _huffmanTable(0), _tp(0), _netShift(0), _linksShift(0) {} - NETFile(const QString *path) + NETFile(const QString &path) : SubFile(path), _huffmanTable(0), _tp(0), _netShift(0), _linksShift(0) {} NETFile(const SubFile *gmp, quint32 offset) : SubFile(gmp, offset), _huffmanTable(0), _tp(0), _netShift(0), diff --git a/src/map/IMG/nodfile.h b/src/map/IMG/nodfile.h index 227b3223..dcdf8b53 100644 --- a/src/map/IMG/nodfile.h +++ b/src/map/IMG/nodfile.h @@ -62,7 +62,7 @@ public: NODFile(const IMGData *img) : SubFile(img), _indexFlags(0), _indexRecordSize(0), _blockRecordSize(0), _blockShift(0), _nodeShift(0), _indexIdSize(0) {} - NODFile(const QString *path) + NODFile(const QString &path) : SubFile(path), _indexFlags(0), _indexRecordSize(0), _blockRecordSize(0), _blockShift(0), _nodeShift(0), _indexIdSize(0) {} NODFile(const SubFile *gmp, quint32 offset) diff --git a/src/map/IMG/rastertile.cpp b/src/map/IMG/rastertile.cpp index 5476f880..9fa0ab41 100644 --- a/src/map/IMG/rastertile.cpp +++ b/src/map/IMG/rastertile.cpp @@ -152,7 +152,7 @@ void RasterTile::drawPolygons(QPainter *painter, bool insert = false; SubFile::Handle *hdl = hc.object(poly.raster.lbl()); if (!hdl) { - hdl = new SubFile::Handle(_file, poly.raster.lbl()); + hdl = new SubFile::Handle(poly.raster.lbl(), _file); insert = true; } QPixmap pm(poly.raster.lbl()->image(*hdl, poly.raster.id())); diff --git a/src/map/IMG/rgnfile.h b/src/map/IMG/rgnfile.h index 7b574e93..7040250c 100644 --- a/src/map/IMG/rgnfile.h +++ b/src/map/IMG/rgnfile.h @@ -24,7 +24,7 @@ public: }; RGNFile(const IMGData *img) : SubFile(img), _huffmanTable(0) {} - RGNFile(const QString *path) : SubFile(path), _huffmanTable(0) {} + RGNFile(const QString &path) : SubFile(path), _huffmanTable(0) {} RGNFile(const SubFile *gmp, quint32 offset) : SubFile(gmp, offset), _huffmanTable(0) {} ~RGNFile(); diff --git a/src/map/IMG/style.cpp b/src/map/IMG/style.cpp index 6e56e81a..02a19acd 100644 --- a/src/map/IMG/style.cpp +++ b/src/map/IMG/style.cpp @@ -1268,9 +1268,9 @@ bool Style::parseDrawOrder(SubFile *file, SubFile::Handle &hdl, return true; } -bool Style::parseTYPFile(QFile *file, SubFile *typ) +bool Style::parseTYPFile(SubFile *typ) { - SubFile::Handle hdl(file, typ); + SubFile::Handle hdl(typ); Section points, lines, polygons, order; quint16 tmp16, codepage; @@ -1311,7 +1311,7 @@ bool Style::parseTYPFile(QFile *file, SubFile *typ) return true; } -Style::Style(QFile *file, qreal ratio, SubFile *typ) +Style::Style(qreal ratio, SubFile *typ) { _large = pixelSizeFont(16); _normal = pixelSizeFont(14); @@ -1326,7 +1326,7 @@ Style::Style(QFile *file, qreal ratio, SubFile *typ) defaultPointStyle(ratio); if (typ) - parseTYPFile(file, typ); + parseTYPFile(typ); } const Style::Line &Style::line(quint32 type) const diff --git a/src/map/IMG/style.h b/src/map/IMG/style.h index 1374083c..d08c70c1 100644 --- a/src/map/IMG/style.h +++ b/src/map/IMG/style.h @@ -104,7 +104,7 @@ public: }; - Style(QFile *file, qreal ratio, SubFile *typ = 0); + Style(qreal ratio, SubFile *typ = 0); const Line &line(quint32 type) const; const Polygon &polygon(quint32 type) const; @@ -171,7 +171,7 @@ private: bool extended; }; - bool parseTYPFile(QFile *file, SubFile *typ); + bool parseTYPFile(SubFile *typ); bool parsePoints(SubFile *file, SubFile::Handle &hdl, const Section §ion); bool parsePoint(SubFile *file, SubFile::Handle &hdl, diff --git a/src/map/IMG/subfile.h b/src/map/IMG/subfile.h index 762a6ecc..ea868492 100644 --- a/src/map/IMG/subfile.h +++ b/src/map/IMG/subfile.h @@ -18,7 +18,7 @@ public: class Handle { public: - Handle(QFile *file, const SubFile *subFile) + Handle(const SubFile *subFile, QFile *file = 0) : _file(file), _blockNum(-1), _blockPos(-1), _pos(-1), _delete(false) { if (!subFile) @@ -53,13 +53,18 @@ public: SubFile(const IMGData *img) : _gmpOffset(0), _img(img), _blocks(new QVector()), _path(0) {} SubFile(const SubFile *gmp, quint32 offset) : _gmpOffset(offset), - _img(gmp->_img), _blocks(gmp->_blocks), _path(gmp->_path) {} - SubFile(const QString *path) - : _gmpOffset(0), _img(0), _blocks(0), _path(path) {} + _img(gmp->_img), _blocks(gmp->_blocks), _path(gmp->_path) + { + Q_ASSERT(offset); + } + SubFile(const QString &path) + : _gmpOffset(0), _img(0), _blocks(0), _path(new QString(path)) {} ~SubFile() { - if (!_gmpOffset) + if (!_gmpOffset) { delete _blocks; + delete _path; + } } void addBlock(quint16 block) {_blocks->append(block);} diff --git a/src/map/IMG/trefile.cpp b/src/map/IMG/trefile.cpp index 959a6545..6b736f16 100644 --- a/src/map/IMG/trefile.cpp +++ b/src/map/IMG/trefile.cpp @@ -51,7 +51,7 @@ TREFile::~TREFile() bool TREFile::init(QFile *file) { - Handle hdl(file, this); + Handle hdl(this, file); quint8 locked, levels[64]; quint16 hdrLen; qint32 north, east, south, west; @@ -156,7 +156,7 @@ int TREFile::readExtEntry(Handle &hdl, quint32 &polygons, quint32 &lines, bool TREFile::load(QFile *file, int idx) { - Handle hdl(file, this); + Handle hdl(this, file); QList sl; SubDiv *s = 0; SubDivTree *tree = new SubDivTree(); diff --git a/src/map/IMG/trefile.h b/src/map/IMG/trefile.h index c309f365..58e235c0 100644 --- a/src/map/IMG/trefile.h +++ b/src/map/IMG/trefile.h @@ -18,7 +18,7 @@ class TREFile : public SubFile public: TREFile(const IMGData *img) : SubFile(img), _flags(0), _extItemSize(0) {} - TREFile(const QString *path) + TREFile(const QString &path) : SubFile(path), _flags(0), _extItemSize(0) {} TREFile(const SubFile *gmp, quint32 offset) : SubFile(gmp, offset), _flags(0), _extItemSize(0) {} diff --git a/src/map/IMG/vectortile.cpp b/src/map/IMG/vectortile.cpp index 18682338..d46dbd41 100644 --- a/src/map/IMG/vectortile.cpp +++ b/src/map/IMG/vectortile.cpp @@ -53,9 +53,12 @@ bool VectorTile::init(QFile *file) bool VectorTile::initGMP(QFile *file) { - SubFile::Handle hdl(file, _gmp); + SubFile::Handle hdl(_gmp, file); quint32 tre, rgn, lbl, net, nod, dem; + if (_tre || _rgn || _lbl || _net || _nod || _dem) + return false; + if (!(_gmp->seek(hdl, 0x19) && _gmp->readUInt32(hdl, tre) && _gmp->readUInt32(hdl, rgn) && _gmp->readUInt32(hdl, lbl) && _gmp->readUInt32(hdl, net) && _gmp->readUInt32(hdl, nod) @@ -133,10 +136,10 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom, } if (!_loaded) { - rgnHdl = new SubFile::Handle(file, _rgn); - lblHdl = new SubFile::Handle(file, _lbl); - netHdl = new SubFile::Handle(file, _net); - nodHdl = new SubFile::Handle(file, _nod); + rgnHdl = new SubFile::Handle(_rgn, file); + lblHdl = new SubFile::Handle(_lbl, file); + netHdl = new SubFile::Handle(_net, file); + nodHdl = new SubFile::Handle(_nod, file); if (!load(*rgnHdl, *lblHdl, *netHdl, *nodHdl)) { _lock.unlock(); @@ -159,9 +162,9 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom, quint32 shift = _tre->shift(subdiv->bits()); if (!rgnHdl) { - rgnHdl = new SubFile::Handle(file, _rgn); - lblHdl = new SubFile::Handle(file, _lbl); - netHdl = new SubFile::Handle(file, _net); + rgnHdl = new SubFile::Handle(_rgn, file); + lblHdl = new SubFile::Handle(_lbl, file); + netHdl = new SubFile::Handle(_net, file); } if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv)) { @@ -182,9 +185,9 @@ void VectorTile::polys(QFile *file, const RectC &rect, const Zoom &zoom, if (_net && _net->hasLinks()) { if (!nodHdl) - nodHdl = new SubFile::Handle(file, _nod); + nodHdl = new SubFile::Handle(_nod, file); if (!nodHdl2) - nodHdl2 = new SubFile::Handle(file, _nod); + nodHdl2 = new SubFile::Handle(_nod, file); _rgn->links(*rgnHdl, subdiv, shift, _net, *netHdl, _nod, *nodHdl, *nodHdl2, _lbl, *lblHdl, &polys->lines); } @@ -221,10 +224,10 @@ void VectorTile::points(QFile *file, const RectC &rect, const Zoom &zoom, } if (!_loaded) { - rgnHdl = new SubFile::Handle(file, _rgn); - lblHdl = new SubFile::Handle(file, _lbl); - SubFile::Handle nodHdl(file, _nod); - SubFile::Handle netHdl(file, _net); + rgnHdl = new SubFile::Handle(_rgn, file); + lblHdl = new SubFile::Handle(_lbl, file); + SubFile::Handle nodHdl(_nod, file); + SubFile::Handle netHdl(_net, file); if (!load(*rgnHdl, *lblHdl, netHdl, nodHdl)) { _lock.unlock(); @@ -245,8 +248,8 @@ void VectorTile::points(QFile *file, const RectC &rect, const Zoom &zoom, cacheLock->unlock(); if (!rgnHdl) { - rgnHdl = new SubFile::Handle(file, _rgn); - lblHdl = new SubFile::Handle(file, _lbl); + rgnHdl = new SubFile::Handle(_rgn, file); + lblHdl = new SubFile::Handle(_lbl, file); } if (!subdiv->initialized() && !_rgn->subdivInit(*rgnHdl, subdiv)) { @@ -290,7 +293,7 @@ void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom, } if (!_demLoaded) { - hdl = new SubFile::Handle(file, _dem); + hdl = new SubFile::Handle(_dem, file); if (!loadDem(*hdl)) { _demLock.unlock(); @@ -315,7 +318,7 @@ void VectorTile::elevations(QFile *file, const RectC &rect, const Zoom &zoom, cacheLock->unlock(); if (!hdl) - hdl = new SubFile::Handle(file, _dem); + hdl = new SubFile::Handle(_dem, file); el = _dem->elevations(*hdl, level, tile); if (!el->m.isNull()) diff --git a/src/map/IMG/vectortile.h b/src/map/IMG/vectortile.h index a4e8bc3b..10184d6f 100644 --- a/src/map/IMG/vectortile.h +++ b/src/map/IMG/vectortile.h @@ -21,7 +21,7 @@ public: delete _dem; delete _gmp; } - bool init(QFile *file); + bool init(QFile *file = 0); void clear(); const RectC &bounds() const {return _tre->bounds();} @@ -49,25 +49,37 @@ public: } template - SubFile *addFile(T *container, SubFile::Type type) + SubFile *addFile(T container, SubFile::Type type) { switch (type) { case SubFile::TRE: + if (_tre) + return 0; _tre = new TREFile(container); return _tre; case SubFile::RGN: + if (_rgn) + return 0; _rgn = new RGNFile(container); return _rgn; case SubFile::LBL: + if (_lbl) + return 0; _lbl = new LBLFile(container); return _lbl; case SubFile::NET: + if (_net) + return 0; _net = new NETFile(container); return _net; case SubFile::NOD: + if (_nod) + return 0; _nod = new NODFile(container); return _nod; case SubFile::DEM: + if (_dem) + return 0; _dem = new DEMFile(container); return _dem; case SubFile::GMP: