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 availableIDs; public static final int BROADCAST = 0; public Network(int n) { this.n = n; this.users = new User[n]; this.availableIDs = new ArrayBlockingQueue(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); } } }