package com.cari.voip.keyboard.stack.parsers; import java.io.IOException; import java.io.Reader; import java.net.SocketException; import com.cari.voip.keyboard.stack.events.Packet; public class PacketParser implements IPacketParser { private int packetType = Packet.TYPE_INVALIDE; private Reader reader = null; private static boolean prevEndR = false; private static boolean prevEndN = false; private static int invalidLine = 0; private String firstLine = null; private char []cbuf = new char[1]; public char []bodyBuf = new char[128]; @Override public synchronized Packet getNextPacket() throws PacketParseException{ Packet packet = null; int type = Packet.TYPE_INVALIDE; int invalidPeek = 3; String line = null; StringBuilder invalidLineBuilder = null; line = this.readLine(); if(line == null){ throw new PacketParseException("�����ж�"); } while(invalidPeek > 0){ //System.out.print(line+"\n"); type = Packet.getPacketTypeFromLine(line); if(type != Packet.TYPE_INVALIDE){ packet = new Packet(type); break; } invalidLine++; invalidPeek--; if(invalidLineBuilder == null){ invalidLineBuilder = new StringBuilder(); } invalidLineBuilder.append(line); line = this.readLine(); } if(invalidPeek < 1 ){ //System.out.print("��ͷʧ�䣺\n"); throw new PacketParseException("��ͷʧ�䣺"+ ((invalidLineBuilder==null)?"":invalidLineBuilder.toString())); } if(packet != null){ try{ packet.setPacketFromParser(this); } catch(PacketParseException e){ packet = null; throw e; } } return packet; } public synchronized char readChar(){ char c = (char)-1; if(this.reader != null){ try { int n = this.reader.read(cbuf); if(n > 0){ c = cbuf[0]; } else if(n == -1){ //reach end of stream; } else { //error } } catch (Exception e) { // TODO Auto-generated catch block //e.printStackTrace(); } } return c; } public synchronized String readLine() throws PacketParseException { int endLen = 0; int lineLen = 0; boolean newLine = false; StringBuilder sb = new StringBuilder(64); if(this.reader != null){ while(true){ char c = this.readChar(); if(c == '\n' || c == '\r'){ endLen++; if(lineLen > 0 || endLen >=2){ newLine = true; } else{ if(c == '\n'){ newLine = prevEndR?false:true; } else{ newLine = prevEndN?false:true; } } if(newLine == true){ if(c == '\n'){ prevEndN = true; prevEndR = false; }else{ prevEndN = false; prevEndR = true; } break; } } else if(c != (char)-1){ lineLen++; sb.append(c); } else { prevEndR = false; prevEndN = false; break; } } } else { throw new PacketParseException("���󣺰�������readerΪ��"); } if(lineLen == 0){ if(newLine == false){ return null; } return ""; } return sb.toString(); } @Override public synchronized void setInput(Reader in) { reset(); this.reader = in; } protected void reset() { packetType = Packet.TYPE_INVALIDE; } public Reader getReader(){ return this.reader; } }