package org.kevoree.android.bluetooth; import android.bluetooth.BluetoothDevice; import android.util.Log; import eu.powet.android.rfcomm.IRfcomm; import java.util.ArrayDeque; import java.util.HashMap; import java.util.Queue; /** * Created with IntelliJ IDEA. * User: max * Date: 23/05/12 * Time: 11:40 */ public class MessageManager implements QueueMessageThreadListener { // Debugging private static final String TAG = "MessageManager"; private static final boolean D = true; private IRfcomm rfComm; private HashMap<String, ArrayDeque<byte[]>> recipients; public MessageManager(IRfcomm rfcomm) { this.rfComm = rfcomm; recipients = new HashMap<String, ArrayDeque<byte[]>>(); } /** * Will send the message to the specified destNode when possible * @param destNode msg recipient * @param msg serialized message */ public synchronized void sendMessage(String destNode, byte[] msg) { if (D) Log.i(TAG, "BEGIN sendMessage"); if (recipients.containsKey(destNode)) { // we already have a message queue for this node recipients.get(destNode).add(msg); if (D) Log.i(TAG, "mess added in queue for "+destNode); String queueStr = ""; for (byte[] buffer : recipients.get(destNode)) { queueStr += new String(buffer); } Log.i(TAG, "queue="+queueStr); } else { // we have to create a new entry for this node ArrayDeque<byte[]> queue = new ArrayDeque<byte[]>(); queue.add(msg); recipients.put(destNode, queue); if (D) Log.i(TAG, "new mess queue added for "+destNode); SendQueuedMessageThread t = new SendQueuedMessageThread(rfComm, destNode, queue); t.addListener(this); t.start(); } } public boolean hasMessageToDeliver() { return !recipients.isEmpty(); } public boolean hasMessageToDeliver(BluetoothDevice device) { return recipients.containsKey(device.getName()); } @Override public void onThreadEnding(String destNode) { recipients.remove(destNode); } }