package net.sharenav.osmToShareNav;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.MissingResourceException;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
public class RouteSoundSyntax {
private final static byte SYNTAX_FORMAT_VERSION = 1;
private ResourceBundle rb = null;
private InputStream is = null;
private DataOutputStream dsi = null;
private ArrayList<String> soundNames = new ArrayList<String>(1);
public RouteSoundSyntax(String styleFileDirectory, String additionalSrcPath, String destinationPathAndFile) {
String info = "Using " + styleFileDirectory + additionalSrcPath + "/syntax.cfg";
// try syntax.cfg from file system
try {
is = new FileInputStream(styleFileDirectory + additionalSrcPath + "/syntax.cfg");
} catch (Exception e) {
// try internal syntax.cfg
try {
info = "Using internal syntax.cfg from " + additionalSrcPath;
is = getClass().getResourceAsStream("/media/" + additionalSrcPath + "/syntax.cfg");
} catch (Exception e2) {
;
}
}
if (Configuration.getConfiguration().verbose >= 0) {
System.out.println(info + " for specifying route and sound syntax");
}
if (is != null) {
try {
InputStreamReader isr;
// try reading syntax.cfg with UTF-8 encoding
try {
isr = new InputStreamReader(is, "UTF-8");
try {
rb = new PropertyResourceBundle(isr);
} catch (Exception e) {
System.out.println ("ERROR: PropertyResourceBundle for syntax.cfg could not be created from InputStreamReader");
e.printStackTrace();
System.exit(1);
}
} catch (NoSuchMethodError nsme) {
/* Give warning if creating the UTF-8-reader for syntax.cfg fails and continue with default encoding,
* this can happen with Java 1.5 environments
* more information at: http://sourceforge.net/projects/sharenav/forums/forum/677687/topic/4063854
*/
System.out.println("Warning: Cannot use UTF-8 encoding for decoding syntax.cfg file as it requires Java 1.6+");
try {
rb = new PropertyResourceBundle(is);
} catch (Exception e) {
System.out.println ("ERROR: PropertyResourceBundle for syntax.cfg could not be created from InputStream");
e.printStackTrace();
System.exit(1);
}
}
} catch (UnsupportedEncodingException e1) {
System.out.println ("ERROR: InputStreamReader for syntax.cfg could not be created");
e1.printStackTrace();
System.exit(1);
}
} else {
System.out.println ("ERROR: syntax.cfg not found in the " + additionalSrcPath + " directory");
System.exit(1);
}
// create syntax.dat
try {
FileOutputStream foi = new FileOutputStream(destinationPathAndFile);
dsi = new DataOutputStream(foi);
} catch (Exception e) {
;
}
if (dsi == null) {
System.out.println ("ERROR: could not create " + destinationPathAndFile);
System.exit(1);
}
try {
dsi.writeByte(SYNTAX_FORMAT_VERSION);
final String directionNames[] = { "default", "hardright", "right", "halfright", "straighton", "halfleft", "left", "hardleft"};
for (int i=0; i < directionNames.length; i++) {
getAndWriteString("direction." + directionNames[i] + ".screen");
getAndWriteString("direction." + directionNames[i] + ".sound");
}
final String bearDirectionNames[] = { "right", "left"};
for (int i=0; i < bearDirectionNames.length; i++) {
getAndWriteString("beardir." + bearDirectionNames[i] + ".screen");
getAndWriteString("beardir." + bearDirectionNames[i] + ".sound");
}
final String exitNames[] = { "1", "2", "3", "4", "5", "6"};
for (int i=0; i < exitNames.length; i++) {
getAndWriteString("roundabout.exit." + exitNames[i] + ".screen");
getAndWriteString("roundabout.exit." + exitNames[i] + ".sound");
}
final String distanceNames[] = { "100", "200", "300", "400", "500", "600", "700", "800"};
for (int i=0; i < distanceNames.length; i++) {
getAndWriteString("distances." + distanceNames[i] + ".sound");
}
String componentNames[] = { "normal.sound", "prepare.sound", "in.sound", "then.sound", "normal.screen", "in.screen" };
String instructionTypes[] = {"simpledirection", "beardir", "uturn", "roundabout",
"entermotorway", "beardirandentermotorway",
"leavemotorway", "beardirandleavemotorway",
"intotunnel", "outoftunnel", "areacross", "areacrossed", "destreached" };
for (int i=0; i < instructionTypes.length; i++) {
for (int c=0; c < componentNames.length; c++) {
getAndWriteString(instructionTypes[i] + "." + componentNames[c]);
}
}
getAndWriteString("soon.sound");
getAndWriteString("again.sound");
getAndWriteString("meters.sound");
getAndWriteString("yards.sound");
getAndWriteString("checkdirection.screen");
getAndWriteString("checkdirection.sound");
getAndWriteString("followstreet.sound");
getAndWriteString("speedlimit.sound");
getAndWriteString("recalculation.sound");
// magic number
dsi.writeShort(0x3550);
} catch (IOException ioe) {
System.out.println ("ERROR writing to " + destinationPathAndFile);
System.exit(1);
}
}
public void getAndWriteString(String key) throws IOException {
String s = key;
try {
s = rb.getString(key).trim();
} catch (MissingResourceException e) {
System.out.println("syntax.cfg: " + key + " not found");
if (key.startsWith("distances.")) {
String key2 = "meters." + key.substring(10);
System.out.println("syntax.cfg: trying " + key2);
try {
s = rb.getString(key2).trim();
} catch (MissingResourceException e2) {
System.out.println("syntax.cfg: " + key2 + " not found");
}
}
}
dsi.writeUTF(s);
if (key.endsWith(".sound")) {
rememberSounds(s);
}
//System.out.println(key + ": " + s);
}
private void rememberSounds(String sequence) {
String s[] = sequence.split("[;]");
for (int i = 0; i < s.length; i++) {
if (s[i].length() > 0 && !s[i].startsWith("%")) {
if (!soundNames.contains(s[i])) {
soundNames.add(s[i]);
//System.out.println(s[i]);
}
}
}
}
public Object[] getSoundNames() {
rememberSounds("CONNECT;DISCONNECT;CAMERA_ALERT");
return soundNames.toArray();
}
}