package gui;
import java.io.IOException;
import java.util.Vector;
import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.DataElement;
import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;
import main.BTMIDlet;
import util.BTConnection;
// TODO UWAGA!!! Wszystkie wystapienia System.out.println() sa ignorowane przez telefon. Zastapic komunikatami Alert
/**
*
* @author TeXteR
*/
public class ClientConnection implements DiscoveryListener, CommandListener {
private static final int SERVICE_NAME_BASE_LANGUAGE = 0x0100;
private final String serviceUUID = "C7E0AF6060F111DFA08BC4732EF25ACD";
private final int serviceAttributes[] = {SERVICE_NAME_BASE_LANGUAGE};
private final Command backCommand;
/**
* Reprezentuje lokalne urzadzenie bluetooth
*/
private LocalDevice localDevice;
/**
* Agent pozwalajacy odkryc urzadzenia dookola
*/
private DiscoveryAgent discoveryAgent;
/**
* Kontener podobny do ArrayList. Przechowuje wykryte urzadzenia
*/
private Vector discoveredDevices;
/**
* Przechowuje wykryte uslugi.
*/
private Vector discoveredServices;
/**
* Form ktory pokazuje sie w czasie wyszukiwania urzadzen BT
*/
private WaitingForm waitingForm;
private BTMIDlet bTMIDlet;
private Display display;
/**
* Lista wyswietlana na ekranie. Pojawiaja sie w niej nazwy wykrytych urzadzen.
*/
private List discoveredList;
public ClientConnection(BTMIDlet bTMIDlet) {
this.bTMIDlet = bTMIDlet;
backCommand = new Command("Back", Command.BACK, 1);
display = bTMIDlet.getDisplay();
waitingForm = new WaitingForm("Proszę czekać...");
discoveredList = new List("Dostępne urządzenia:", List.IMPLICIT);
discoveredList.addCommand(backCommand);
discoveredList.setCommandListener(this);
discoveredDevices = new Vector();
discoveredServices = new Vector();
initBT();
searchDevices();
}
/**
* Inicjuje wszystkie pola potrzebne do rozpoczecia wyszukiwania urzadzen w poblizu
*/
private void initBT() {
try {
// Pobranie obiektu urzadzenia lokalnego
localDevice = LocalDevice.getLocalDevice();
// Pobranie agenta pozwalajacego wyszukiwac urzadzenia
discoveryAgent = localDevice.getDiscoveryAgent();
} catch (BluetoothStateException bse) {
System.out.println(bse.getMessage());
}
}
/**
* Rozpoczyna wyszukiwanie urzadzen
*/
private void searchDevices() {
try {
// Ustawiamy jako aktywny ekran oczekiwania
display.setCurrent(waitingForm);
// Rozpoczynamy wyszukiwanie urzadzen w poblizu
discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
// Startujemy timer uruchamiajacy animacje paska
waitingForm.start();
} catch (BluetoothStateException bse) {
System.out.println(bse.getMessage());
}
}
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
// Jesli wykryto urzadzenie, dodajemy je do kolekcji urzadzen
discoveredDevices.addElement(btDevice);
try {
// Do listy dodajemy nazwe urzadzenia
discoveredList.append(btDevice.getFriendlyName(true), null);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
/**
* Wystepuje po zakonczeniu wyszukiwania urzadzen.
* @param discType
*/
public void inquiryCompleted(int discType) {
// Zatrzymujemy pasek oczekiwania na polaczenie
waitingForm.stop();
// Wyswietlamy liste urzadzen
display.setCurrent(discoveredList);
}
/**
* Wystepuje gdy znaleziono usluge.
* @param transID
* @param servRecord
*/
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
// Pobieramy sobie usluge. Mechanizm jak w MHP co jest ciekawe :D
ServiceRecord serviceRecord = servRecord[0];
// Dodajemy usluge do kolekcji. Do wykorzystania potem, potem, potem....
discoveredServices.addElement(serviceRecord);
try {
// W tym miejscu nawiazuje sie polaczenie z serwerem.
//TODO wyjebac stad i stworzyc klase agregujaca polacenie miedzy serwerem a klientem
StreamConnection conn = (StreamConnection) Connector.open(serviceRecord.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false));
new MessagingForm(bTMIDlet, new BTConnection(conn));
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* Wystepuje gdy zakonczono wyszukiwac uslugi.
* @param transID
* @param respCode
*/
public void serviceSearchCompleted(int transID, int respCode) {
ServiceRecord serviceRecord;
DataElement dataElement;
waitingForm.stop();
// Jeszcze nie wiem co to robi i po co to. Mozliwe ze pozniej tego nie bedzie. Nie uzywane tutaj.
for(int i = 0; i < discoveredServices.size(); i++) {
serviceRecord = (ServiceRecord) discoveredServices.elementAt(i);
dataElement = serviceRecord.getAttributeValue(SERVICE_NAME_BASE_LANGUAGE);
discoveredList.append((String) dataElement.getValue(), null);
}
}
public void commandAction(Command c, Displayable d) {
if (c.equals(backCommand)) {
bTMIDlet.showMenu();
}
// Jesli nie jest pokazywany ekran oczekiwania
if (!waitingForm.isShown()) {
int selectedItem = discoveredList.getSelectedIndex();
// i jesli wcisnieto select
if (c.getCommandType() == Command.SCREEN) {
// Tworzymy tablice UUID. Potrzebne do laczenia - info o usludze
UUID[] uuids = new UUID[]{new UUID(serviceUUID, false)};
try {
// Wyszukujemy uslug, dla urzadzenia ktore zostalo zaznaczone na liscie urzadzen.
discoveryAgent.searchServices(serviceAttributes, uuids, (RemoteDevice) discoveredDevices.elementAt(selectedItem), this);
} catch (BluetoothStateException ex) {
System.out.println(ex.getMessage());
}
}
}
}
}