Skip to content

Commit

Permalink
Fix dna to receive messages from multiple peers
Browse files Browse the repository at this point in the history
  • Loading branch information
lakeman committed May 2, 2011
1 parent 1967ac9 commit 040e6c3
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 51 deletions.
82 changes: 50 additions & 32 deletions src/org/servalproject/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
import org.servalproject.dna.VariableResults;
import org.servalproject.dna.VariableType;
import org.servalproject.system.NativeTask;
import org.sipdroid.sipua.ui.Receiver;

import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
Expand Down Expand Up @@ -134,6 +136,7 @@ public void onCreate(Bundle savedInstanceState) {
this.batteryTemperature = (TextView)findViewById(R.id.batteryTempText);
this.batphoneNumber = (EditText)findViewById(R.id.batphoneNumberText);
this.batphoneNumber.setText(application.getPrimaryNumber());
this.batphoneNumber.setSelectAllOnFocus(true);
this.batphoneNumber.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN &&
Expand Down Expand Up @@ -393,7 +396,6 @@ public void onDestroy() {

public void onResume() {
Log.d(MSG_TAG, "Calling onResume()");
this.showRadioMode();
super.onResume();

// Check, if the battery-temperature should be displayed
Expand All @@ -414,6 +416,10 @@ public void onResume() {

// Toggles between start and stop screen
this.toggleStartStop();
if (this.startBtn.getVisibility()==View.VISIBLE)
this.startBtn.requestFocus();
else
this.stopBtn.requestFocus();
}

private static final int MENU_SETUP = 0;
Expand Down Expand Up @@ -479,45 +485,57 @@ private void showPeerList() {
FileParser fileParser = new FileParser(ServiceStatus.PEER_FILE_LOCATION);
ArrayList<PeerRecord> peers=fileParser.getPeerList();

// build a map from IP address to phone number via a dna query
Dna dna=new Dna();
InetAddress localHost=Inet4Address.getLocalHost();
dna.addStaticPeer(localHost);
dna.setDynamicPeers(peers);

final Map<InetAddress, String> peerDids = new HashMap<InetAddress, String>();
AlertDialog.Builder alert=new AlertDialog.Builder(currentInstance);
alert.setTitle("Peers");

dna.readVariable(null, "", VariableType.DIDs, (byte)-1, new VariableResults(){
@Override
public void result(SocketAddress peer, SubscriberId sid,
VariableType varType, byte instance, InputStream value) {

try{
InetSocketAddress inetAddr=(InetSocketAddress) peer;
peerDids.put(inetAddr.getAddress(), Packet.unpackDid(value));
} catch (IOException e) {
e.printStackTrace();
if (peers.isEmpty()){
alert.setMessage("No Peers found");
}else{
// build a map from IP address to phone number via a dna query
Dna dna=new Dna();
dna.setDynamicPeers(peers);

final Map<InetAddress, String> peerDids = new HashMap<InetAddress, String>();

dna.readVariable(null, "", VariableType.DIDs, (byte)-1, new VariableResults(){
@Override
public void result(SocketAddress peer, SubscriberId sid,
VariableType varType, byte instance, InputStream value) {

try{
InetSocketAddress inetAddr=(InetSocketAddress) peer;
peerDids.put(inetAddr.getAddress(), Packet.unpackDid(value));
} catch (IOException e) {
e.printStackTrace();
}
}
});


ArrayList<String> labels=new ArrayList<String>();
final ArrayList<String> numbers=new ArrayList<String>();

for (PeerRecord peer: peers){
String phNumber=peerDids.get(peer.getAddress());
numbers.add(phNumber);

labels.add((phNumber==null?peer.getAddress():phNumber)+" ("+peer.getLinkScore()+")");
}
});


ArrayList<String> labels=new ArrayList<String>();

String label=peerDids.get(localHost);
if (label!=null) labels.add(localHost.toString()+" (local) "+label);

for (PeerRecord pc: peers){
String phNumber=peerDids.get(pc.getAddress());
labels.add(pc.toString()+(phNumber==null?"":" "+phNumber));
alert.setItems(labels.toArray(new String[labels.size()]), new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
String number = numbers.get(which);
if (number!=null){
Receiver.engine(MainActivity.this).call(number);
}
}
});
}

AlertDialog.Builder alert=new AlertDialog.Builder(currentInstance);
alert.setTitle("Peers");
alert.setItems(labels.toArray(new String[labels.size()]), null);
alert.setPositiveButton("Ok", null);
alert.show();
} catch (Exception e) {
Log.e("Batphone",e.toString(),e);
application.displayToastMessage(e.toString());
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/org/servalproject/ServalBatPhoneApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,8 @@ public boolean startAdhoc(Handler trafficHandler) {

return true;
} catch (Exception e) {
this.displayToastMessage(e.toString());
Log.v("BatPhone",e.toString(),e);
this.displayMessage(e.toString());
return false;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/org/servalproject/StatusNotification.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public void run() {
int peerCount;

try {
peerCount=fileParser.getPeerCount();
peerCount=fileParser.getPeerCount() +1;
} catch (IOException e) {
peerCount=-1;
Log.v("BatPhone",e.toString(),e);
Expand Down
27 changes: 12 additions & 15 deletions src/org/servalproject/dna/Dna.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,23 +46,23 @@ public void setDynamicPeers(List<PeerRecord> batmanPeers){
// packets that we may need to (re-)send
List<PeerConversation> resendQueue=new ArrayList<PeerConversation>();
// responses that we are still waiting for
Map<Long, PeerConversation> awaitingResponse=new HashMap<Long, PeerConversation>();
Map<PeerConversation.Id, PeerConversation> awaitingResponse=new HashMap<PeerConversation.Id, PeerConversation>();

private void send(PeerConversation pc) throws IOException{
DatagramPacket dg=pc.packet.getDatagram();
dg.setSocketAddress(pc.addr);
dg.setSocketAddress(pc.id.addr);
if (s==null){
s=new DatagramSocket();
s.setBroadcast(true);
}
Log.d("BatPhone", "Sending packet to "+pc.addr);
Log.d("BatPhone", "Sending packet to "+pc.id.addr);
Log.v("BatPhone", pc.packet.toString());
s.send(dg);
pc.retryCount++;

if (!resendQueue.contains(pc)){
resendQueue.add(pc);
awaitingResponse.put(pc.packet.transactionId, pc);
awaitingResponse.put(pc.id, pc);
}
}

Expand Down Expand Up @@ -90,12 +90,16 @@ private void receivePacket() throws IOException{
}
s.setSoTimeout(timeout);
s.receive(reply);
SocketAddress addr=reply.getSocketAddress();
Packet p=Packet.parse(reply);
PeerConversation pc=awaitingResponse.get(p.transactionId);
PeerConversation.Id id=new PeerConversation.Id(p.transactionId, addr);

PeerConversation pc=awaitingResponse.get(id);

if (pc!=null){
pc.processResponse(p);
if (pc.conversationComplete)
awaitingResponse.remove(p.transactionId);
awaitingResponse.remove(id);
}else{
Log.d("BatPhone", "Unexpected packet from "+reply.getSocketAddress());
Log.v("BatPhone", p.toString());
Expand Down Expand Up @@ -301,13 +305,9 @@ public void readVariable(SubscriberId sid, String did, final VariableType var, f
p.operations.add(new OpGet(var, instance, (short)0));

sendParallel(p, new OpVisitor(){
byte received = 0;
byte count = -1;

@Override
public boolean onDone(Packet packet, byte count) {
this.count=count;
return count==received;
return true;
}

@Override
Expand All @@ -316,10 +316,7 @@ public boolean onData(Packet packet, VariableRef reference,
// inform the caller of this variable, create an input stream for the caller to read the value.
results.result(packet.addr, packet.getSid(), reference.varType, reference.instance,
new ReadInputStream(packet.getSid(), reference.varType, reference.instance, packet.addr, buffer, varLen));
received++;
if (var.hasMultipleValues()&&instance==-1)
return received==count;
return true;
return false;
}
});
}
Expand Down
27 changes: 25 additions & 2 deletions src/org/servalproject/dna/PeerConversation.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,31 @@
import java.net.SocketAddress;

public class PeerConversation {
static class Id{
long transId;
SocketAddress addr;
Id(long transId, SocketAddress addr){
this.transId=transId;
this.addr=addr;
}

@Override
public int hashCode() {
return (int) transId ^ addr.hashCode();
}

@Override
public boolean equals(Object o) {
if (o instanceof Id){
Id x = (Id)o;
return x.transId==this.transId && x.addr.equals(this.addr);
}
return false;
}
}

Id id;
Packet packet;
SocketAddress addr;
boolean responseReceived=false;
boolean conversationComplete=false;
int retryCount=0;
Expand All @@ -17,8 +40,8 @@ public class PeerConversation {
}

PeerConversation(Packet packet, SocketAddress addr, OpVisitor vis){
this.id=new Id(packet.transactionId, addr);
this.packet=packet;
this.addr=addr;
this.vis=vis;
}

Expand Down

0 comments on commit 040e6c3

Please sign in to comment.