/*
* 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: Dec 9, 2007
*/
package uk.me.parabola.mkgmap.combiners;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import uk.me.parabola.imgfmt.ExitException;
import uk.me.parabola.imgfmt.Utils;
import uk.me.parabola.imgfmt.app.map.MapReader;
import uk.me.parabola.log.Logger;
import uk.me.parabola.mkgmap.CommandArgs;
import uk.me.parabola.tdbfmt.DetailMapBlock;
import uk.me.parabola.tdbfmt.TdbFile;
/**
* Build the TDB file and the overview map.
*
* @author Steve Ratcliffe
*/
public class TdbBuilder implements Combiner {
private static final Logger log = Logger.getLogger(TdbBuilder.class);
private final OverviewBuilder overviewBuilder;
private TdbFile tdb;
private int parent = 63240000;
private String overviewMapname;
private String overviewMapnumber;
private String outputDir;
private int tdbVersion;
private final List<String[]> copyrightMsgs = new ArrayList<>();
public TdbBuilder(OverviewBuilder ovb) {
overviewBuilder = ovb;
}
/**
* Initialise by saving all the information we require from the command line
* args.
*
* @param args The command line arguments as they are at the end of the list.
* In other words if the same argument appears more than once, then it will
* have the latest value set.
*/
public void init(CommandArgs args) {
overviewMapname = args.get("overview-mapname", "osmmap");
overviewMapnumber = args.get("overview-mapnumber", "63240000");
try {
parent = Integer.parseInt(overviewMapnumber);
} catch (NumberFormatException e) {
log.debug("overview map number not an integer", overviewMapnumber);
}
String areaName = args.get("area-name", "Overview Map");
int familyId = args.get("family-id", CommandArgs.DEFAULT_FAMILYID);
int productId = args.get("product-id", 1);
short productVersion = (short)args.get("product-version", 100);
String seriesName = args.get("series-name", "OSM map");
String familyName = args.get("family-name", "OSM map");
tdbVersion = TdbFile.TDB_V407;
// enable "show profile" button for routes in mapsource
// this is supported only in version 403 and above
byte enableProfile = (byte) args.get("show-profiles", 0);
tdb = new TdbFile(tdbVersion);
tdb.setProductInfo(familyId, productId, productVersion, seriesName,
familyName, areaName, enableProfile);
tdb.setCodePage(args.getCodePage());
outputDir = args.getOutputDir();
}
/**
* Called at the end of every map that is to be combined. We only deal
* with IMG files and ignore everything else.
*
* @param info Information on the file.
*/
public void onMapEnd(FileInfo info) {
if (!info.isImg())
return;
addToTdb(info);
}
/**
* Add the information about the current map to the tdb file.
*
* @param finfo Information about the current .img file.
*/
private void addToTdb(FileInfo finfo) {
DetailMapBlock detail = new DetailMapBlock(tdbVersion);
detail.setArea(finfo.getBounds());
String mapname = finfo.getMapname();
String mapdesc = finfo.getDescription();
detail.setMapName(mapname);
detail.setInnername(finfo.getInnername());
String desc = mapdesc + " (" + mapname + ')';
detail.setDescription(desc);
detail.setLblDataSize(finfo.getLblsize());
detail.setTreDataSize(finfo.getTresize());
detail.setRgnDataSize(finfo.getRgnsize());
detail.setNetDataSize(finfo.getNetsize());
detail.setNodDataSize(finfo.getNodsize());
log.info("overview-mapname", overviewMapname);
log.info("overview-mapnumber", parent);
detail.setParentMapNumber(parent);
tdb.addDetail(detail);
String[] msgs = finfo.getLicenseInfo();
for (String m : msgs)
tdb.addCopyright(m);
MapReader mapReader = null;
String filename = finfo.getFilename();
try{
mapReader = new MapReader(filename);
msgs = mapReader.getCopyrights();
boolean found = false;
for (String[] block : copyrightMsgs) {
if (Arrays.deepEquals(block, msgs)){
found = true;
break;
}
}
if (!found ){
copyrightMsgs.add(msgs);
for (String m : msgs)
tdb.addCopyright(m);
}
} catch (FileNotFoundException e) {
throw new ExitException("Could not open " + filename + " when creating tdb file");
} finally {
Utils.closeFile(mapReader);
}
}
/**
* Called when all the .img files have been processed. We finish up and
* create the TDB file and the overview map.
*/
public void onFinish() {
log.debug("finishing overview");
// We can set the overall bounds easily as it was calculated as part of
// the overview map.
tdb.setOverview(overviewBuilder.getBounds(), overviewMapnumber);
writeTdbFile();
}
public String getFilename() {
return Utils.joinPath(outputDir, overviewMapname, "tdb");
}
/**
* Write out the TDB file at the end of processing.
*/
private void writeTdbFile() {
try {
tdb.write(Utils.joinPath(outputDir, overviewMapname, "tdb"));
} catch (IOException e) {
log.error("tdb write", e);
throw new ExitException("Could not write the TDB file", e);
}
}
}