/* * 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.ArrayList; import java.util.List; import uk.me.parabola.imgfmt.app.ImgFileWriter; import uk.me.parabola.imgfmt.app.lbl.Zip; import uk.me.parabola.imgfmt.app.srt.SortKey; /** * Section containing zip codes. * * We need: map number, zip index in map, pointer into MDR 15 for the string name. * * @author WanMil */ public class Mdr6 extends MdrMapSection { private final List<Mdr6Record> zips = new ArrayList<>(); public Mdr6(MdrConfig config) { setConfig(config); } public void addZip(int mapIndex, Zip zip, int strOff) { Mdr6Record record = new Mdr6Record(zip); record.setMapIndex(mapIndex); record.setStringOffset(strOff); zips.add(record); } public void writeSectData(ImgFileWriter writer) { int zipSize = getSizes().getZipSize(); List<SortKey<Mdr6Record>> sortKeys = MdrUtils.sortList(getConfig().getSort(), zips); boolean hasString = hasFlag(0x4); int record = 1; for (SortKey<Mdr6Record> key : sortKeys) { Mdr6Record z = key.getObject(); addIndexPointer(z.getMapIndex(), record++); putMapIndex(writer, z.getMapIndex()); putN(writer, zipSize, z.getZipIndex()); if (hasString) putStringOffset(writer, z.getStringOffset()); } } /** * Enough bytes to represent the map number * and the zip index and the string offset. * @return The size of a record in this section. */ public int getItemSize() { PointerSizes sizes = getSizes(); int size = sizes.getMapSize() + sizes.getZipSize(); if (hasFlag(0x4)) size += sizes.getStrOffSize(); return size; } protected int numberOfItems() { return zips.size(); } /** * Known structure: * bits 0-1: size of local zip index - 1 (all values appear to work) * bits 2: if MDR 15 available * @return The value to be placed in the header. */ public int getExtraValue() { return ((getSizes().getZipSize()-1)&0x03) | (isForDevice() ? 0 : 0x04); } }