Attached is a patch which fixes reproducible crashes when loading Garmin (tdb/img) files on Big Endian platforms. Tested on Linux/PowerPC (Ubuntu Karmic) with a self-crafted OSM map with only two img's, and with the free Topo Lusitania map.
Best, Albrecht.
Index: src/CGarminTile.cpp =================================================================== --- src/CGarminTile.cpp (Revision 1843) +++ src/CGarminTile.cpp (Arbeitskopie) @@ -241,7 +241,7 @@ void CGarminTile::readSubfileBasics(subfile_desc_t readFile(file, subfile.parts["TRE"].offset, sizeof(hdr_tre_t), trehdr); hdr_tre_t * pTreHdr = (hdr_tre_t * )trehdr.data(); - subfile.isTransparent = pTreHdr->POI_flags & 0x0002; + subfile.isTransparent = pTreHdr->POI_flags & 0x02; transparent = subfile.isTransparent ? true : transparent; #ifdef DEBUG_SHOW_TRE_DATA @@ -445,12 +445,12 @@ void CGarminTile::readSubfileBasics(subfile_desc_t subdiv_prev = subdiv; ++pSubDivL; ++subdiv; } - subdivs.last().rgn_end = pRgnHdr->hdr_rgn_t::length; + subdivs.last().rgn_end = gar_load(uint32_t, pRgnHdr->hdr_rgn_t::length); // read extended NT elements // qDebug() << "yyy" << gar_load(uint32_t, pTreHdr->tre7_rec_size); - if((pTreHdr->hdr_subfile_part_t::length >= 0x9A) && pTreHdr->tre7_size && (gar_load(uint32_t, pTreHdr->tre7_rec_size) >= sizeof(tre_subdiv2_t))) { + if((gar_load(uint16_t, pTreHdr->hdr_subfile_part_t::length) >= 0x9A) && pTreHdr->tre7_size && (gar_load(uint32_t, pTreHdr->tre7_rec_size) >= sizeof(tre_subdiv2_t))) { rgnoff = subfile.parts["RGN"].offset; // qDebug() << subdivs.count() << (pTreHdr->tre7_size / pTreHdr->tre7_rec_size) << pTreHdr->tre7_rec_size; @@ -478,7 +478,7 @@ void CGarminTile::readSubfileBasics(subfile_desc_t subdiv->offsetPoints2 = skipPois ? 0 : gar_load(uint32_t, pSubDiv2->offsetPoints) + rgnOffPoint2; ++subdiv; - pSubDiv2 = reinterpret_cast<tre_subdiv2_t*>((quint8*)pSubDiv2 + pTreHdr->tre7_rec_size); + pSubDiv2 = reinterpret_cast<tre_subdiv2_t*>((quint8*)pSubDiv2 + gar_endian(uint16_t, pTreHdr->tre7_rec_size)); while(subdiv != subdivs.end()) { @@ -499,7 +499,7 @@ void CGarminTile::readSubfileBasics(subfile_desc_t subdiv_prev = subdiv; ++subdiv; - pSubDiv2 = reinterpret_cast<tre_subdiv2_t*>((quint8*)pSubDiv2 + pTreHdr->tre7_rec_size); + pSubDiv2 = reinterpret_cast<tre_subdiv2_t*>((quint8*)pSubDiv2 + gar_endian(uint16_t, pTreHdr->tre7_rec_size)); } subdiv_prev->lengthPolygons2 = rgnOffPolyg2 + rgnLenPolyg2 - subdiv_prev->offsetPolygons2; Index: src/CMapTDB.cpp =================================================================== --- src/CMapTDB.cpp (Revision 1843) +++ src/CMapTDB.cpp (Arbeitskopie) @@ -753,10 +753,6 @@ bool CMapTDB::eventFilter(QObject * watched, QEven void CMapTDB::readTDB(const QString& filename) { -#ifdef HAVE_BIGENDIAN - QMessageBox::warning(0,tr("No big endian.."),tr("*tdb import has not been ported to big endian architectures, yet."),QMessageBox::Abort,QMessageBox::Abort); - return; -#endif QByteArray data; QFile file(filename); QFileInfo finfo(filename);
pgpb4VBdVhrYr.pgp
Description: PGP signature
------------------------------------------------------------------------------ This SF.Net email is sponsored by the Verizon Developer Community Take advantage of Verizon's best-in-class app development support A streamlined, 14 day to market process makes app distribution fast and easy Join now and get one step closer to millions of Verizon customers http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________ QLandkarte-users mailing list QLandkarte-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/qlandkarte-users