123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- package de.tudarmstadt.informatik.hostage.sync.bluetooth;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Iterator;
- import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
- import de.tudarmstadt.informatik.hostage.logging.NetworkRecord;
- import de.tudarmstadt.informatik.hostage.logging.SyncInfoRecord;
- import de.tudarmstadt.informatik.hostage.persistence.HostageDBOpenHelper;
- import de.tudarmstadt.informatik.hostage.sync.SyncMessage;
- import android.bluetooth.BluetoothSocket;
- import android.content.Context;
- import android.content.SharedPreferences;
- import android.os.Handler;
- import android.preference.PreferenceManager;
- import android.util.Log;
- public class CommunicationThread extends Thread {
- private final Context context;
- private final BluetoothSocket mmSocket;
- private final ObjectInputStream objectInput;
- private final ObjectOutputStream objectOuput;
- private final Handler mHandler;
- private final HostageDBOpenHelper mdbh;
- private final SharedPreferences pref;
- public CommunicationThread(Context con, BluetoothSocket socket, Handler handler) {
- mmSocket = socket;
- mHandler = handler;
- context = con;
- mdbh = new HostageDBOpenHelper(context);
- pref = PreferenceManager.getDefaultSharedPreferences(context);
- ObjectInputStream tmpIn = null;
- ObjectOutputStream tmpOut = null;
-
- // Get the input and output streams, using temp objects because
- // member streams are final
- try {
- tmpOut = new ObjectOutputStream(socket.getOutputStream());
- tmpIn = new ObjectInputStream(socket.getInputStream());
- } catch (IOException e) {
- mHandler.obtainMessage(BluetoothSync.CONNECTION_FAILED).sendToTarget();
- e.printStackTrace();
- }
- objectInput = tmpIn;
- objectOuput = tmpOut;
- }
- /* Call this from the main activity to shutdown the connection */
- public void cancel() {
- try {
- mmSocket.close();
- } catch (IOException e) {
- }
- }
- @Override
- public void run() {
- // Keep listening to the InputStream until an exception occurs
- while (true) {
- try {
- Object inputObject = objectInput.readObject();
- if(inputObject instanceof SyncMessage){
- handleMessage((SyncMessage) inputObject);
- }
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- break;
- }
- }
- }
-
- /**
- * Handles a received synchronization message.
- * @param message The received message.
- */
- private void handleMessage(SyncMessage message){
- Log.i("CommunicationThread", "Recieved: " + message.getMessage_code());
- switch(message.getMessage_code()){
- case SyncMessage.SYNC_REQUEST:
- HashMap<String, Long> devices_remote = (HashMap<String, Long>) message.getPayload();
- HashMap<String, Long> devices_local = mdbh.getSyncDevices();
- ArrayList<SyncInfoRecord> syncInfo = mdbh.getSyncInfo();
- long tracing_timestamp = 0;
- //TODO "TRACING" zentral definieren
- if(devices_local.containsKey("TRACING"))
- tracing_timestamp = devices_local.get("TRACING");
-
- for(Iterator<String> i = devices_remote.keySet().iterator(); i.hasNext(); ){
- String key = i.next();
- if((devices_local.containsKey(key) && devices_local.get(key) >= devices_remote.get(key))
- || (tracing_timestamp > devices_remote.get(key))){
- Log.i("CommunicationThread", "Removed: " + key);
- i.remove();
- }
- }
- mdbh.updateSyncDevices(devices_remote);
-
- for ( Iterator<SyncInfoRecord> i = syncInfo.iterator(); i.hasNext(); ){
- SyncInfoRecord info = i.next();
- if(devices_remote.containsKey(info.getDeviceID())){
- Log.i("CommunicationThread", "Removed from SyncInfo: " + info.getDeviceID());
- i.remove();
- }
- }
-
- write(new SyncMessage(SyncMessage.SYNC_RESPONSE_SYNC_INFO, syncInfo));
- write(new SyncMessage(SyncMessage.SYNC_RESPONSE_NET_INFO, mdbh.getNetworkInformation()));
- break;
- case SyncMessage.SYNC_RESPONSE_NET_INFO:
- ArrayList<NetworkRecord> netInfo = (ArrayList<NetworkRecord>) message.getPayload();
- mdbh.updateNetworkInformation(netInfo);
- mHandler.obtainMessage(BluetoothSync.SYNC_SUCCESSFUL).sendToTarget();
- break;
- case SyncMessage.SYNC_RESPONSE_SYNC_INFO:
- ArrayList<SyncInfoRecord> syncInfo_new = (ArrayList<SyncInfoRecord>) message.getPayload();
- mdbh.updateSyncInfo(syncInfo_new);
- break;
- default:
- //TODO DEFAULT WITH UNKNOWN MESSAGE CODE;
- }
- }
-
- /* Call this from the main activity to send data to the remote device */
- public void write(SyncMessage message) {
- try {
- objectOuput.writeObject(message);
- //TODO NACHRICHT SCHICKEN? mHandler.obtainMessage(BluetoothSync.MESSAGE_SENT).sendToTarget();
- } catch (IOException e) {
- mHandler.obtainMessage(BluetoothSync.CONNECTION_FAILED).sendToTarget();
- e.printStackTrace();
- }
- }
- }
|