package NET.worlds.console; import NET.worlds.core.IniFile; import NET.worlds.scape.CDAudio; import java.awt.Dimension; import java.awt.Rectangle; import java.io.IOException; import java.util.Enumeration; import java.util.Vector; public class RealG2 implements Runnable, MainCallback, MainTerminalCallback { private static RealG2 instance = new RealG2(); private Thread realThread; private Vector requestList = new Vector(2, 1); private boolean cancel; private boolean isPlaying = false; private RealG2() { this.realThread = new Thread(this); this.realThread.start(); } public static RealG2 get() { return instance; } @Override public void run() { boolean initerror = false; this.cancel = false; Main.register(this); while (!this.cancel) { if (!this.requestList.isEmpty()) { CDAudio.get().setEnabled(false); } while (!this.requestList.isEmpty()) { this.startPlaying(); try { initRealG2(); } catch (IOException var5) { this.cancel = true; initerror = true; } while (!this.requestList.isEmpty()) { RealG2.RG2Request request = this.requestList.firstElement(); this.requestList.removeElementAt(0); try { this.browse(request.getURL(), request.getPosition()); } catch (IOException var4) { } } if (!initerror) { closeRealG2(); } this.stopPlaying(); if (this.requestList.isEmpty()) { CDAudio.get().setEnabled(true); } } if (!this.cancel) { this.timedWait(15); } } Main.unregister(this); } private synchronized void timedWait(int secs) { if (!this.cancel) { try { this.wait(secs * 1000); } catch (InterruptedException var3) { } } } private synchronized void startPlaying() { this.isPlaying = true; } private synchronized void stopPlaying() { this.isPlaying = false; } public synchronized boolean playing() { return this.isPlaying; } public void pleaseStopNow() { if (this.playing()) { this.setPlayInterrupt(); while (this.playing()) { try { this.wait(500L); } catch (InterruptedException var2) { } } } } public void pleaseStop() { this.setPlayInterrupt(); } public static boolean isInstalled() { IniFile ini = new IniFile("RealPlayer"); return ini.getIniInt("HasReal", 0) != 0; } public void play(String urlin) throws IOException { this.play(urlin, null); } public void play(String urlin, Rectangle placementin) throws IOException { if (!isInstalled()) { throw new IOException(); } else { RealG2.RG2Request r = new RealG2.RG2Request(urlin, placementin); this.requestList.addElement(r); this.setPlayInterrupt(); this.realThread.interrupt(); } } private Rectangle getAdPartPlacement() { Rectangle placement = null; Console c = Console.getActive(); if (c != null) { AdPart ap = null; Enumeration e = c.getParts(); while (e.hasMoreElements()) { Object o = e.nextElement(); if (o instanceof AdPart) { ap = (AdPart)o; break; } } if (ap != null) { placement = new Rectangle(ap.getLocationOnScreen(), new Dimension(ap.getWindow().fullWidth(), ap.getWindow().fullHeight())); } } return placement; } private Rectangle getMapPartPlacement() { Rectangle placement = null; Console c = Console.getActive(); if (c != null) { MapPart ap = null; Enumeration e = c.getParts(); while (e.hasMoreElements()) { Object o = e.nextElement(); if (o instanceof MapPart) { ap = (MapPart)o; break; } } if (ap != null) { placement = new Rectangle(ap.getLocationOnScreen(), ap.getSize()); } } return placement; } public void browse(String url, Rectangle placement) throws IOException { int x = -1; int y = -1; int w = -1; int h = -1; if (placement != null) { x = placement.x; y = placement.y; w = placement.width; h = placement.height; } else if ((placement = this.getMapPartPlacement()) != null) { x = placement.x - 18; y = placement.y - 34; w = placement.width; h = placement.height; } try { browse(url, x, y, w, h); } catch (IOException var8) { this.close(); throw var8; } } @Override public void mainCallback() { } @Override public void terminalCallback() { this.close(); } public void close() { this.cancel = true; playInterrupt(); this.realThread.interrupt(); } private static native void browse(String var0, int var1, int var2, int var3, int var4) throws IOException; private static native void initRealG2() throws IOException; private static native void closeRealG2(); private static native void playInterrupt(); public synchronized void setPlayInterrupt() { if (this.playing()) { playInterrupt(); } } public class RG2Request { private String url = null; private Rectangle position = null; public RG2Request(String u, Rectangle r) { this.url = u; this.position = r; } public Rectangle getPosition() { return this.position; } public String getURL() { return this.url; } } }