package com.flaremicro.crossjeeves.net; import static com.flaremicro.crossjeeves.net.ErrorCodes.*; import java.io.File; import java.io.IOException; import java.net.Socket; import java.util.Properties; import java.util.Random; import com.flaremicro.crossjeeves.CrossJeevesHost; import com.flaremicro.crossjeeves.ScriptProcessor; import com.flaremicro.crossjeeves.net.packet.Packet; import com.flaremicro.crossjeeves.net.packet.Packet0Identify; import com.flaremicro.crossjeeves.net.packet.Packet127KeepAlive; import com.flaremicro.crossjeeves.net.packet.Packet1Status; import com.flaremicro.crossjeeves.net.packet.Packet2Script; import com.flaremicro.crossjeeves.net.packet.Packet3Clone; import com.flaremicro.crossjeeves.net.packet.Packet5Artifact; import com.flaremicro.crossjeeves.net.packet.Packet4FileData; import com.flaremicro.crossjeeves.net.packet.Packet6Disconnect; import com.flaremicro.crossjeeves.net.packet.Packet7LogEntry; public class ServerHandler extends NetworkHandler { private CrossJeevesHost host; private ScriptProcessor scriptProcessor; private File workspace = new File("./workspace/"+new Random().nextLong()+"/"); public ServerHandler(Socket socket, CrossJeevesHost host, Properties properties) throws IOException { super(socket); this.host = host; this.scriptProcessor = new ScriptProcessor(this, workspace, properties); } public void disconnect(int code, String message) { enqueue(new Packet6Disconnect(code, message)); try { Thread.sleep(1000L); } catch (InterruptedException e) { if(isConnected()) e.printStackTrace(); } super.disconnect(code, message); } @Override protected void doDisconnect(int exitCode) { scriptProcessor.terminate(); host.removeConnection(this); super.doDisconnect(exitCode); } @Override public void handlePacket(Packet packet) { disconnect(INVALID_PACKET_RECIEVED.id, "Recieved invalid packet " + packet.getId() + " (Unknown)"); } @Override public void handlePacket(Packet0Identify packet) { System.out.println("Got valid identify packet with flags " + packet.getFlags() + " and version " + packet.getProtocolVersion()); enqueue(new Packet0Identify(0)); } @Override public void handlePacket(Packet1Status packet) { } @Override public void handlePacket(Packet2Script packet) { scriptProcessor.processAsync(packet.script); } @Override public void handlePacket(Packet3Clone packet) { try { this.beginFile(packet.getFileID(), packet.getFileSize()); } catch (IOException e) { disconnect(FILE_DOWNLOAD_FAILURE.id, "Failed to start download of transferred file"); } } @Override public void handlePacket(Packet4FileData packet) { try { this.appendFile(packet.getFileId(), packet.getFileChunk()); } catch (IOException e) { e.printStackTrace(); disconnect(FILE_DOWNLOAD_FAILURE.id, "Failed to download transferred file"); } } @Override public void handlePacket(Packet5Artifact packet) { disconnect(INVALID_PACKET_RECIEVED.id, "Recieved invalid packet " + packet.getId() + " (Artifact)"); } @Override public void handlePacket(Packet127KeepAlive packet) { } @Override public void handlePacket(Packet6Disconnect packet) { System.out.printf("Disconnect %d: %s%n", packet.getCode(), packet.getReason()); doDisconnect(packet.getCode()); } public void init() { this.beginWriteThread(); this.beginReadThread(); } @Override public void handlePacket(Packet7LogEntry packet) { // TODO Auto-generated method stub } }