diff -r 5673e95ef647 -r 57a508884052 project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/NetplayService.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/NetplayService.java Tue Jul 24 16:57:48 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,317 +0,0 @@ -package org.hedgewars.hedgeroid.netplay; - -import java.io.File; -import java.io.FileNotFoundException; - -import org.hedgewars.hedgeroid.R; -import org.hedgewars.hedgeroid.Utils; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.IntStrCallback; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.MetaschemePtr; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.NetconnPtr; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.RoomArrayPtr; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.RoomCallback; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.RoomListCallback; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.RoomPtr; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.StrCallback; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.StrRoomCallback; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.StrStrCallback; -import org.hedgewars.hedgeroid.netplay.JnaFrontlib.VoidCallback; - -import com.sun.jna.Pointer; - -import android.app.Service; -import android.content.Intent; -import android.os.Binder; -import android.os.IBinder; -import android.support.v4.content.LocalBroadcastManager; -import android.util.Log; - -public class NetplayService extends Service { - // Parameter extras for starting the service - public static final String EXTRA_PLAYERNAME = "playername"; - public static final String EXTRA_PORT = "port"; - public static final String EXTRA_HOST = "host"; - - // Extras in broadcasts - public static final String EXTRA_MESSAGE = "message"; - public static final String EXTRA_HAS_ERROR = "hasError"; - - - private static final String ACTIONPREFIX = "org.hedgewars.hedgeroid.netconn."; - public static final String ACTION_DISCONNECTED = ACTIONPREFIX+"DISCONNECTED"; - public static final String ACTION_CONNECTED = ACTIONPREFIX+"CONNECTED"; - - private static final JnaFrontlib FLIB = Flib.INSTANCE; - public static final String DEFAULT_SERVER = "netserver.hedgewars.org"; - public static final int DEFAULT_PORT = 46631; - - private static final long TICK_INTERVAL_MS_BOUND = 100; - private static final long TICK_INTERVAL_MS_UNBOUND = 2000; - - // null if the service is not active. Only updated from the main thread. - public static NetplayService instance; - - private final NetplayBinder binder = new NetplayBinder(); - private TickHandler tickHandler; - private LocalBroadcastManager broadcastManager; - - private String playerName; - private NetconnPtr conn; - private boolean joined; // True once we have been admitted to the lobby - - public final PlayerList playerList = new PlayerList(); - public final RoomList roomList = new RoomList(); - public MessageLog lobbyChatlog; - public MessageLog roomChatlog; - - @Override - public IBinder onBind(Intent intent) { - Log.d("NetplayService", "onBind"); - tickHandler.setInterval(TICK_INTERVAL_MS_BOUND); - return binder; - } - - @Override - public void onRebind(Intent intent) { - Log.d("NetplayService", "onRebind"); - tickHandler.setInterval(TICK_INTERVAL_MS_BOUND); - } - - @Override - public boolean onUnbind(Intent intent) { - Log.d("NetplayService", "onUnbind"); - tickHandler.setInterval(TICK_INTERVAL_MS_UNBOUND); - return true; - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - Log.d("NetplayService", "onStartCommand"); - if(conn != null) { - Log.e("NetplayService", "Attempt to start while running"); - return START_NOT_STICKY; - } - joined = false; - playerList.clear(); - roomList.clear(); - lobbyChatlog.clear(); - roomChatlog.clear(); - - playerName = intent.getStringExtra(EXTRA_PLAYERNAME); - if(playerName == null) playerName = "Player"; - int port = intent.getIntExtra(EXTRA_PORT, DEFAULT_PORT); - String host = intent.getStringExtra(EXTRA_HOST); - if(host==null) host = DEFAULT_SERVER; - - MetaschemePtr meta = null; - File dataPath; - try { - dataPath = Utils.getDataPathFile(getApplicationContext()); - } catch (FileNotFoundException e) { - stopWithError(getString(R.string.sdcard_not_mounted)); - return START_NOT_STICKY; - } - String metaschemePath = new File(dataPath, "metasettings.ini").getAbsolutePath(); - meta = FLIB.flib_metascheme_from_ini(metaschemePath); - if(meta == null) { - stopWithError(getString(R.string.error_unexpected, "Missing metasettings.ini")); - return START_NOT_STICKY; - } - conn = FLIB.flib_netconn_create(playerName, meta, dataPath.getAbsolutePath(), host, port); - if(conn == null) { - stopWithError(getString(R.string.error_connection_failed)); - return START_NOT_STICKY; - } - FLIB.flib_netconn_onLobbyJoin(conn, lobbyJoinCb, null); - FLIB.flib_netconn_onLobbyLeave(conn, lobbyLeaveCb, null); - FLIB.flib_netconn_onChat(conn, chatCb, null); - FLIB.flib_netconn_onMessage(conn, messageCb, null); - FLIB.flib_netconn_onRoomAdd(conn, roomAddCb, null); - FLIB.flib_netconn_onRoomUpdate(conn, roomUpdateCb, null); - FLIB.flib_netconn_onRoomDelete(conn, roomDeleteCb, null); - FLIB.flib_netconn_onConnected(conn, connectedCb, null); - FLIB.flib_netconn_onRoomlist(conn, roomlistCb, null); - FLIB.flib_netconn_onDisconnected(conn, disconnectCb, null); - FLIB.flib_metascheme_release(meta); - tickHandler.start(); - instance = this; - return START_NOT_STICKY; - } - - private void stopWithoutError() { - Intent intent = new Intent(ACTION_DISCONNECTED); - intent.putExtra(EXTRA_HAS_ERROR, false); - broadcastManager.sendBroadcast(intent); - stopSelf(); - } - - private void stopWithError(String userMessage) { - Intent intent = new Intent(ACTION_DISCONNECTED); - intent.putExtra(EXTRA_MESSAGE, userMessage); - intent.putExtra(EXTRA_HAS_ERROR, true); - broadcastManager.sendBroadcast(intent); - stopSelf(); - } - - @Override - public void onCreate() { - Log.d("NetplayService", "onCreate"); - broadcastManager = LocalBroadcastManager.getInstance(getApplicationContext()); - lobbyChatlog = new MessageLog(getApplicationContext()); - roomChatlog = new MessageLog(getApplicationContext()); - tickHandler = new TickHandler(getMainLooper(), TICK_INTERVAL_MS_UNBOUND, new Runnable() { - public void run() { - if(conn != null) { - FLIB.flib_netconn_tick(conn); - } - } - }); - if(Flib.INSTANCE.flib_init() != 0) { - stopWithError(getString(R.string.error_unexpected, "Unable to start frontlib")); - } - } - - @Override - public void onDestroy() { - instance = null; - Log.d("NetplayService", "onDestroy"); - tickHandler.stop(); - if(conn != null) { - FLIB.flib_netconn_destroy(conn); - conn = null; - } - Flib.INSTANCE.flib_quit(); - } - - public class NetplayBinder extends Binder { - NetplayService getService() { - return NetplayService.this; - } - } - - private StrCallback lobbyJoinCb = new StrCallback() { - public void callback(Pointer context, String arg1) { - playerList.addPlayerWithNewId(arg1); - lobbyChatlog.appendPlayerJoin(arg1); - } - }; - - private StrStrCallback lobbyLeaveCb = new StrStrCallback() { - public void callback(Pointer context, String name, String msg) { - playerList.removePlayer(name); - lobbyChatlog.appendPlayerLeave(name, msg); - } - }; - - private StrStrCallback chatCb = new StrStrCallback() { - public void callback(Pointer context, String name, String msg) { - getCurrentLog().appendChat(name, msg); - } - }; - - private IntStrCallback messageCb = new IntStrCallback() { - public void callback(Pointer context, int type, String msg) { - getCurrentLog().appendMessage(type, msg); - } - }; - - private RoomCallback roomAddCb = new RoomCallback() { - public void callback(Pointer context, RoomPtr roomPtr) { - roomList.addRoomWithNewId(roomPtr); - } - }; - - private StrRoomCallback roomUpdateCb = new StrRoomCallback() { - public void callback(Pointer context, String name, RoomPtr roomPtr) { - roomList.updateRoom(name, roomPtr); - } - }; - - private StrCallback roomDeleteCb = new StrCallback() { - public void callback(Pointer context, String name) { - roomList.removeRoom(name); - } - }; - - private VoidCallback connectedCb = new VoidCallback() { - public void callback(Pointer context) { - broadcastManager.sendBroadcast(new Intent(ACTION_CONNECTED)); - joined = true; - FLIB.flib_netconn_send_request_roomlist(conn); - } - }; - - private RoomListCallback roomlistCb = new RoomListCallback() { - public void callback(Pointer context, RoomArrayPtr arg1, int count) { - roomList.updateList(arg1.getRooms(count)); - } - }; - - private IntStrCallback disconnectCb = new IntStrCallback() { - public void callback(Pointer context, int reason, String arg2) { - switch(reason) { - case JnaFrontlib.NETCONN_DISCONNECT_AUTH_FAILED: - stopWithError(getString(R.string.error_auth_failed)); - break; - case JnaFrontlib.NETCONN_DISCONNECT_CONNLOST: - stopWithError(getString(R.string.error_connection_lost)); - break; - case JnaFrontlib.NETCONN_DISCONNECT_INTERNAL_ERROR: - stopWithError(getString(R.string.error_unexpected, arg2)); - break; - case JnaFrontlib.NETCONN_DISCONNECT_NORMAL: - stopWithoutError(); - break; - case JnaFrontlib.NETCONN_DISCONNECT_SERVER_TOO_OLD: - stopWithError(getString(R.string.error_server_too_old)); - break; - default: - stopWithError(arg2); - break; - } - FLIB.flib_netconn_destroy(conn); - conn = null; - } - }; - - public void disconnect() { - if(conn != null) { - FLIB.flib_netconn_send_quit(conn, "User quit"); - FLIB.flib_netconn_destroy(conn); - conn = null; - } - stopWithoutError(); - } - - public void sendChat(String s) { - FLIB.flib_netconn_send_chat(conn, s); - if(FLIB.flib_netconn_is_in_room_context(conn)) { - roomChatlog.appendChat(playerName, s); - } else { - lobbyChatlog.appendChat(playerName, s); - } - } - - private MessageLog getCurrentLog() { - if(FLIB.flib_netconn_is_in_room_context(conn)) { - return roomChatlog; - } else { - return lobbyChatlog; - } - } - - public void sendNick(String nick) { FLIB.flib_netconn_send_nick(conn, nick); } - public void sendPassword(String password) { FLIB.flib_netconn_send_password(conn, password); } - public void sendQuit(String message) { FLIB.flib_netconn_send_quit(conn, message); } - public void sendRoomlistRequest() { if(joined) FLIB.flib_netconn_send_request_roomlist(conn); } - public void sendPlayerInfoQuery(String name) { FLIB.flib_netconn_send_playerInfo(conn, name); } - - public boolean isConnected() { - return conn != null; - } - - public static boolean isActive() { - return instance!=null; - } -} -