import java.util.*;
import java.io.*;
public class Linker {
PrintWriter[] dataOut;
BufferedReader[] dataIn;
BufferedReader dIn;
int myId, N;
Connector connector;
public IntLinkedList neighbors = new IntLinkedList();
public Linker(String basename, int id, int numProc) throws Exception {
myId = id;
N = numProc;
dataIn = new BufferedReader[numProc];
dataOut = new PrintWriter[numProc];
Topology.readNeighbors(myId, N, neighbors);
connector = new Connector();
connector.Connect(basename, myId, numProc, dataIn, dataOut);
}
public void sendMsg(int destId, String tag, String msg) {
Util.println("Sending msg to " + destId + ":" +tag + " " + msg);
dataOut[destId].println(myId + " " + destId + " " + tag + " " + msg + "#");
dataOut[destId].flush();
}
public void sendMsg(int destId, String tag) {
sendMsg(destId, tag, " 0 ");
}
public void multicast(IntLinkedList destIds, String tag, String msg) {
for (int i=0; i<destIds.size(); i++) {
sendMsg(destIds.getEntry(i), tag, msg);
}
}
public Message receiveMsg(int fromId) throws IOException {
String getline = dataIn[fromId].readLine();
Util.println(" received message " + getline);
StringTokenizer st = new StringTokenizer(getline);
int srcId = Integer.parseInt(st.nextToken());
int destId = Integer.parseInt(st.nextToken());
String tag = st.nextToken();
String msg = st.nextToken("#");
return new Message(srcId, destId, tag, msg);
}
public int getMyId() { return myId; }
public int getNumProc() { return N; }
public void close() {connector.closeSockets();}
public static void main(String[] args) throws Exception {
new Linker(args[0], Integer.parseInt(args[1]), Integer.parseInt(args[2]));
}
}