View Javadoc

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                  // todo implement
57                  break;
58              case E_GAME_CHANGE_GAME_SETTINGS_NOT_ACCEPTED:
59                  // todo implement
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                  // todo implement
79                  break;
80              case E_GAME_CHANGE_PLAYER_SETTINGS_NOT_ACCEPTED:
81                  // todo implement
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                 // todo implement
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                 // todo implement
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 //   void ping() {
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         // To prevent a disconnection event in the TaskQueue being executed after the user
231         // has disconnected himself
232         if (active) {
233             taskQueue.close();
234             clientConnection.close();
235             clientEngine.joinedGameQuit(removePlayerType);
236             active = false;
237         }
238     }
239 
240 }