/*
* Copyright (C) 2009.
*
* 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.nio.ByteBuffer;
import uk.me.parabola.imgfmt.app.BufferedImgFileWriter;
import uk.me.parabola.imgfmt.app.ImgFileWriter;
/**
* Each map has one of these and it is used to provide a list of records
* in the various sections that actually belong to this map.
*
* @author Steve Ratcliffe
*/
public class Mdr1MapIndex {
private final Mdr1SubHeader subHeader = new Mdr1SubHeader();
private final BufferedImgFileWriter subWriter = new BufferedImgFileWriter(null);
private int pointerSize;
public Mdr1MapIndex() {
// skip over where the header will be
this.subWriter.position(subHeader.getHeaderLen());
}
public void startSection(int n) {
}
public void endSection(int n) {
int sn = sectionToSubsection(n);
if (sn != 0)
subHeader.setEndSubsection(sn, subWriter.position());
}
public void addPointer(int recordNumber) {
switch (pointerSize) {
case 4:
subWriter.putInt(recordNumber);
break;
case 3:
subWriter.put3(recordNumber);
break;
case 2:
subWriter.putChar((char) recordNumber);
break;
case 1:
subWriter.put((byte) recordNumber);
break;
default:
assert false;
}
}
private int sectionToSubsection(int n) {
int sn;
switch (n) {
case 11: sn = 1; break;
case 10: sn = 2; break;
case 7: sn = 3; break;
case 5: sn = 4; break;
case 6: sn = 5; break;
case 20: sn = 6; break;
case 21: sn = 7; break;
case 22: sn = 8; break;
default: sn = 0; break;
}
return sn;
}
public void writeSubSection(ImgFileWriter writer) {
subHeader.writeFileHeader(writer);
ByteBuffer buffer = subWriter.getBuffer();
byte[] bytes = buffer.array();
int hl = (int) subHeader.getHeaderLen();
writer.put(bytes, hl, buffer.position() - hl);
}
public void setPointerSize(int sectionNumber, int pointerSize) {
this.pointerSize = pointerSize;
int sn = sectionToSubsection(sectionNumber);
if (sn != 0)
subHeader.setItemSize(sn, pointerSize);
}
}