/* * Vorlesung "Vernetzte Systeme" WS 1999/2000, Prof. Dr. F. Mattern * ---------------------------------------------------------------- * Packet.java: * Encapsulates packets into a simple one-line String (no newlines). * */ public class Packet { private static char DELIMITER = ','; /* see "man ascii" for ASCII table */ private static char EOL = 10; /* Protect Newline "\n" (0x0A) */ private static char EOL_QUOTED = 7; /* by replacing it with BEL (0x07) */ private int id; private String data; /* Constructor: create new (empty) packet */ public Packet () { this.id = -1; this.data = null; } /* Constructor: create new packet from id and data * (packager takes care of size) */ public Packet (int id, String data) { this.id = id; this.data = data; } /* Constructor: initialize new packet (parse) from inputLine */ public Packet (String inputLine) { int data_idx = inputLine.indexOf(DELIMITER); this.id = Integer.valueOf( inputLine.substring(0,data_idx)).intValue(); this.data = unquote(inputLine.substring(data_idx+1)); } /* re-initialize (empty) packet with data, bound by packetsize */ public String fill (int id, String data, int packetSize) { this.id = id; this.data = data.substring(0,packetSize-1); /* returns left-over data that did not fit */ return data.substring(packetSize); } /* return packet id */ public int id() { return this.id; } /* return packet data */ public String data() { return this.data; } /* return one-line string representation of both ID and data */ public String asString() { return (formatACK(id) + String.valueOf(DELIMITER) + quote(data)); } public static String formatACK (int id) { /* uugh! ugly as sin. but hey, who cares!? */ return ((id < 10000 ? "0" : "") + (id < 1000 ? "0" : "") + (id < 100 ? "0" : "") + (id < 10 ? "0" : "") + id); } /* returns quoted (i.e. newlines are substituted) representation * of data to send over string */ private String quote (String data) { return data.replace(EOL, EOL_QUOTED); } /* replaces substitution characters with newlines */ private String unquote (String data) { return data.replace(EOL_QUOTED, EOL); } }