diff -r fec6fa1e460e -r 38acbfdb484f project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java Thu Aug 02 16:35:12 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java Thu Aug 02 16:36:11 2012 +0200 @@ -5,6 +5,7 @@ import org.hedgewars.hedgeroid.R; import org.hedgewars.hedgeroid.Utils; +import org.hedgewars.hedgeroid.netplay.JnaFrontlib.BoolCallback; import org.hedgewars.hedgeroid.netplay.JnaFrontlib.IntStrCallback; import org.hedgewars.hedgeroid.netplay.JnaFrontlib.MetaschemePtr; import org.hedgewars.hedgeroid.netplay.JnaFrontlib.NetconnPtr; @@ -40,11 +41,15 @@ public static final String EXTRA_PLAYERNAME = "playerName"; public static final String EXTRA_MESSAGE = "message"; public static final String EXTRA_HAS_ERROR = "hasError"; + public static final String EXTRA_REASON = "reason"; 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"; public static final String ACTION_PASSWORD_REQUESTED = ACTIONPREFIX+"PASSWORD_REQUESTED"; + public static final String ACTION_ENTERED_ROOM_FROM_LOBBY = ACTIONPREFIX+"ENTERED_ROOM"; + public static final String ACTION_LEFT_ROOM = ACTIONPREFIX+"LEFT_ROOM"; + public static final String ACTION_STATE_CHANGED = ACTIONPREFIX+"STATE_CHANGED"; public static final String DEFAULT_SERVER = "netserver.hedgewars.org"; public static final int DEFAULT_PORT = 46631; @@ -54,13 +59,14 @@ private final FromNetHandler fromNetHandler = new FromNetHandler(); private State state; - private int foregroundUsers = 0; + private int foregroundUsers = 0; // Reference counter of clients requesting foreground tick speed (fast ticks) + private boolean chief; // Do we control the current room? // null if there is no running connection (==state is NOT_CONNECTED) private ThreadedNetConnection connection; - public final PlayerList playerList = new PlayerList(); - public final RoomList roomList = new RoomList(); + public final Playerlist playerList = new Playerlist(); + public final Roomlist roomList = new Roomlist(); public final MessageLog lobbyChatlog; public final MessageLog roomChatlog; @@ -96,7 +102,7 @@ } clearState(); - state = State.CONNECTING; + changeState(State.CONNECTING); connection = ThreadedNetConnection.startConnection(appContext, fromNetHandler, name, host, port); connection.setFastTickRate(foregroundUsers > 0); } @@ -106,7 +112,12 @@ public void sendQuit(String message) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_QUIT, message); } public void sendRoomlistRequest() { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_ROOMLIST_REQUEST); } public void sendPlayerInfoQuery(String name) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_PLAYER_INFO_REQUEST, name); } - public void sendChat(final String s) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_CHAT, s); } + public void sendChat(String s) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_CHAT, s); } + public void sendFollowPlayer(String nick) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_FOLLOW_PLAYER, nick); } + public void sendJoinRoom(String name) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_JOIN_ROOM, name); } + public void sendCreateRoom(String name) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_CREATE_ROOM, name); } + public void sendLeaveRoom(String message) { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_SEND_LEAVE_ROOM, message); } + public void disconnect() { sendToNet(ThreadedNetConnection.ToNetHandler.MSG_DISCONNECT, "User Quit"); } private static Netplay instance; @@ -133,6 +144,17 @@ return state; } + private void changeState(State newState) { + if(newState != state) { + state = newState; + broadcastManager.sendBroadcastSync(new Intent(ACTION_STATE_CHANGED)); + } + } + + public boolean isChief() { + return chief; + } + /** * Indicate that you want network messages to be checked regularly (several times per second). * As long as nobody requests fast ticks, the network is only checked once every few seconds @@ -191,15 +213,19 @@ final class FromNetHandler extends Handler { public static final int MSG_LOBBY_JOIN = 0; public static final int MSG_LOBBY_LEAVE = 1; - public static final int MSG_CHAT = 2; - public static final int MSG_MESSAGE = 3; - public static final int MSG_ROOM_ADD = 4; - public static final int MSG_ROOM_UPDATE = 5; - public static final int MSG_ROOM_DELETE = 6; - public static final int MSG_ROOMLIST = 7; - public static final int MSG_CONNECTED = 8; - public static final int MSG_DISCONNECTED = 9; - public static final int MSG_PASSWORD_REQUEST = 10; + public static final int MSG_ROOM_JOIN = 2; + public static final int MSG_ROOM_LEAVE = 3; + public static final int MSG_CHAT = 4; + public static final int MSG_MESSAGE = 5; + public static final int MSG_ROOM_ADD = 6; + public static final int MSG_ROOM_UPDATE = 7; + public static final int MSG_ROOM_DELETE = 8; + public static final int MSG_ROOMLIST = 9; + public static final int MSG_CONNECTED = 10; + public static final int MSG_DISCONNECTED = 11; + public static final int MSG_PASSWORD_REQUEST = 12; + public static final int MSG_ENTER_ROOM_FROM_LOBBY = 13; + public static final int MSG_LEAVE_ROOM = 14; public FromNetHandler() { super(Looper.getMainLooper()); @@ -221,6 +247,18 @@ lobbyChatlog.appendPlayerLeave(args.first, args.second); break; } + case MSG_ROOM_JOIN: { + String name = (String)msg.obj; + // TODO roomPlayerList.addPlayerWithNewId(name); + roomChatlog.appendPlayerJoin(name); + break; + } + case MSG_ROOM_LEAVE: { + Pair args = (Pair)msg.obj; + // TODO roomPlayerList.removePlayer(args.first); + roomChatlog.appendPlayerLeave(args.first, args.second); + break; + } case MSG_CHAT: { Pair args = (Pair)msg.obj; getCurrentLog().appendChat(args.first, args.second); @@ -248,13 +286,13 @@ break; } case MSG_CONNECTED: { - state = State.LOBBY; + changeState(State.LOBBY); broadcastManager.sendBroadcast(new Intent(ACTION_CONNECTED)); break; } case MSG_DISCONNECTED: { Pair args = (Pair)msg.obj; - state = State.NOT_CONNECTED; + changeState(State.NOT_CONNECTED); connection = null; Intent intent = new Intent(ACTION_DISCONNECTED); intent.putExtra(EXTRA_HAS_ERROR, args.first); @@ -268,6 +306,22 @@ broadcastManager.sendBroadcast(intent); break; } + case MSG_ENTER_ROOM_FROM_LOBBY: { + roomChatlog.clear(); + changeState(State.ROOM); + chief = (Boolean)msg.obj; + Intent intent = new Intent(ACTION_ENTERED_ROOM_FROM_LOBBY); + broadcastManager.sendBroadcastSync(intent); + break; + } + case MSG_LEAVE_ROOM: { + changeState(State.LOBBY); + Intent intent = new Intent(ACTION_LEFT_ROOM); + intent.putExtra(EXTRA_MESSAGE, (String)msg.obj); + intent.putExtra(EXTRA_REASON, msg.arg1); + broadcastManager.sendBroadcastSync(intent); + break; + } default: { Log.e("FromNetHandler", "Unknown message type: "+msg.what); break; @@ -332,6 +386,8 @@ } FLIB.flib_netconn_onLobbyJoin(conn, lobbyJoinCb, null); FLIB.flib_netconn_onLobbyLeave(conn, lobbyLeaveCb, null); + FLIB.flib_netconn_onRoomJoin(conn, roomJoinCb, null); + FLIB.flib_netconn_onRoomLeave(conn, roomLeaveCb, null); FLIB.flib_netconn_onChat(conn, chatCb, null); FLIB.flib_netconn_onMessage(conn, messageCb, null); FLIB.flib_netconn_onRoomAdd(conn, roomAddCb, null); @@ -341,6 +397,9 @@ FLIB.flib_netconn_onRoomlist(conn, roomlistCb, null); FLIB.flib_netconn_onDisconnected(conn, disconnectCb, null); FLIB.flib_netconn_onPasswordRequest(conn, passwordRequestCb, null); + FLIB.flib_netconn_onEnterRoom(conn, enterRoomCb, null); + FLIB.flib_netconn_onLeaveRoom(conn, leaveRoomCb, null); + FLIB.flib_metascheme_release(meta); tickHandler.start(); } @@ -375,6 +434,16 @@ } }; + private final StrCallback roomJoinCb = new StrCallback() { + public void callback(Pointer context, String name) { + sendFromNet(FromNetHandler.MSG_ROOM_JOIN, name); + } + }; + private final StrStrCallback roomLeaveCb = new StrStrCallback() { + public void callback(Pointer context, String name, String message) { + sendFromNet(FromNetHandler.MSG_ROOM_LEAVE, Pair.create(name, message)); + } + }; private final StrStrCallback chatCb = new StrStrCallback() { public void callback(Pointer context, String name, String msg) { sendFromNet(FromNetHandler.MSG_CHAT, Pair.create(name, msg)); @@ -425,6 +494,18 @@ } }; + private final BoolCallback enterRoomCb = new BoolCallback() { + public void callback(Pointer context, boolean isChief) { + sendFromNet(FromNetHandler.MSG_ENTER_ROOM_FROM_LOBBY, Boolean.TRUE); + } + }; + + private final IntStrCallback leaveRoomCb = new IntStrCallback() { + public void callback(Pointer context, int reason, String message) { + sendFromNet(FromNetHandler.MSG_LEAVE_ROOM, reason, message); + } + }; + private void shutdown(boolean error, String message) { if(conn != null) { FLIB.flib_netconn_destroy(conn); @@ -448,7 +529,7 @@ case JnaFrontlib.NETCONN_DISCONNECT_AUTH_FAILED: return res.getString(R.string.error_auth_failed); case JnaFrontlib.NETCONN_DISCONNECT_CONNLOST: - return res.getString(R.string.error_connection_lost, message); + return res.getString(R.string.error_connection_lost); case JnaFrontlib.NETCONN_DISCONNECT_INTERNAL_ERROR: return res.getString(R.string.error_unexpected, message); case JnaFrontlib.NETCONN_DISCONNECT_SERVER_TOO_OLD: @@ -476,7 +557,12 @@ public static final int MSG_SEND_ROOMLIST_REQUEST = 3; public static final int MSG_SEND_PLAYER_INFO_REQUEST = 4; public static final int MSG_SEND_CHAT = 5; - public static final int MSG_DISCONNECT = 6; + public static final int MSG_SEND_FOLLOW_PLAYER = 6; + public static final int MSG_SEND_JOIN_ROOM = 7; + public static final int MSG_SEND_CREATE_ROOM = 8; + public static final int MSG_SEND_LEAVE_ROOM = 9; + + public static final int MSG_DISCONNECT = 10; public ToNetHandler(Looper looper) { super(looper); @@ -511,6 +597,24 @@ } break; } + case MSG_SEND_FOLLOW_PLAYER: { + FLIB.flib_netconn_send_playerFollow(conn, (String)msg.obj); + break; + } + case MSG_SEND_JOIN_ROOM: { + FLIB.flib_netconn_send_joinRoom(conn, (String)msg.obj); + break; + } + case MSG_SEND_CREATE_ROOM: { + FLIB.flib_netconn_send_createRoom(conn, (String)msg.obj); + break; + } + case MSG_SEND_LEAVE_ROOM: { + if(FLIB.flib_netconn_send_leaveRoom(conn, (String)msg.obj) == 0) { + sendFromNet(FromNetHandler.MSG_LEAVE_ROOM, -1, ""); + } + break; + } case MSG_DISCONNECT: { FLIB.flib_netconn_send_quit(conn, (String)msg.obj); shutdown(false, "User quit");