/* * Copyright (C) 2007 Steve Ratcliffe * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License 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. * * * Author: Steve Ratcliffe * Create date: 23-Sep-2007 */ package uk.me.parabola.tdbfmt; import java.io.IOException; import uk.me.parabola.io.StructuredInputStream; import uk.me.parabola.io.StructuredOutputStream; /** * Details of a single .img file that is part of the map set. There will be * one of these for each .img file. * * @author Steve Ratcliffe */ public class DetailMapBlock extends OverviewMapBlock { public static final int BLOCK_ID = 0x4c; private int tdbVersion; private String innername; // Sizes of the regions. It is possible that rgn and tre are reversed? private int rgnDataSize; private int treDataSize; private int lblDataSize; private int netDataSize; private int nodDataSize; public DetailMapBlock(int tdbVersion) { super(BLOCK_ID); assert tdbVersion > 0; this.tdbVersion = tdbVersion; } /** * Initialise this block from the raw block given. * * @throws IOException For io problems. */ public DetailMapBlock(StructuredInputStream ds) throws IOException { super(ds); // First there are a couple of fields that we ignore. int junk = ds.read2(); assert junk == 4; junk = ds.read2(); assert junk == 3; // Sizes of the data rgnDataSize = ds.read4(); treDataSize = ds.read4(); lblDataSize = ds.read4(); // Another ignored field junk = ds.read(); assert junk == 1; } /** * Write into the given block. * * @throws IOException Problems writing, probably can't really happen as * we use an array backed stream. */ public void writeBody(StructuredOutputStream os) throws IOException { super.writeBody(os); int n = 3; if (tdbVersion >= TdbFile.TDB_V407) { if (netDataSize > 0) n++; if (nodDataSize > 0) n++; } os.write2(n+1); os.write2(n); os.write4(treDataSize); os.write4(rgnDataSize); os.write4(lblDataSize); if (tdbVersion >= TdbFile.TDB_V407) { if (n > 3) os.write4(netDataSize); if (n > 4) os.write4(nodDataSize); //01 c3 00 ff os.write4(0xff00c301); os.write(0); os.write(0); os.write(0); String mn = getInnername(); os.writeString(mn + ".TRE"); os.writeString(mn + ".RGN"); os.writeString(mn + ".LBL"); if (n > 3) os.writeString(mn + ".NET"); if (n > 4) os.writeString(mn + ".NOD"); } else { os.write(1); } } private String getInnername() { return innername; } public void setInnername(String innername) { this.innername = innername; } public void setRgnDataSize(int rgnDataSize) { this.rgnDataSize = rgnDataSize; } public void setTreDataSize(int treDataSize) { this.treDataSize = treDataSize; } public void setLblDataSize(int lblDataSize) { this.lblDataSize = lblDataSize; } public void setNetDataSize(int netDataSize) { this.netDataSize = netDataSize; } public void setNodDataSize(int nodDataSize) { this.nodDataSize = nodDataSize; } public String toString() { return super.toString() + ", rgn size=" + rgnDataSize + ", tre size=" + treDataSize + ", lbl size" + lblDataSize ; } }