package voip; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.StringTokenizer; public class SIPManager extends UDPManager { / SIPMsg sipMsg = null; SIPManager(int port, SIPMsg sipMsg) { super(port); this.sipMsg = sipMsg; System.out.println("SIPManager: " + myAddr.toString() + ":" + myPort); } protected DatagramPacket rewritePacket (DatagramPacket packet) { DatagramPacket newPacket = new DatagramPacket(new byte[Constants.MAX_PACKET_SIZE], Constants.MAX_PACKET_SIZE); String packetStr = new String(packet.getData(),0,packet.getLength()); String strFrom = null; long tStart = System.currentTimeMillis(); try { // This packet is from my client! strFrom = "client"; // Fill in the data at the first-time if (clientAddr == null) { clientAddr = packet.getAddress(); clientPort = packet.getPort(); } // Change the port number in the packet to be mine. packetStr = replacePortNumber(packet, clientPort, myPort); newPacket.setData(packetStr.getBytes()); // Set the new destination newPacket.setAddress(clientAddr); newPacket.setPort(clientPort); // Update to the current SIP method in the given packet packetStr = new String(newPacket.getData(),0,newPacket.getLength()); packetStr = sipMsg.executeSIPMethod(packetStr, strFrom); newPacket.setData(packetStr.getBytes()); long tEnd = System.currentTimeMillis(); System.out.println("\nrewritten packet: " + System.currentTimeMillis() + " time diff: " + (tEnd - tStart) + "\n" + new String(newPacket.getData(),0,newPacket.getLength())); } catch(UnknownHostException e) { System.out.println("Unable to create host: " + e.getMessage()); e.printStackTrace(); } return newPacket; } protected String replacePortNumber(DatagramPacket packet, int fromPort, int toPort) { StringBuffer buffer = new StringBuffer(new String(packet.getData(),0,packet.getLength())); String strFromPort = ":" + fromPort; String strToPort = ":" + toPort; int i = 0; int max = buffer.length(); int nFromPort = strFromPort.length(); while (i < max) { if ((i = buffer.indexOf(strFromPort, i)) == -1) { // No more matches break; } else { // Replace the port number as proxy's buffer.replace(i, i + nFromPort, strToPort); } i += nFromPort; } strFromPort = "=" + fromPort; strToPort = "=" + toPort; i = 0; max = buffer.length(); nFromPort = strFromPort.length(); while (i < max) { if ((i = buffer.indexOf(strFromPort, i)) == -1) { // No more matches break; } else { // Replace the port number as proxy's buffer.replace(i, i + nFromPort, strToPort); } i += nFromPort; } return buffer.toString(); } public String toString() { return "SIPManager:\n" + super.toString(); } }