Subversion Repositories mkgmap

Rev

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

/*
 * 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 java.util.ArrayList;
import java.util.List;

import uk.me.parabola.io.StructuredInputStream;
import uk.me.parabola.io.StructuredOutputStream;
import uk.me.parabola.mkgmap.combiners.SubFileInfo;

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

        // Sizes of the regions.
        private List<SubFileInfo> subFiles;

        public DetailMapBlock(int tdbVersion) {
                super(BLOCK_ID);

                this.tdbVersion = tdbVersion;
        }

        /**
         * Initialise this block from the raw block given.
         *
         * @throws IOException For io problems.
         */

        public DetailMapBlock(StructuredInputStream ds) throws IOException {
                super(ds);

                ds.read2(); // expected value : n + 1
                int n = ds.read2();

                // Sizes of the data
                int[] sizes = new int[n];
                for (int i = 0; i < n; i++) {
                        sizes[i] = ds.read4();
                }

                // some more ignored fields
                ds.read();
                ds.read();
                ds.read();
                ds.read4();

                subFiles = new ArrayList<>();
                for (int i = 0; i < n; i++) {
                        String name = ds.readString();
                        SubFileInfo si = new SubFileInfo(name, sizes[i]);
                        subFiles.add(si);
                }
        }

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

                // We do not support writing a version less than v4.07
                assert tdbVersion >= TdbFile.TDB_V407;

                int n = subFiles.size();
                os.write2(n+1);
                os.write2(n);

                for (SubFileInfo si : subFiles) {
                        os.write4((int) si.getSize());
                }

//01 c3 00 ff
                os.write4(0xff00c301);
                os.write(0);
                os.write(0);
                os.write(0);

                for (SubFileInfo si : subFiles) {
                        os.writeString(si.getName());
                }
        }

        public void setSubFiles(List<SubFileInfo> subFiles) {
                this.subFiles = subFiles;
        }
}