diff -r cd919a2ead4e -r 867e4fda496e project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/NetplayService.java --- /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; + } +}