package cc.glsn.v15.print; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import cc.glsn.SerialChunk; import cc.glsn.v15.PCMonitor; public class PrintQ { public static void main(String[] args) { new PrintQ(); } PCMonitor Q; public PrintQ() { Q=new PCMonitor(); ServerSocket SS=null; try { SS = new ServerSocket(Globals.ServerPort); } catch (IOException e) { System.out.println("Unable to open server socket."); // TODO Auto-generated catch block e.printStackTrace(); System.exit(1); } while(SS.isBound()) { try { Socket S=SS.accept(); new ConnHandler(S).start(); } catch (IOException e) { System.out.println("Error accepting connection."); // TODO Auto-generated catch block //e.printStackTrace(); } } } private class ConnHandler extends Thread { Socket Sock; ConnHandler(Socket S) { Sock=S; PendingReq=null; } PrintRequest PendingReq; public void run() { try { while(Sock.isConnected()) { PrintMessage M=(PrintMessage)SerialChunk.readSerialObject(Sock.getInputStream()); if (M instanceof PrintMessageReqJob) { PrintMessagePushJob R=new PrintMessagePushJob(); PendingReq=Q.consume(); R.Req=PendingReq; SerialChunk.writeSerialObject(Sock.getOutputStream(),R); PrintMessageAck A=(PrintMessageAck)SerialChunk.readSerialObject(Sock.getInputStream()); PendingReq=null; } else if (M instanceof PrintMessagePushJob) { PrintMessagePushJob R=(PrintMessagePushJob)M; Q.produce(R.Req); System.out.println("Enqueued job: " + R.Req.toString()); PrintMessageAck A=new PrintMessageAck(); SerialChunk.writeSerialObject(Sock.getOutputStream(),A); return; } else { throw new IOException("Unknown type of message: " + M.getClass().getName()); } } } catch(IOException e) { System.out.println("IO error in client connection. Closing."); close(); //e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); close(); } } private void close() { if (Sock!=null) try{Sock.close();}catch(Exception e2){}; if (PendingReq!=null) { Q.produce(PendingReq); PendingReq=null; } } } }