package org.tyszecki.rozkladpkp.pln;
import org.tyszecki.rozkladpkp.pln.PLN.Availability;
import org.tyszecki.rozkladpkp.pln.PLN.ConnectionChange;
import org.tyszecki.rozkladpkp.pln.PLN.Message;
import org.tyszecki.rozkladpkp.pln.PLN.Train;
/*
*
* Klasa opisuje połączenie niepowiązane z momentem w czasie. Każde takie połączenie posiada listę dni, w jakich jest dostępne.
* W przypadku formatu PLN jest to jednak rozwiązane nieco dziwnie - informacje o opóźnieniach i komunikaty powiązane są właśnie z tą klasą.
* Przez to, obecność tych informacji oznacza, że każde połączenie dostępne jest tylko w jednym dniu.
*
*/
public class UnboundConnection {
static final int ConnectionOffset = 0x4a; //Przesunięcie od którego zaczynają się dane o połączeniach
static final int ConnectionSize = 12; //Rozmiar struktury połączenia w bajtach
static final int JourneyTimeOffset = 10; //Offset czasu trwania podróży
public final PLN pln; //obiekt PLN
private final int fileOffset; //Pozycja tego wpisu w pliku
private final int trainsOffset; //Przesunięcie pociągów
public final int changesCount; //Liczba przesiadek
public final int trainCount; //Liczba pociągów w połączeniu
public final int number; //Numer połączenia
private final int messagesOffset; //Przesunięcie dodatkowych komunikatów
public final Availability availability; //Określa dostępność pociągów w kolejnych dniach
private PLNTimestamp journeyTime = null; //Czas podróży
private Train[] trains = null; //Lista pociągów w połączeniu
int changeOffset = -1; //Przesunięćie opóźnień
private ConnectionChange change; //Opóźnienie połączenia
UnboundConnection(PLN sourcePLN, int number) {
pln = sourcePLN;
fileOffset = ConnectionOffset+ConnectionSize*number;
this.number = number;
//Odczytaj i ustaw podstawowe pola
changesCount = pln.readShort(fileOffset+8);
trainsOffset = ConnectionOffset+pln.readShort(fileOffset+2);
trainCount = pln.readShort(fileOffset+6);
//Powiąż z dostępnością
availability = pln.availabilities.get(pln.readShort(fileOffset));
//Sprawdź, czy z tym połączeniem powiązane są jakieś wiadomości
messagesOffset = pln.messages.offsetForConnection(number);
}
public PLNTimestamp getJourneyTime()
{
if(journeyTime == null)
journeyTime = new PLNTimestamp(pln.readShort(fileOffset+JourneyTimeOffset));
return journeyTime;
}
public Train getTrain(int index)
{
if(trains == null)
trains = new Train[trainCount];
else if(trains[index] != null)
return trains[index];
Train t = pln.readTrain(trainsOffset + index*pln.TrainSize);
trains[index] = t;
if(changeOffset != -1)
t.changeOffset = changeOffset+8*(index+1);
return t;
}
public Availability getAvailability()
{
return availability;
}
public ConnectionChange getChange()
{
if(changeOffset == -1)
return null;
if(change != null)
return change;
if(changeOffset != -1)
change = pln.readConnectionChanges(changeOffset);
return change;
}
public boolean hasMessages()
{
return (messagesOffset > 0);
}
public Message[] getMessages()
{
if(hasMessages())
return pln.messages.get(messagesOffset);
else
return null;
}
}