71 lines
2.1 KiB
Java
71 lines
2.1 KiB
Java
package Communication;
|
|
|
|
import com.google.protobuf.InvalidProtocolBufferException;
|
|
import com.google.protobuf.Message;
|
|
import meerkat.protobuf.DKGMessages.*;
|
|
import java.util.Queue;
|
|
import java.util.concurrent.ArrayBlockingQueue;
|
|
/**
|
|
* Created by Tzlil on 2/7/2016.
|
|
* JointFeldamn protocol assumes all parties can communicate throw broadcast chanel
|
|
* and private chanel (for each pair)
|
|
* this class simulates it
|
|
*/
|
|
public class Network {
|
|
|
|
protected final User[] users;
|
|
protected final int n;
|
|
protected final Queue<Integer> availableIDs;
|
|
public static final int BROADCAST = 0;
|
|
|
|
|
|
public Network(int n) {
|
|
this.n = n;
|
|
this.users = new User[n];
|
|
this.availableIDs = new ArrayBlockingQueue<Integer>(n);
|
|
for (int id = 1; id <= n; id++){
|
|
availableIDs.add(id);
|
|
}
|
|
}
|
|
|
|
public User connect(MailHandler mailHandler){
|
|
Integer id = availableIDs.poll();
|
|
if (id == null)
|
|
return null;
|
|
users[id - 1] = new User(id,this,mailHandler);
|
|
return users[id - 1];
|
|
}
|
|
|
|
protected boolean sendMessage(User sender,int destination,Mail.Type type,Message message){
|
|
if(destination < 1 || destination > n)
|
|
return false;
|
|
User user = users[destination - 1];
|
|
if (user == null)
|
|
return false;
|
|
Mail mail = Mail.newBuilder()
|
|
.setSender(sender.getID())
|
|
.setDestination(destination)
|
|
.setIsPrivate(true)
|
|
.setType(type)
|
|
.setMessage(message.toByteString())
|
|
.build();
|
|
return user.mailbox.add(mail);
|
|
}
|
|
|
|
protected void sendBroadcast(User sender,Mail.Type type,Message message){
|
|
User user;
|
|
Mail mail = Mail.newBuilder()
|
|
.setSender(sender.getID())
|
|
.setDestination(BROADCAST)
|
|
.setIsPrivate(false)
|
|
.setType(type)
|
|
.setMessage(message.toByteString())
|
|
.build();
|
|
for (int i = 0 ; i < n ; i++){
|
|
user = users[i];
|
|
user.mailbox.add(mail);
|
|
}
|
|
}
|
|
|
|
}
|