Subversion Repositories mkgmap

Rev

Rev 4378 | 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 java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import uk.me.parabola.imgfmt.ExitException;
import uk.me.parabola.imgfmt.app.srt.Sort;
import uk.me.parabola.mkgmap.CommandArgs;
import uk.me.parabola.mkgmap.reader.osm.FeatureKind;
import uk.me.parabola.mkgmap.reader.osm.GType;
import uk.me.parabola.mkgmap.scan.SyntaxException;

/**
 * Configuration for the MDR file.
 * Mostly used when creating a file as there are a number of different options
 * in the way that it is done.
 *
 * @author Steve Ratcliffe
 */

public class MdrConfig {
        private static final int DEFAULT_HEADER_LEN = 568;

        private boolean writable;
        private boolean forDevice;
        private int headerLen = DEFAULT_HEADER_LEN;
        private Sort sort;
        private File outputDir;
        private boolean splitName;
        private Set<String> mdr7Excl = Collections.emptySet();
        private Set<String> mdr7Del = Collections.emptySet();
        private Set<Integer> poiExclTypes = Collections.emptySet();
       
        public MdrConfig() {
               
        }
       
        /**
         * Constructor which copies the values which configure the index details.
         * @param base
         */

        public MdrConfig(MdrConfig base) {
                splitName = base.isSplitName();
                mdr7Del = base.getMdr7Del();
                mdr7Excl = base.getMdr7Excl();
                poiExclTypes = base.getPoiExclTypes();
        }

        /**
         * True if we are creating the file, rather than reading it.
         */

        public boolean isWritable() {
                return writable;
        }

        public void setWritable(boolean writable) {
                this.writable = writable;
        }

        /**
         * The format that is used by the GPS devices is different to that used
         * by Map Source. This parameter says which to do.
         * @return True if we are creating the the more compact format required
         * for a device.
         */

        public boolean isForDevice() {
                return forDevice;
        }

        public void setForDevice(boolean forDevice) {
                this.forDevice = forDevice;
        }

        /**
         * There are a number of different header lengths in existence.  This
         * controls what sections can exist (and perhaps what must exist).
         * @return The header length.
         */

        public int getHeaderLen() {
                return headerLen;
        }

        public void setHeaderLen(int headerLen) {
                this.headerLen = headerLen;
        }

        public Sort getSort() {
                return sort;
        }

        public void setSort(Sort sort) {
                this.sort = sort;
        }

        public File getOutputDir() {
                return outputDir;
        }

        public void setOutputDir(String outputDir) {
                if (outputDir != null)
                        this.outputDir = new File(outputDir);
        }

        public void setSplitName(boolean splitName) {
                this.splitName = splitName;
        }

        public boolean isSplitName() {
                return splitName;
        }

        public Set<String> getMdr7Excl() {
                return Collections.unmodifiableSet(mdr7Excl);
        }

        public Set<String> getMdr7Del() {
                return Collections.unmodifiableSet(mdr7Del);
        }

        /**
         * Parse option --poi-excl-index .
         * @param opt the option string given. Expected is a comma separated list,eg
         * "0x2800" or "0x2800, 0x6400-0x661f"
         */

        public void setPoiExcl (List<String> opts) {
                if (opts.isEmpty())
                        poiExclTypes = Collections.emptyNavigableSet();
                else {
                        poiExclTypes = new TreeSet<>();
                        for (String range : opts) {
                                if (range.contains("-")) {
                                        String[] ranges = range.split("-");
                                        if (ranges.length != 2)
                                                throw new IllegalArgumentException("invalid range in option " + range);
                                        genTypesForRange(poiExclTypes, ranges[0], ranges[1]);
                                } else {
                                        genTypesForRange(poiExclTypes, range,range);
                                }
                        }
                }
        }

        /**
         * Create all POI types for a given range.
         * @param set set of integers. Generated types are added to it.
         * @param start first type
         * @param stop last type (included)
         */

        private static void genTypesForRange(Set<Integer> set, String start, String stop) {
                GType[] types = new GType[2];
                String[] ranges = {start, stop};
                boolean ok = true;
                for (int i = 0; i < 2; i++) {
                        try {
                                types[i] = new  GType(FeatureKind.POINT, ranges[i]);
                        } catch (ExitException e) {
                                ok = false;
                        }
                        if (!ok || !GType.checkType(types[i].getFeatureKind(), types[i].getType())){
                                throw new SyntaxException("invalid type " + ranges[i] + " for " + FeatureKind.POINT + " in option " + Arrays.toString(ranges));
                        }
                }
               
                if (types[0].getType() > types[1].getType()) {
                        GType gt = types[0];
                        types[0] = types[1];
                        types[1] = gt;
                }
                for (int i = types[0].getType(); i <= types[1].getType(); i++) {
                        if ((i & 0xff) > 0x1f)
                                i = ((i >> 8) + 1) << 8;
                        set.add(i);
                }
               
        }

        public Set<Integer> getPoiExclTypes() {
                return Collections.unmodifiableSet(poiExclTypes);
        }

        public void setIndexOptions(CommandArgs args) {
                setSplitName(args.get("split-name-index", false));
                mdr7Excl = args.argToSet("mdr7-excl", null);
                mdr7Del = args.argToSet("mdr7-del", null);
                setPoiExcl(args.argToList("poi-excl-index", null));
        }
}