project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/NetplayService.java
changeset 7330 867e4fda496e
child 7332 3f2e130f9715
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/NetplayService.java	Mon Jul 16 20:16:03 2012 +0200
@@ -0,0 +1,117 @@
+package org.hedgewars.hedgeroid.netplay;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Collections;
+
+import org.hedgewars.hedgeroid.Utils;
+import org.hedgewars.hedgeroid.netplay.JnaFrontlib.MetaschemePtr;
+import org.hedgewars.hedgeroid.netplay.JnaFrontlib.NetconnPtr;
+
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.CountDownTimer;
+import android.os.IBinder;
+
+public class NetplayService extends Service {
+	static {
+		System.loadLibrary("SDL_net");
+	}
+	public static final JnaFrontlib FRONTLIB = (JnaFrontlib)Native.loadLibrary("frontlib", JnaFrontlib.class, Collections.singletonMap(Library.OPTION_TYPE_MAPPER, FrontlibTypeMapper.INSTANCE));
+
+	private final NetplayBinder binder = new NetplayBinder();
+	public NetconnPtr netconn;
+	private CountDownTimer timer;
+	private String playerName;
+	
+	@Override
+	public IBinder onBind(Intent intent) {
+		return binder;
+	}
+	
+	@Override
+	public void onCreate() {
+		if(FRONTLIB.flib_init() != 0) {
+			throw new RuntimeException("Unable to start frontlib");
+		}
+	}
+	
+	@Override
+	public void onDestroy() {
+		disconnect();
+		FRONTLIB.flib_quit();
+	}
+
+	/**
+	 * Connect to the official Hedgewars server.
+	 * 
+	 * @throws IOException if the metascheme file can't be read or the connection to the server fails
+	 */
+	public void connect(String playerName) throws IOException {
+		connect(playerName, "140.247.62.101", 46631);
+	}
+	
+	/**
+	 * Connect to the server with the given hostname and port
+	 * 
+	 * @throws IOException if the metascheme file can't be read or the connection to the server fails
+	 */
+	public void connect(String playerName, String host, int port) throws IOException {
+		if(playerName == null) {
+			playerName = "Player";
+		}
+		this.playerName = playerName;
+		MetaschemePtr meta = null;
+		try {
+			String metaschemePath = new File(Utils.getDataPathFile(this), "metasettings.ini").getAbsolutePath();
+			meta = FRONTLIB.flib_metascheme_from_ini(metaschemePath);
+			if(meta == null) {
+				throw new RuntimeException("Missing metascheme");
+			}
+			netconn = FRONTLIB.flib_netconn_create(playerName, meta, Utils.getDataPathFile(this).getAbsolutePath(), host, port);
+	    	timer = new CountDownTimer(Long.MAX_VALUE, 50) {
+				@Override
+				public void onTick(long millisUntilFinished) {
+					if(netconn != null) {
+						FRONTLIB.flib_netconn_tick(netconn);
+					}
+				}
+				
+				@Override
+				public void onFinish() {
+				}
+			};
+			timer.start();
+		} catch(FileNotFoundException e) {
+			throw new RuntimeException(e);
+		} finally {
+			FRONTLIB.flib_metascheme_release(meta);
+		}
+	}
+	
+	public void disconnect() {
+		if(timer != null) {
+			timer.cancel();
+		}
+		if(netconn != null) {
+			FRONTLIB.flib_netconn_send_quit(netconn, "User quit");
+			FRONTLIB.flib_netconn_destroy(netconn);
+			netconn = null;
+		}
+	}
+	
+	public class NetplayBinder extends Binder {
+		NetplayService getService() {
+            return NetplayService.this;
+        }
+	}
+
+	public String getPlayerName() {
+		return playerName;
+	}
+}