/* * Copyright (C) 2011. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 or * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ package uk.me.parabola.imgfmt.app.mdr; import java.util.List; import uk.me.parabola.imgfmt.app.ImgFileWriter; /** * Name indexes consisting of a prefix of the string and the record * number at which that prefix first occurs. So it is like 8 and 12 * except that they are all combined together in this one section. * * @author Steve Ratcliffe */ public class Mdr17 extends MdrSection { private PrefixIndex streets; private PrefixIndex streetsByCountry; private PrefixIndex cities; private PrefixIndex pois; public Mdr17(MdrConfig config) { setConfig(config); streets = new PrefixIndex(getConfig(), 4); streetsByCountry = new PrefixIndex(getConfig(), 4); cities = new PrefixIndex(getConfig(), 2); pois = new PrefixIndex(getConfig(), 4); } public void writeSectData(ImgFileWriter writer) { writeSubSect(writer, streets); writeSubSect(writer, cities); writeSubSect(writer, streetsByCountry); writeSubSect(writer, pois); } /** * Write one of the subsections that makes up the section. They are all similar and * have a header with the length and the record size and prefix length of the * records in the subsection. */ private void writeSubSect(ImgFileWriter writer, PrefixIndex index) { index.preWrite(); int len = index.getItemSize() * index.getNumberOfItems() + 2; if (len == 2) return; // nothing to do // The length is a variable length integer with the length indicated by a suffix. len = (len << 1) + 1; int mask = ~0xff; int count = 1; while ((len & mask) != 0) { mask <<= 8; len <<= 1; count++; } putN(writer, count, len); // Calculate the header. This code is unlikely to survive the finding of another example! // Have no idea what the real thinking behind this is. int prefixLength = index.getPrefixLength(); int header = (prefixLength - 1) << 8; header += (prefixLength + 1) * (prefixLength + 1); header += (index.getItemSize() - prefixLength - 1) * 0xa; writer.putChar((char) header); index.writeSectData(writer); } protected void releaseMemory() { streets = null; cities = null; streetsByCountry = null; pois = null; } public void addStreets(List<Mdr7Record> streetList) { streets.createFromList(streetList); } public void addCities(List<Mdr5Record> cityList) { cities.createFromList(cityList); } public void addStreetsByCountry(List<Mdr7Record> streets) { streetsByCountry.createFromList(streets, true); } public void addPois(List<Mdr11Record> poiList) { pois.createFromList(poiList); } public int getItemSize() { return 0; } protected int numberOfItems() { return 0; } }