/* * XCTrack - XContest Live Tracking client for J2ME devices * Copyright (C) 2009 Petr Chromec <petr@xcontest.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.xcontest.xctrack; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Vector; import javax.microedition.io.Connector; import javax.microedition.io.Datagram; import javax.microedition.io.SocketConnection; import javax.microedition.io.StreamConnection; import javax.microedition.io.UDPDatagramConnection; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import org.xcontest.xctrack.config.Config; import org.xcontest.xctrack.info.InfoCenter; import org.xcontest.xctrack.util.Log; class ScreenInfo { ScreenInfo(Displayable d, ScreenListener l) { disp = d; listener = l; } Displayable disp; ScreenListener listener; } public class App extends MIDlet { private static App _instance; public static String getMidletVersion() { String ver = _instance.getAppProperty("MIDlet-Version"); return ver == null ? "" : ver; } public App() { _instance = this; _display = Display.getDisplay(this); _displayables = new Vector(); Log.clear(); Log.info("------- started"); Config.init(); _infoCenter = new InfoCenter(); _infoCenter.start(); (new MainScreen()).show(); // if (Config.isFirstRun()) // Util.showInfo("Hello for the first time!"); } public static Display getDisplay() { return _instance._display; } public void testUDP() { try { UDPDatagramConnection conn = (UDPDatagramConnection)Connector.open("datagram://"+Config.getUDPServerHost()+":"+Config.getUDPServerPort()); byte[] bytes = new byte[]{97,98,99}; Datagram dgm = conn.newDatagram(bytes,bytes.length); // dgm.reset(); // dgm.setAddress("datagram://"+Config.getUDPServerHost()+":"+Config.getUDPServerPort()); // dgm.setData(bytes, 0, bytes.length); conn.send(dgm); conn.close(); Util.showInfo(dgm.getAddress()); } catch (IOException e) { Util.showInfo(e.getMessage()); } } public void testTCP() { try { SocketConnection conn = (SocketConnection)Connector.open("socket://"+Config.getUDPServerHost()+":"+Config.getUDPServerPort()); InputStream is = conn.openInputStream(); OutputStream os = conn.openOutputStream(); os.write(new byte[]{'4','\r','\n','a','h','o','j','\r','\n'}); os.close(); is.close(); conn.close(); } catch (IOException e) { Util.showInfo(e.getMessage()); } } public void testHTTP() { try { StreamConnection conn = (StreamConnection)Connector.open("http://live.xcontest.org"); InputStream is = conn.openInputStream(); int cnt = 0; while (is.read() != -1) cnt ++; Util.showInfo(""+cnt); } catch (IOException e) { Util.showInfo(e.getMessage()); } } public static Displayable getCurrentDisplayable() { synchronized(_instance._displayables) { int n = _instance._displayables.size(); Displayable d = n >= 1 ? ((ScreenInfo)_instance._displayables.elementAt(n-1)).disp : null; return d; } } public static void showScreen(Displayable disp, ScreenListener listener) { showScreen(disp,listener,false); } public static void showScreen(Displayable disp) { showScreen(disp,null,false); } public static void showScreen(Displayable disp, ScreenListener listener, boolean isModal) { synchronized(_instance._displayables) { _instance._displayables.addElement(new ScreenInfo(disp,listener)); _instance._display.setCurrent(disp); } if (listener != null) listener.screenShown(disp,true); } public static void hideScreen(Displayable disp) { ScreenInfo info = null; synchronized(_instance._displayables) { if (Util.expect(!_instance._displayables.isEmpty(),"App.hideScreen(): no screen to hide!")) { int size = _instance._displayables.size(); while (size > 0 && ((ScreenInfo)_instance._displayables.elementAt(size-1)).disp != disp) _instance._displayables.removeElementAt(--size); if (Util.expect(size > 0,"App.hideScreen(): specified screen not found!")) { _instance._displayables.removeElementAt(--size); if (size > 0) { info = (ScreenInfo)_instance._displayables.elementAt(size-1); _instance._display.setCurrent(info.disp); } } } } if (info.listener != null) info.listener.screenShown(info.disp,false); } public static void exit() { _instance.cleanup(); _instance.notifyDestroyed(); } public boolean isPaused() { return _isPaused; } public void startApp() { _isPaused = false; Log.info("startApp()"); } public void pauseApp() { _isPaused = true; Log.info("pauseApp()"); } public void destroyApp(boolean unconditional) throws MIDletStateChangeException { if (!unconditional) { throw new MIDletStateChangeException(); } else { cleanup(); } } private void cleanup() { _infoCenter.exit(); } // Live client listener implementation public void connectionOpened(String remote) {} public void loginFailed(String domain, String username) {} public void openConnectionFailed(String remote) {} public void statusUpdate() {} private boolean _isPaused; private Vector _displayables; private Display _display; private static InfoCenter _infoCenter; }