// ********************************************************************** // // <copyright> // // BBN Technologies // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** // // $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/layer/vpf/DcwVariableLengthIndexFile.java,v $ // $RCSfile: DcwVariableLengthIndexFile.java,v $ // $Revision: 1.4 $ // $Date: 2005/08/09 19:29:39 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.layer.vpf; import java.io.IOException; import com.bbn.openmap.io.BinaryBufferedFile; import com.bbn.openmap.io.BinaryFile; import com.bbn.openmap.io.FormatException; /** * Read in a VPF variable length index file, and allows access to * individual records. */ public class DcwVariableLengthIndexFile { /** holds all the offset,size pairs */ final private int offsettable[]; /** the number of records */ final private int recordCount; /** the end of the file offset */ final private int endOfFileOffset; /** * Construct a new index file. * * @param filename the name of the file to read in. * @param msbfirst the byte order of the file to be read. * @exception FormatException some error was encountered in trying * to read the file. */ public DcwVariableLengthIndexFile(String filename, boolean msbfirst) throws FormatException, IOException { this(new BinaryBufferedFile(filename), msbfirst); } /** * Construct a new index file. * * @param inputstream BinaryBufferedFile handle. * @param msbfirst the byte order of the file to be read. * @exception FormatException some error was encountered in trying * to read the file. */ public DcwVariableLengthIndexFile(BinaryFile inputstream, boolean msbfirst) throws FormatException { try { inputstream.byteOrder(msbfirst); recordCount = inputstream.readInteger(); /*int HeaderLength = */inputstream.readInteger(); offsettable = new int[recordCount * 2]; inputstream.readIntegerArray(offsettable, 0, recordCount * 2); endOfFileOffset = offsettable[offsettable.length - 2] + offsettable[offsettable.length - 1]; inputstream.close(); // com.bbn.openmap.util.Debug.output("VLI.init(): number // of entries(" + recordCount + // ") HeaderLength(" + HeaderLength + ")"); } catch (IOException i) { throw new FormatException("IOException with " + inputstream.getName() + ": " + i.getMessage()); } } /** * get the offset byte offset of the record in the associated * table file. If recordNumber is greater than the number of * records, this returns the offset of the end-of-file. * * @param recordNumber the record to retrieve the offset for */ public int recordOffset(int recordNumber) { return (recordCount < recordNumber) ? endOfFileOffset : offsettable[(recordNumber - 1) * 2]; } /** * get the size of the record in the associated table file If * recordNumber is greater than the number of records, this * returns a record size of 0. * * @param recordNumber the record to retrieve the offset for */ public int recordSize(int recordNumber) { return (recordCount < recordNumber) ? 0 : offsettable[(recordNumber - 1) * 2 + 1]; } /** get the number of records in the index file */ public int getRecordCount() { return recordCount; } /** close the associated input file */ public void close() {} }