mirror of
https://github.com/tumic0/GPXSee.git
synced 2025-02-26 04:00:49 +01:00
Fixed/improved header parsing
This commit is contained in:
parent
94f03670ef
commit
914b730a21
@ -2,6 +2,7 @@
|
|||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
#include <QPixmapCache>
|
#include <QPixmapCache>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include "common/util.h"
|
||||||
#include "common/color.h"
|
#include "common/color.h"
|
||||||
#include "qctmap.h"
|
#include "qctmap.h"
|
||||||
|
|
||||||
@ -198,27 +199,50 @@ static bool readString(QDataStream &stream, quint32 offset, QString &str)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QCTMap::readHeader(QDataStream &stream)
|
bool QCTMap::readName(QDataStream &stream)
|
||||||
{
|
{
|
||||||
quint32 version, title, ext, shift;
|
quint32 title, name;
|
||||||
|
|
||||||
stream >> version >> _cols >> _rows >> title;
|
stream >> title >> name;
|
||||||
if (stream.status() != QDataStream::Ok)
|
if (stream.status() != QDataStream::Ok)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!readString(stream, title, _name))
|
if (name) {
|
||||||
return false;
|
if (!readString(stream, name, _name))
|
||||||
|
return false;
|
||||||
|
} else if (title) {
|
||||||
|
if (!readString(stream, title, _name))
|
||||||
|
return false;
|
||||||
|
} else
|
||||||
|
_name = Util::file2name(path());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QCTMap::readSize(QDataStream &stream)
|
||||||
|
{
|
||||||
|
stream >> _cols >> _rows;
|
||||||
|
return (stream.status() == QDataStream::Ok);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QCTMap::readDatumShift(QDataStream &stream)
|
||||||
|
{
|
||||||
|
quint32 ext, shift;
|
||||||
|
|
||||||
if (!stream.device()->seek(0x54))
|
if (!stream.device()->seek(0x54))
|
||||||
return false;
|
return false;
|
||||||
stream >> ext;
|
stream >> ext;
|
||||||
if (stream.status() != QDataStream::Ok)
|
if (stream.status() != QDataStream::Ok)
|
||||||
return false;
|
return false;
|
||||||
|
if (!ext)
|
||||||
|
return true;
|
||||||
if (!stream.device()->seek(ext + 4))
|
if (!stream.device()->seek(ext + 4))
|
||||||
return false;
|
return false;
|
||||||
stream >> shift;
|
stream >> shift;
|
||||||
if (stream.status() != QDataStream::Ok)
|
if (stream.status() != QDataStream::Ok)
|
||||||
return false;
|
return false;
|
||||||
|
if (!shift)
|
||||||
|
return true;
|
||||||
if (!stream.device()->seek(shift))
|
if (!stream.device()->seek(shift))
|
||||||
return false;
|
return false;
|
||||||
stream >> _shiftN >> _shiftE;
|
stream >> _shiftN >> _shiftE;
|
||||||
@ -226,6 +250,35 @@ bool QCTMap::readHeader(QDataStream &stream)
|
|||||||
return (stream.status() == QDataStream::Ok);
|
return (stream.status() == QDataStream::Ok);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QCTMap::readHeader(QDataStream &stream)
|
||||||
|
{
|
||||||
|
quint32 magic, version;
|
||||||
|
stream >> magic >> version;
|
||||||
|
|
||||||
|
if (stream.status() != QDataStream::Ok || magic != MAGIC) {
|
||||||
|
_errorString = "Not a QCT map";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (version == 0x20000001) {
|
||||||
|
_errorString = "QC3 files not supported";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!readSize(stream)) {
|
||||||
|
_errorString = "Error reading map dimensions";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!readName(stream)) {
|
||||||
|
_errorString = "Error reading map name";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!readDatumShift(stream)) {
|
||||||
|
_errorString = "Error reading datum shift";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool QCTMap::readGeoRef(QDataStream &stream)
|
bool QCTMap::readGeoRef(QDataStream &stream)
|
||||||
{
|
{
|
||||||
if (!stream.device()->seek(0x60))
|
if (!stream.device()->seek(0x60))
|
||||||
@ -270,7 +323,8 @@ bool QCTMap::readIndex(QDataStream &stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QCTMap::QCTMap(const QString &fileName, QObject *parent)
|
QCTMap::QCTMap(const QString &fileName, QObject *parent)
|
||||||
: Map(fileName, parent), _file(fileName), _mapRatio(1.0), _valid(false)
|
: Map(fileName, parent), _file(fileName), _shiftE(0), _shiftN(0),
|
||||||
|
_mapRatio(1.0), _valid(false)
|
||||||
{
|
{
|
||||||
if (!_file.open(QIODevice::ReadOnly)) {
|
if (!_file.open(QIODevice::ReadOnly)) {
|
||||||
_errorString = fileName + ": " + _file.errorString();
|
_errorString = fileName + ": " + _file.errorString();
|
||||||
@ -279,17 +333,9 @@ QCTMap::QCTMap(const QString &fileName, QObject *parent)
|
|||||||
|
|
||||||
QDataStream stream(&_file);
|
QDataStream stream(&_file);
|
||||||
stream.setByteOrder(QDataStream::LittleEndian);
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
quint32 magic;
|
|
||||||
|
|
||||||
stream >> magic;
|
if (!readHeader(stream))
|
||||||
if (magic != MAGIC) {
|
|
||||||
_errorString = "Not a QCT map";
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
if (!readHeader(stream)) {
|
|
||||||
_errorString = "Error reading QCT header";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!readGeoRef(stream)) {
|
if (!readGeoRef(stream)) {
|
||||||
_errorString = "Error reading georeference info";
|
_errorString = "Error reading georeference info";
|
||||||
return;
|
return;
|
||||||
|
@ -31,6 +31,9 @@ public:
|
|||||||
QString errorString() const {return _errorString;}
|
QString errorString() const {return _errorString;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool readName(QDataStream &stream);
|
||||||
|
bool readSize(QDataStream &stream);
|
||||||
|
bool readDatumShift(QDataStream &stream);
|
||||||
bool readHeader(QDataStream &stream);
|
bool readHeader(QDataStream &stream);
|
||||||
bool readGeoRef(QDataStream &stream);
|
bool readGeoRef(QDataStream &stream);
|
||||||
bool readIndex(QDataStream &stream);
|
bool readIndex(QDataStream &stream);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user