package de.schildbach.pte; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Currency; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TimeZone; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import org.xmlpull.v1.XmlPullParserException; import de.schildbach.pte.dto.Connection; import de.schildbach.pte.dto.Connection.Footway; import de.schildbach.pte.dto.Connection.Part; import de.schildbach.pte.dto.Connection.Trip; import de.schildbach.pte.dto.Fare; import de.schildbach.pte.dto.Fare.Type; import de.schildbach.pte.dto.Line; import de.schildbach.pte.dto.Location; import de.schildbach.pte.dto.LocationType; import de.schildbach.pte.dto.NearbyStationsResult; import de.schildbach.pte.dto.QueryConnectionsContext; import de.schildbach.pte.dto.QueryConnectionsResult; import de.schildbach.pte.dto.QueryConnectionsResult.Status; import de.schildbach.pte.dto.QueryDeparturesResult; import de.schildbach.pte.dto.ResultHeader; import de.schildbach.pte.dto.Style; public class SadProvider extends AbstractNetworkProvider { public static final NetworkId NETWORK_ID = NetworkId.SAD; private static final String API_BASE = "http://timetables.sad.it/SIITimetablesMobile.php"; private static final String SERVER_PRODUCT = "SOAP"; private static final ResultHeader RESULT_HEADER = new ResultHeader(SERVER_PRODUCT); private static final int SOAP_VERSION = SoapEnvelope.VER11; private static final SimpleDateFormat RESPONSE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US); private static final SimpleDateFormat REQUEST_DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy", Locale.US); private static final SimpleDateFormat VALIDITY_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-ddZ", Locale.US); private static final Style DEFAULT_STYLE = new Style(Style.parseColor("#0000cc"), Style.WHITE); private static final int HOURS_AFTER_START = 5; // Specifies in what language e.g. strings for station names are returned private static final Language LANGUAGE = Language.GERMAN; // Languages supplied by SOAP API (sometimes also English or Ladin, but not consistently) private enum Language { GERMAN, ITALIAN } public static class Context implements QueryConnectionsContext { public final String context; public Context(final String context) { this.context = context; } public boolean canQueryLater() { return context != null; } public boolean canQueryEarlier() { return context != null; } } public NetworkId id() { return NETWORK_ID; } public boolean hasCapabilities(final Capability... capabilities) { for (final Capability capability : capabilities) if (capability == Capability.AUTOCOMPLETE_ONE_LINE || capability == Capability.CONNECTIONS) return true; return false; } public NearbyStationsResult queryNearbyStations(Location location, int maxDistance, int maxStations) throws IOException { // Not supported by SOAP API throw new UnsupportedOperationException(); } public QueryDeparturesResult queryDepartures(int stationId, int maxDepartures, boolean equivs) throws IOException { // Not supported by SOAP API throw new UnsupportedOperationException(); } public List autocompleteStations(final CharSequence constraint) throws IOException { // Execute searchNodo SOAP request to get locations corresponding to contraint SoapObject response = executeSoap("searchNodo", new Object[] { "searchstring", constraint.toString() }); ArrayList list = new ArrayList(); // Go through all received locations for (int i = 0; i < response.getPropertyCount(); i++) { Object property = response.getProperty(i); if (property instanceof SoapObject) { // Add location to list list.add(soapToLocation((SoapObject) property)); } } return list; } public QueryConnectionsResult queryConnections(Location from, Location via, Location to, Date date, boolean dep, final int numConnections, String products, WalkSpeed walkSpeed, Accessibility accessibility, Set