package com.cgcl.cloudesk.manage.net; import java.io.IOException; import java.io.InputStream; import com.cgcl.cloudesk.manage.app.AppData; import com.cgcl.cloudesk.manage.com.Handler; import com.cgcl.cloudesk.manage.config.NetConfig; import com.cgcl.cloudesk.manage.config.PacketConfig; import com.cgcl.cloudesk.manage.log.LogService; import com.cgcl.cloudesk.manage.packet.PacketBase; import com.cgcl.cloudesk.manage.util.NetUtil; import com.cgcl.cloudesk.manage.util.Serializer; import com.cgcl.cloudesk.screens.act.BaseActivity; import com.cgcl.cloudesk.screens.act.MainActivity; import com.cgcl.cloudesk.screens.act.UI; public class InputThread extends Thread { private boolean bTerminate = false; private Handler handler = null; private InputStream is = null; private byte[] inputBuf = new byte[NetConfig.inputBufLen]; private int inputBufPos = 0; private UI ui = null; public InputThread(Handler handler, InputStream is) { this.handler = handler; this.is = is; } public void run() { // InputThread can only run once if(bTerminate) { return; } // main loop while(!bTerminate) { // read inputstream int inputLen = -1; try { inputLen = is.read(inputBuf, inputBufPos, inputBuf.length - inputBufPos); } catch (IOException e) { LogService.getInstance().WriteLog("ReadError : " + e.getMessage()+ " inputBufPos = " + inputBufPos); // if (MainActivity.isInitSuceessed == false) ((BaseActivity) BaseActivity.CurrentActivity).showError(); } System.out.println("input Len: " + inputLen); // meet the end of the inputstream if(-1 == inputLen) { bTerminate = true; continue; } // change the current pos inputBufPos += inputLen; // analyze the byte array int tempInputBufPos = 0; PacketBase packet = null; do { System.out.println("tempInputBufPos = " + tempInputBufPos +" inputBufPos - tempInputBufPos = " + (inputBufPos - tempInputBufPos)); packet = NetUtil.produce(inputBuf, tempInputBufPos, inputBufPos - tempInputBufPos); System.out.println("produce"); // move the left data to front if(null == packet) { System.out.println("packet == null ; break"); System.arraycopy(inputBuf, tempInputBufPos, inputBuf, 0, inputBufPos - tempInputBufPos); inputBufPos -= tempInputBufPos; break; } //if the packet is too long if( packet.getType() == PacketConfig.kWarningPacketType) { int packetLen = Serializer.deserializeInt(inputBuf, tempInputBufPos + PacketConfig.kLenPos); byte[] tmpInputBuf = new byte[packetLen]; System.arraycopy(inputBuf, tempInputBufPos, tmpInputBuf, 0, inputBufPos - tempInputBufPos); try { while( 0 != (tmpInputBuf.length - (inputBufPos - tempInputBufPos)) ) { inputLen = is.read(tmpInputBuf, (inputBufPos - tempInputBufPos), tmpInputBuf.length - (inputBufPos - tempInputBufPos)); inputBufPos += inputLen; } } catch (IOException e) { LogService.getInstance().WriteLog("WarningPacketError : " + " " + e.getMessage()); e.printStackTrace(); } packet = NetUtil.produce(tmpInputBuf, 0, tmpInputBuf.length); handler.handle(packet); inputBufPos = 0; break; } // move tempInputBufPos forward System.out.println("packet type = " + (int)packet.getType()); System.out.println("packet length = " + packet.length()); tempInputBufPos += packet.length(); // handle the entire packet System.out.println("handler.handle(packet);"); handler.handle(packet); } while(true); } inputBufPos = 0; bTerminate = true; } public void terminate() { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block LogService.getInstance().WriteLog("InputTerminateError = " +" " + e.getMessage()); e.printStackTrace(); } } }