package de.andlabs.teleporter.plugin;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
import java.util.regex.MatchResult;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import de.andlabs.teleporter.Place;
import de.andlabs.teleporter.R;
import de.andlabs.teleporter.Ride;
import de.andlabs.teleporter.R.drawable;
import android.util.Log;
public class BahnDePlugIn implements ITeleporterPlugIn {
private static final String TAG = "PlugIn";
private DefaultHttpClient client;
private ArrayList<Ride> rides;
public BahnDePlugIn() {
rides = new ArrayList<Ride>();
client = new DefaultHttpClient();
}
/* (non-Javadoc)
* @see de.andlabs.teleporter.ITeleporterPlugIn#find(de.andlabs.teleporter.Place, de.andlabs.teleporter.Place, java.util.Date)
*/
public ArrayList<Ride> find(Place orig, Place dest, Date time) {
StringBuilder url = new StringBuilder();
url.append("http://mobile.bahn.de/bin/mobil/query.exe/dox?");
url.append("n=1");
switch (orig.type) {
case Place.TYPE_ADDRESS:
url.append("&f=2&s=").append(URLEncoder.encode(orig.address));
break;
case Place.TYPE_STATION:
url.append("&f=1&s=").append(URLEncoder.encode(orig.name+", "+orig.address));
break;
}
switch (dest.type) {
case Place.TYPE_ADDRESS:
url.append("&o=2&z=").append(URLEncoder.encode(dest.address));
break;
case Place.TYPE_STATION:
url.append("&o=1&z=").append(URLEncoder.encode(dest.name+", "+dest.address));
break;
}
url.append("&d="); // date
url.append((new SimpleDateFormat("ddMMyy")).format(time));
url.append("&t="); // time
url.append((new SimpleDateFormat("HHmm")).format(time));
url.append("&start=Suchen");
// Log.d(TAG, "url: "+url.toString());
// fetch
try {
Ride r;
MatchResult m;
rides.clear();
Scanner scanner = new Scanner(client.execute(new HttpGet(url.toString())).getEntity().getContent(), "iso-8859-1");
while (scanner.findWithinHorizon("<a href=\"([^\"]*)\">(\\d\\d):(\\d\\d)<br />(\\d\\d):(\\d\\d)", 10000) != null) {
m = scanner.match();
Log.d(TAG, "found :) "+m);
Date dep = parseDate(m.group(2), m.group(3));
if (dep.getTime() - time.getTime() > 100000) {
r = new Ride();
r.orig = orig;
r.dest = dest;
r.mode = Ride.MODE_TRANSIT;
r.dep = dep;
r.arr = parseDate(m.group(4), m.group(5));
r.price = 240;
r.fun = 3;
r.eco = 3;
r.fast = 1;
r.social = 2;
r.green = 4;
rides.add(r);
}
}
} catch (Exception e) {
Log.e(TAG, "Mist!");
e.printStackTrace();
}
return rides;
}
private Date parseDate(String hours, String minutes) {
Date date = new Date();
date.setHours(Integer.parseInt(hours));
date.setMinutes(Integer.parseInt(minutes));
date.setSeconds(0);
date.setTime((date.getTime() / 1000) * 1000);
if (System.currentTimeMillis() - date.getTime() > 36000000) { // Mitternacht..
long oneDay = (long) 1000.0 * 60 * 60 * 24;
date.setTime(date.getTime() + oneDay);
}
return date;
}
}