Subversion Repositories mkgmap

Rev

Rev 3408 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * 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;
        }
}