1 package net.sourceforge.simplegamenet.framework.transport;
2
3 import java.io.ObjectInputStream;
4 import java.io.ObjectOutputStream;
5 import java.io.Serializable;
6 import java.net.Socket;
7 import net.sourceforge.simplegamenet.framework.model.ChatMessage;
8 import net.sourceforge.simplegamenet.framework.model.ClientEngineImpl;
9 import net.sourceforge.simplegamenet.specs.to.GameSettings;
10 import net.sourceforge.simplegamenet.specs.to.PlayerSettings;
11
12 public class ClientModem extends Modem implements PacketCodes {
13
14 private ClientEngineImpl clientEngine;
15
16 private ClientConnection clientConnection;
17
18 private boolean active = true;
19
20 public ClientModem(ClientEngineImpl clientEngine, Socket socket,
21 ObjectInputStream objectInputStream,
22 ObjectOutputStream objectOutputStream) {
23 taskQueue = new TaskQueue(true);
24 this.clientEngine = clientEngine;
25 clientConnection = new ClientConnection(this, socket, objectInputStream,
26 objectOutputStream);
27 taskQueue.start();
28 clientConnection.start();
29 }
30
31 public void processPacketInEventThread(Packet packet) {
32 taskQueue.addTask(new ClientPacketTask(this, packet));
33 }
34
35 public void processPacket(Packet packet) {
36 switch (packet.getPacketCode()) {
37
38 case CON_SERVER_PONG:
39
40 break;
41 case CON_SERVER_PING:
42
43 break;
44
45 case E_CHAT_MESSAGE:
46 break;
47 case CHAT_GRANT_MESSAGE:
48 if (!(packet.getData() instanceof ChatMessage)) {
49 leaveProtocolViolatingServer();
50 return;
51 }
52 clientEngine.receiveChatMessage((ChatMessage) packet.getData());
53 break;
54
55 case E_GAME_CHANGE_GAME_SETTINGS_GAME_IN_PROGRESS:
56
57 break;
58 case E_GAME_CHANGE_GAME_SETTINGS_NOT_ACCEPTED:
59
60 break;
61 case GAME_UPDATE_GAME_SETTINGS:
62 if (!(packet.getData() instanceof GameSettings)) {
63 leaveProtocolViolatingServer();
64 return;
65 }
66 clientEngine.updateGameSettings((GameSettings) packet.getData());
67 break;
68
69 case CON_ADD_PLAYER:
70 if (!(packet.getData() instanceof PlayerSettings)) {
71 leaveProtocolViolatingServer();
72 return;
73 }
74 clientEngine.addPlayer((PlayerSettings) packet.getData());
75 break;
76
77 case E_GAME_CHANGE_PLAYER_SETTINGS_GAME_IN_PROGRESS:
78
79 break;
80 case E_GAME_CHANGE_PLAYER_SETTINGS_NOT_ACCEPTED:
81
82 break;
83 case GAME_UPDATE_PLAYER_SETTINGS:
84 if (!(packet.getData() instanceof PlayerSettings)) {
85 leaveProtocolViolatingServer();
86 return;
87 }
88 clientEngine.updatePlayerSettings((PlayerSettings) packet.getData());
89 break;
90
91 case CON_REMOVE_PLAYER_BY_LEFT:
92 if (!(packet.getData() instanceof Integer)) {
93 leaveProtocolViolatingServer();
94 return;
95 }
96 clientEngine.removePlayer((Integer) packet.getData(), RemovePlayerType.LEFT);
97 break;
98 case CON_KICK:
99 quitJoinedGame(RemovePlayerType.KICKED);
100 break;
101 case CON_REMOVE_PLAYER_BY_KICK:
102 if (!(packet.getData() instanceof Integer)) {
103 leaveProtocolViolatingServer();
104 return;
105 }
106 clientEngine.removePlayer((Integer) packet.getData(), RemovePlayerType.KICKED);
107 break;
108 case CON_BAN:
109 quitJoinedGame(RemovePlayerType.BANNED);
110 break;
111 case CON_REMOVE_PLAYER_BY_BAN:
112 if (!(packet.getData() instanceof Integer)) {
113 leaveProtocolViolatingServer();
114 return;
115 }
116 clientEngine.removePlayer((Integer) packet.getData(), RemovePlayerType.BANNED);
117 break;
118 case CON_REMOVE_PLAYER_BY_DISCONNECTION:
119 if (!(packet.getData() instanceof Integer)) {
120 leaveProtocolViolatingServer();
121 return;
122 }
123 clientEngine.removePlayer((Integer) packet.getData(),
124 RemovePlayerType.DISCONNECTED);
125 break;
126 case CON_REMOVE_PLAYER_BY_CLIENT_VIOLATION:
127 if (!(packet.getData() instanceof Integer)) {
128 leaveProtocolViolatingServer();
129 return;
130 }
131 clientEngine.removePlayer((Integer) packet.getData(),
132 RemovePlayerType.PROTOCOL_VIOLATION_KICKED);
133 break;
134 case CON_REMOVE_PLAYER_BY_SERVER_VIOLATION:
135 if (!(packet.getData() instanceof Integer)) {
136 leaveProtocolViolatingServer();
137 return;
138 }
139 clientEngine.removePlayer((Integer) packet.getData(),
140 RemovePlayerType.PROTOCOL_VIOLATION_LEFT);
141 break;
142 case CON_SERVER_CON_CLOSE:
143 quitJoinedGame(RemovePlayerType.HOSTING_STOPPED);
144 break;
145
146 case E_GAME_CLIENT_START_GAME:
147
148 break;
149
150 case GAME_SERVER_GAME_STARTED:
151 clientEngine.gameStarted();
152 break;
153
154 case GAME_SERVER_SEND_DATA:
155 clientEngine.receiveData(packet.getData());
156 break;
157
158 case E_GAME_CLIENT_ABORT_GAME:
159
160 break;
161
162 case GAME_SERVER_GAME_STOPPING:
163 clientEngine.gameStopping();
164 clientConnection.sendPacket(new Packet(GAME_CLIENT_CONFIRM_GAME_STOPPING, null));
165 break;
166 case GAME_SERVER_GAME_ABORTING:
167 clientEngine.gameAborting();
168 clientConnection.sendPacket(new Packet(GAME_CLIENT_CONFIRM_GAME_ABORTING, null));
169 break;
170
171 case GAME_SERVER_GAME_ENDED:
172 clientEngine.gameEnded();
173 break;
174
175 case E_CON_CLIENT_VIOLATION:
176 quitJoinedGame(RemovePlayerType.HOSTING_STOPPED);
177 break;
178
179 default:
180 leaveProtocolViolatingServer();
181 }
182 }
183
184
185
186
187 public void sendChatMessage(ChatMessage chatMessage) {
188 clientConnection.sendPacket(new Packet(CHAT_ASK_MESSAGE, chatMessage));
189 }
190
191 public void changeGameSettings(GameSettings gameSettings) {
192 clientConnection.sendPacket(new Packet(GAME_CHANGE_GAME_SETTINGS, gameSettings));
193 }
194
195 public void changePlayerSettings(PlayerSettings playerSettings) {
196 clientConnection.sendPacket(new Packet(GAME_CHANGE_PLAYER_SETTINGS, playerSettings));
197 }
198
199 public void startGame() {
200 clientConnection.sendPacket(new Packet(GAME_CLIENT_START_GAME, null));
201 }
202
203 public void sendData(Serializable data) {
204 clientConnection.sendPacket(new Packet(GAME_CLIENT_SEND_DATA, data));
205 }
206
207 public void abortGame() {
208 clientConnection.sendPacket(new Packet(GAME_CLIENT_ABORT_GAME, null));
209 }
210
211 public void leaveServer() {
212 clientConnection.sendPacket(new Packet(CON_CLIENT_CON_CLOSE, null));
213 quitJoinedGame(RemovePlayerType.LEFT);
214 }
215
216 public void leaveProtocolViolatingServer() {
217 clientConnection.sendPacket(new Packet(E_CON_SERVER_VIOLATION, null));
218 quitJoinedGame(RemovePlayerType.PROTOCOL_VIOLATION_LEFT);
219 }
220
221 public void processDisconnectionInEventThread() {
222 taskQueue.addTask(new ClientDisconnectionTask(this));
223 }
224
225 public void processDisconnection() {
226 quitJoinedGame(RemovePlayerType.DISCONNECTED);
227 }
228
229 private void quitJoinedGame(int removePlayerType) {
230
231
232 if (active) {
233 taskQueue.close();
234 clientConnection.close();
235 clientEngine.joinedGameQuit(removePlayerType);
236 active = false;
237 }
238 }
239
240 }