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);

Attachment: 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

Reply via email to