diff --git a/src/de/schildbach/pte/ParserUtils.java b/src/de/schildbach/pte/ParserUtils.java index 88b742e1..3031abe4 100644 --- a/src/de/schildbach/pte/ParserUtils.java +++ b/src/de/schildbach/pte/ParserUtils.java @@ -19,8 +19,10 @@ package de.schildbach.pte; import java.io.IOException; import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.io.Reader; import java.io.UnsupportedEncodingException; +import java.io.Writer; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; @@ -41,10 +43,25 @@ public final class ParserUtils private static final int SCRAPE_INITIAL_CAPACITY = 4096; public static CharSequence scrape(final String url) throws IOException + { + return scrape(url, null); + } + + public static CharSequence scrape(final String url, final String request) throws IOException { final StringBuilder buffer = new StringBuilder(SCRAPE_INITIAL_CAPACITY); final URLConnection connection = new URL(url).openConnection(); + connection.setDoInput(true); + connection.setDoOutput(request != null); connection.addRequestProperty("User-Agent", SCRAPE_USER_AGENT); + + if (request != null) + { + final Writer writer = new OutputStreamWriter(connection.getOutputStream(), "ISO-8859-1"); + writer.write(request); + writer.close(); + } + final Reader pageReader = new InputStreamReader(connection.getInputStream(), "ISO-8859-1"); final char[] buf = new char[SCRAPE_INITIAL_CAPACITY]; diff --git a/src/de/schildbach/pte/VbbProvider.java b/src/de/schildbach/pte/VbbProvider.java index e749b09c..791d9805 100644 --- a/src/de/schildbach/pte/VbbProvider.java +++ b/src/de/schildbach/pte/VbbProvider.java @@ -98,9 +98,55 @@ public final class VbbProvider implements NetworkProvider throw new UnsupportedOperationException(); } + private static Pattern P_STATION_LOCATION = Pattern.compile("" + + DATE_FORMAT.format(now) + + "" + + DATE_FORMAT.format(now) + ""; + final String uri = "http://www.vbb-fahrinfo.de/hafas/extxml/extxml.exe/dn"; + + final CharSequence page = ParserUtils.scrape(uri, request); + + final Matcher mError = P_STATION_LOCATION_ERROR.matcher(page); + if (mError.find()) + { + if (mError.group(1) != null) + return null; + if (mError.group(2) != null) + throw new RuntimeException("timeout error"); + } + + final Matcher m = P_STATION_LOCATION.matcher(page); + if (m.find()) + { + final String name = ParserUtils.resolveEntities(m.group(1)); + final double lon = latLonToDouble(Integer.parseInt(m.group(2))); + final double lat = latLonToDouble(Integer.parseInt(m.group(3))); + + return new StationLocationResult(lat, lon, name); + } + else + { + throw new IllegalArgumentException("cannot parse '" + page + "' on " + uri); + } + } + + private static double latLonToDouble(int value) + { + return (double) value / 1000000; } public static final String STATION_URL_CONNECTION = "http://mobil.bvg.de/Fahrinfo/bin/query.bin/dox"; @@ -534,6 +580,8 @@ public final class VbbProvider implements NetworkProvider return "RDNZ" + (number.equals("DNZ") ? "" : number); if (type.equals("KBS")) // Kursbuchstrecke return "RKBS" + number; + if (type.equals("BKB")) // Buckower Kleinbahn + return "RBKB" + number; if (type.equals("S")) return "SS" + number; if (type.equals("U"))