protected void readTransportIndex(TransportIndex ind) throws IOException {
   while (true) {
     int t = codedIS.readTag();
     int tag = WireFormat.getTagFieldNumber(t);
     switch (tag) {
       case 0:
         return;
       case OsmandOdb.OsmAndTransportIndex.ROUTES_FIELD_NUMBER:
         skipUnknownField(t);
         break;
       case OsmandOdb.OsmAndTransportIndex.NAME_FIELD_NUMBER:
         ind.setName(codedIS.readString());
         break;
       case OsmandOdb.OsmAndTransportIndex.STOPS_FIELD_NUMBER:
         ind.stopsFileLength = readInt();
         ind.stopsFileOffset = codedIS.getTotalBytesRead();
         int old = codedIS.pushLimit(ind.stopsFileLength);
         readTransportBounds(ind);
         codedIS.popLimit(old);
         break;
       case OsmandOdb.OsmAndTransportIndex.STRINGTABLE_FIELD_NUMBER:
         IndexStringTable st = new IndexStringTable();
         st.length = codedIS.readRawVarint32();
         st.fileOffset = codedIS.getTotalBytesRead();
         readStringTable(st, 0, 20, true);
         ind.stringTable = st;
         codedIS.seek(st.length + st.fileOffset);
         break;
       default:
         skipUnknownField(t);
         break;
     }
   }
 }
 private void readTransportBounds(TransportIndex ind) throws IOException {
   while (true) {
     int t = codedIS.readTag();
     int tag = WireFormat.getTagFieldNumber(t);
     switch (tag) {
       case 0:
         return;
       case OsmandOdb.TransportStopsTree.LEFT_FIELD_NUMBER:
         ind.left = codedIS.readSInt32();
         break;
       case OsmandOdb.TransportStopsTree.RIGHT_FIELD_NUMBER:
         ind.right = codedIS.readSInt32();
         break;
       case OsmandOdb.TransportStopsTree.TOP_FIELD_NUMBER:
         ind.top = codedIS.readSInt32();
         break;
       case OsmandOdb.TransportStopsTree.BOTTOM_FIELD_NUMBER:
         ind.bottom = codedIS.readSInt32();
         break;
       default:
         skipUnknownField(t);
         break;
     }
   }
 }