/*
* 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 uk.me.parabola.imgfmt.ReadFailedException;
import uk.me.parabola.imgfmt.app.CommonHeader;
import uk.me.parabola.imgfmt.app.ImgFileReader;
import uk.me.parabola.imgfmt.app.ImgFileWriter;
import uk.me.parabola.imgfmt.app.Section;
import uk.me.parabola.imgfmt.app.srt.Sort;
/**
* The header of the MDR file.
*
* Note that there are many possible sections in this file and that
* only a certain number of them are needed. There are also many
* different lengths for the record sizes of the sections. Finally
* there are different sections and record sizes for the version
* that gets loaded into the gmapsupp.
*
* @author Steve Ratcliffe
*/
public class MDRHeader extends CommonHeader {
private static final int MAX_SECTIONS = 40;
private final Section[] sections = new Section[MAX_SECTIONS+1];
private Sort sort;
public MDRHeader(int headerLen) {
super(headerLen, "GARMIN MDR");
// Do a quick initialisation. Link every section to the
// previous one so that all the positions are correct.
for (int i = 1; i < sections.length; i++) {
Section prev = (i == 0) ? null : sections[i - 1];
sections[i] = new Section(prev);
}
sections[1].setPosition(getHeaderLength());
}
protected void readFileHeader(ImgFileReader reader) throws ReadFailedException {
throw new UnsupportedOperationException("not implemented yet");
}
/**
* Write out the application header.
*/
protected void writeFileHeader(ImgFileWriter writer) {
writer.putChar((char) sort.getCodepage());
writer.putChar((char) sort.getId1());
writer.putChar((char) sort.getId2());
writer.putChar((char) 14);
sections[1].writeSectionInfo(writer, true, true);
sections[2].writeSectionInfo(writer, true, true);
sections[3].writeSectionInfo(writer, true, true);
sections[4].writeSectionInfo(writer, true, true);
sections[5].writeSectionInfo(writer, true, true);
sections[6].writeSectionInfo(writer, true, true);
sections[7].writeSectionInfo(writer, true, true);
sections[8].writeSectionInfo(writer, true, true);
sections[9].writeSectionInfo(writer, true, true);
sections[10].writeSectionInfo(writer, false, true);
sections[11].writeSectionInfo(writer, true, true);
sections[12].writeSectionInfo(writer, true, true);
sections[13].writeSectionInfo(writer, true, true);
sections[14].writeSectionInfo(writer, true, true);
sections[15].writeSectionInfo(writer);
writer.put((byte) 0);
sections[16].writeSectionInfo(writer, true, true);
sections[17].writeSectionInfo(writer, false, true);
for (int n = 18; n <= 30; n++)
sections[n].writeSectionInfo(writer, true, true);
}
public void setItemSize(int sectionNumber, int itemSize) {
Section section = sections[sectionNumber];
section.setItemSize((char) itemSize);
}
public void setExtraValue(int sectionNumber, int extraValue) {
Section section = sections[sectionNumber];
section.setExtraValue(extraValue);
}
public void setPosition(int sectionNumber, int position) {
sections[sectionNumber].setPosition(position);
}
public void setEnd(int sectionNumber, int position) {
Section s = sections[sectionNumber];
s.setSize(position - s.getPosition());
}
public Sort getSort() {
return sort;
}
public void setSort(Sort sort) {
this.sort = sort;
}
}