vsi_l_offset GTM::findFirstTrackOffset() { if (firstTrackpointOffset == 0) { firstTrackpointOffset = findFirstTrackpointOffset(); if (firstTrackpointOffset == 0) return 0; } /* First track offset is the first trackpoint offset plus number of trackpoints time size of a trackpoint*/ return firstTrackpointOffset + static_cast<vsi_l_offset>(ntcks) * 25; }
vsi_l_offset GTM::findFirstTrackOffset() { if (firstTrackpointOffset == 0) { firstTrackpointOffset = findFirstTrackpointOffset(); if (firstTrackpointOffset == 0) return 0; } /* First track offset is the first trackpoint offset plus number of trackpoints time size of a trackpoint*/ return (vsi_l_offset) (firstTrackpointOffset + ntcks * 25); }
bool GTM::readHeaderNumbers() { if (pGTMFile == nullptr) return false; /* I'm supposing that the user has already checked if the file is valid. */ /* Also, I'm ignoring some header parameters that are unnecessary for my purpose. If you want more features, implement it. :-P */ /* Read Number of Waypoint Styles*/ /* Seek file */ if (VSIFSeekL(pGTMFile, NWPTSTYLES_OFFSET, SEEK_SET) != 0) return false; /* Read nwptstyles */ nwptstyles = readInt(pGTMFile); if (nwptstyles < 0) return false; /* Read Number of Waypoints */ /* Seek file */ if ( VSIFSeekL(pGTMFile, NWPTS_OFFSET, SEEK_SET) != 0) return false; /* Read nwpts */ nwpts = readInt(pGTMFile); if (nwpts < 0) return false; /* Read Number of Trackpoints */ ntcks = readInt(pGTMFile); if (ntcks < 0) return false; /* Read Number of images */ /* Seek file */ if ( VSIFSeekL(pGTMFile, NMAPS_OFFSET, SEEK_SET) != 0) return false; /* read n_maps */ n_maps = readInt(pGTMFile); if (n_maps < 0) return false; /* Read Number of Tracks */ n_tk = readInt(pGTMFile); if (n_tk < 0) return false; /* Figure out the header size */ headerSize = 99; // Constant size plus size of strings /* Read gradfont string size */ if ( VSIFSeekL(pGTMFile, 99, SEEK_SET) != 0) return false; unsigned short stringSize = readUShort(pGTMFile); headerSize += stringSize + 2; // String + size field /* Read labelfont string size */ if ( VSIFSeekL(pGTMFile, stringSize, SEEK_CUR) != 0) return false; stringSize = readUShort(pGTMFile); headerSize += stringSize + 2; // String + size field /* Read userfont string size */ if ( VSIFSeekL(pGTMFile, stringSize, SEEK_CUR) != 0) return false; stringSize = readUShort(pGTMFile); headerSize += stringSize + 2; // String + size field /* Read newdatum string size */ if ( VSIFSeekL(pGTMFile, stringSize, SEEK_CUR) != 0) return false; stringSize = readUShort(pGTMFile); headerSize += stringSize + 2; // String + size field /* -------------------------------------------------------------------- */ /* Checks if it is using WGS84 datum */ /* -------------------------------------------------------------------- */ /* Read newdatum string size */ if ( VSIFSeekL(pGTMFile, headerSize + 34, SEEK_SET) != 0) return false; if (readInt(pGTMFile) != 217) { CPLError( CE_Warning, CPLE_AppDefined, "You are attempting to open a file that is not using " "WGS84 datum.\n" "Coordinates will be returned as if they were WGS84, " "but no reprojection will be done." ); } /* Look for the offsets */ /* Waypoints */ firstWaypointOffset = findFirstWaypointOffset(); if (firstWaypointOffset == 0) return false; actualWaypointOffset = firstWaypointOffset; /* Trackpoints */ firstTrackpointOffset = findFirstTrackpointOffset(); if (firstTrackpointOffset == 0) return false; actualTrackpointOffset = firstTrackpointOffset; /* Tracks */ firstTrackOffset = findFirstTrackOffset(); if (firstTrackOffset == 0) return false; actualTrackOffset = firstTrackOffset; return true; }