/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package gcb; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; /** * * @author wizardus */ public class GarenaReconnect extends Thread implements GarenaListener { Main main; List<ReconnectJob> reconnectJobs; public GarenaReconnect(Main main) { this.main = main; reconnectJobs = new ArrayList<ReconnectJob>(); start(); } public void run() { while(true) { synchronized(reconnectJobs) { int sleepTime = 0; //remove duplicate jobs Set<Integer> seenGarena = new HashSet<Integer>(); Iterator<ReconnectJob> it = reconnectJobs.iterator(); while(it.hasNext()) { ReconnectJob job = it.next(); if(seenGarena.contains(job.garena.id)) { it.remove(); } else { seenGarena.add(job.garena.id); if(sleepTime == 0 || job.time - System.currentTimeMillis() < sleepTime) { sleepTime = (int) (job.time - System.currentTimeMillis()); if(sleepTime == 0) { sleepTime = -1; } } } } //wait for updates or jobs to do if(sleepTime >= 0) { try { reconnectJobs.wait(sleepTime); } catch(InterruptedException ie) {} } //complete jobs passed time it = reconnectJobs.iterator(); while(it.hasNext()) { ReconnectJob job = it.next(); if(job.time <= System.currentTimeMillis()) { GarenaReconnectThread rt = new GarenaReconnectThread(job.garena, main); rt.start(); it.remove(); } } } } } public void chatReceived(GarenaInterface source, MemberInfo member, String chat, boolean whisper) {} public void playerLeft(GarenaInterface source, MemberInfo member) {} public void playerJoined(GarenaInterface source, MemberInfo member) {} public void playerStarted(GarenaInterface source, MemberInfo member) {} //player started playing (started VPN) public void playerStopped(GarenaInterface source, MemberInfo member) {} //player stopped playing public void disconnected(GarenaInterface source, int x) { if(x == GarenaInterface.GARENA_MAIN) { Main.println(5, "[GarenaReconnect] GARENA_MAIN disconnected; reconnecting shortly..."); } else if(x == GarenaInterface.GARENA_PEER) { Main.println(5, "[GarenaReconnect] GARENA_PEER disconnected; reconnecting shortly..."); } else if(x == GarenaInterface.GARENA_ROOM) { Main.println(5, "[GarenaReconnect] GARENA_ROOM disconnected; reconnecting shortly..."); } else { Main.println(6, "[GarenaReconnect] Error: unknown type: " + x); return; } synchronized(reconnectJobs) { reconnectJobs.add(new ReconnectJob(source)); reconnectJobs.notifyAll(); } } class ReconnectJob { GarenaInterface garena; long time; public ReconnectJob(GarenaInterface garena) { this.garena = garena; this.time = System.currentTimeMillis() + 10 * 1000; } } } class GarenaReconnectThread extends Thread { GarenaInterface garena; Main main; public GarenaReconnectThread(GarenaInterface garena, Main main) { this.garena = garena; this.main = main; } public void run() { synchronized(garena) { if(garena.socket == null || garena.socket.isClosed()) { if(!main.initGarena(garena, true)) { garena.disconnected(GarenaInterface.GARENA_MAIN, true); return; } } if(garena.room_socket == null || garena.room_socket.isClosed()) { if(!main.initRoom(garena, true)) { garena.disconnected(GarenaInterface.GARENA_ROOM, true); return; } } if(garena.peer_socket == null || garena.peer_socket.isClosed()) { if(!main.initPeer(garena, true)) { garena.disconnected(GarenaInterface.GARENA_PEER, true); return; } } } } }