package org.reunionemu.jreunion.network.protocol; import java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.reunionemu.jcommon.ParsedItem; import org.reunionemu.jcommon.Parser; import org.reunionemu.jreunion.server.ClassFactory; import org.reunionemu.jreunion.server.Client; import org.reunionemu.jreunion.server.Reference; public abstract class Protocol { public static Pattern login = Pattern.compile("^(?:\\d+[\\r\\n]+)(?:(?:login|play)[\\r\\n]+)?(?:.+[\\r\\n]+)*$"); private static List<Class<?>> protocols = new Vector<Class<?>>(); public Protocol (){ } public static boolean testLogin(String input) { System.out.println(input); Matcher matcher = login.matcher(input); return matcher.matches(); } public static Protocol find(Client client, byte [] data) { for(Class<?> protocolClass : protocols){ Protocol protocol = (Protocol) ClassFactory.create(protocolClass, client); List<String> decrypted = protocol.decryptServer(data.clone()); if(decrypted.size()>0 && testLogin(decrypted.get(0))){ return (Protocol) ClassFactory.create(protocol.getClass(), client); } } return null; } public static void main(String[] args) { String input = "1111\nlogin\njake\ntest\n"; System.out.println(testLogin(input)); } public static void load() throws ClassNotFoundException{ protocols.clear(); Parser protocolConfig = new Parser(); try { protocolConfig.Parse("config/Protocols.dta"); Iterator<ParsedItem> iter = protocolConfig.getItemListIterator(); while(iter.hasNext()){ ParsedItem item = iter.next(); Class<?> protocolName = Class.forName(item.getMemberValue("Class")); protocols.add(protocolName); } } catch (IOException e) { e.printStackTrace(); } } public abstract List<String> decryptServer(byte data[]); public abstract byte[] encryptServer(List<String> data); //Optional public List<String> decryptClient(byte [] data) { throw new UnsupportedOperationException(); } //Optional public byte[] encryptClient(String data) { throw new UnsupportedOperationException(); } }