mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Network protocol rewrite:
* packets don't depend on serialization any longer (and they shouldn't since they are simple DTOs) * support for multiple serialization types - add custom protocols when needed * web client serialization protocol uses gSon
This commit is contained in:
29
.gitattributes
vendored
29
.gitattributes
vendored
@@ -14323,21 +14323,22 @@ src/main/java/forge/net/client/state/InLobbyClientState.java -text
|
|||||||
src/main/java/forge/net/client/state/UnauthorizedClientState.java -text
|
src/main/java/forge/net/client/state/UnauthorizedClientState.java -text
|
||||||
src/main/java/forge/net/client/state/package-info.java -text
|
src/main/java/forge/net/client/state/package-info.java -text
|
||||||
src/main/java/forge/net/package-info.java -text
|
src/main/java/forge/net/package-info.java -text
|
||||||
src/main/java/forge/net/protocol/incoming/AuthorizePacket.java -text
|
src/main/java/forge/net/protocol/ClientProtocol.java -text
|
||||||
src/main/java/forge/net/protocol/incoming/ChatPacket.java -text
|
src/main/java/forge/net/protocol/ClientProtocolJson.java -text
|
||||||
src/main/java/forge/net/protocol/incoming/EchoPacket.java -text
|
|
||||||
src/main/java/forge/net/protocol/incoming/IPacket.java -text
|
|
||||||
src/main/java/forge/net/protocol/incoming/IncorrectPacket.java -text
|
|
||||||
src/main/java/forge/net/protocol/incoming/PacketOpcode.java -text
|
|
||||||
src/main/java/forge/net/protocol/incoming/UnknownPacket.java -text
|
|
||||||
src/main/java/forge/net/protocol/incoming/package-info.java -text
|
|
||||||
src/main/java/forge/net/protocol/outcoming/AuthorizationSuccessfulMessage.java -text
|
|
||||||
src/main/java/forge/net/protocol/outcoming/ChatMessage.java -text
|
|
||||||
src/main/java/forge/net/protocol/outcoming/EchoMessage.java -text
|
|
||||||
src/main/java/forge/net/protocol/outcoming/IMessage.java -text
|
|
||||||
src/main/java/forge/net/protocol/outcoming/IncorrectPacketMessage.java -text
|
|
||||||
src/main/java/forge/net/protocol/outcoming/UnknownPacketMessage.java -text
|
|
||||||
src/main/java/forge/net/protocol/package-info.java -text
|
src/main/java/forge/net/protocol/package-info.java -text
|
||||||
|
src/main/java/forge/net/protocol/toclient/AuthResultPacketClt.java -text
|
||||||
|
src/main/java/forge/net/protocol/toclient/ChatPacketClt.java -text
|
||||||
|
src/main/java/forge/net/protocol/toclient/EchoPacketClt.java -text
|
||||||
|
src/main/java/forge/net/protocol/toclient/ErrorIncorrectPacketClt.java -text
|
||||||
|
src/main/java/forge/net/protocol/toclient/ErrorUnknownPacketClt.java -text
|
||||||
|
src/main/java/forge/net/protocol/toclient/IPacketClt.java -text
|
||||||
|
src/main/java/forge/net/protocol/toserver/AuthorizePacketSrv.java -text
|
||||||
|
src/main/java/forge/net/protocol/toserver/ChatPacketSrv.java -text
|
||||||
|
src/main/java/forge/net/protocol/toserver/EchoPacketSrv.java -text
|
||||||
|
src/main/java/forge/net/protocol/toserver/IPacketSrv.java -text
|
||||||
|
src/main/java/forge/net/protocol/toserver/IncorrectPacketSrv.java -text
|
||||||
|
src/main/java/forge/net/protocol/toserver/UnknownPacketSrv.java -text
|
||||||
|
src/main/java/forge/net/protocol/toserver/package-info.java -text
|
||||||
src/main/java/forge/package-info.java svneol=native#text/plain
|
src/main/java/forge/package-info.java svneol=native#text/plain
|
||||||
src/main/java/forge/properties/ForgePreferences.java svneol=native#text/plain
|
src/main/java/forge/properties/ForgePreferences.java svneol=native#text/plain
|
||||||
src/main/java/forge/properties/NewConstants.java svneol=native#text/plain
|
src/main/java/forge/properties/NewConstants.java svneol=native#text/plain
|
||||||
|
|||||||
5
pom.xml
5
pom.xml
@@ -701,6 +701,11 @@
|
|||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<version>13.0.1</version>
|
<version>13.0.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
<version>2.2.3</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.thoughtworks.xstream</groupId>
|
<groupId>com.thoughtworks.xstream</groupId>
|
||||||
<artifactId>xstream</artifactId>
|
<artifactId>xstream</artifactId>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import org.apache.commons.lang.NotImplementedException;
|
|||||||
|
|
||||||
import forge.game.GameState;
|
import forge.game.GameState;
|
||||||
import forge.net.client.INetClient;
|
import forge.net.client.INetClient;
|
||||||
import forge.net.protocol.outcoming.ChatMessage;
|
import forge.net.protocol.toclient.ChatPacketClt;
|
||||||
|
|
||||||
public class LobbyPlayerRemote extends LobbyPlayer {
|
public class LobbyPlayerRemote extends LobbyPlayer {
|
||||||
|
|
||||||
@@ -31,6 +31,6 @@ public class LobbyPlayerRemote extends LobbyPlayer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hear(LobbyPlayer player, String message) {
|
public void hear(LobbyPlayer player, String message) {
|
||||||
connection.send(new ChatMessage(player.getName(), message));
|
connection.send(new ChatPacketClt(player.getName(), message));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,7 @@ package forge.net.client;
|
|||||||
|
|
||||||
import forge.game.player.LobbyPlayer;
|
import forge.game.player.LobbyPlayer;
|
||||||
import forge.net.client.state.IClientState;
|
import forge.net.client.state.IClientState;
|
||||||
import forge.net.protocol.outcoming.IMessage;
|
import forge.net.protocol.toclient.IPacketClt;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
@@ -14,7 +14,7 @@ public interface INetClient {
|
|||||||
* TODO: Write javadoc for this method.
|
* TODO: Write javadoc for this method.
|
||||||
* @param echoMessage
|
* @param echoMessage
|
||||||
*/
|
*/
|
||||||
void send(IMessage message);
|
void send(IPacketClt message);
|
||||||
|
|
||||||
|
|
||||||
void createPlayer(String playerName);
|
void createPlayer(String playerName);
|
||||||
|
|||||||
@@ -10,20 +10,24 @@ import forge.net.IConnectionObserver;
|
|||||||
import forge.net.client.state.ConnectedClientState;
|
import forge.net.client.state.ConnectedClientState;
|
||||||
import forge.net.client.state.UnauthorizedClientState;
|
import forge.net.client.state.UnauthorizedClientState;
|
||||||
import forge.net.client.state.IClientState;
|
import forge.net.client.state.IClientState;
|
||||||
import forge.net.protocol.incoming.IPacket;
|
import forge.net.protocol.ClientProtocol;
|
||||||
import forge.net.protocol.incoming.PacketOpcode;
|
import forge.net.protocol.ClientProtocolJson;
|
||||||
import forge.net.protocol.outcoming.IMessage;
|
import forge.net.protocol.toclient.IPacketClt;
|
||||||
|
import forge.net.protocol.toserver.IPacketSrv;
|
||||||
|
|
||||||
public class NetClient implements IConnectionObserver, INetClient{
|
public class NetClient implements IConnectionObserver, INetClient{
|
||||||
|
|
||||||
private final IClientSocket socket;
|
private final IClientSocket socket;
|
||||||
private BlockingDeque<IClientState> state = new LinkedBlockingDeque<IClientState>();
|
private final BlockingDeque<IClientState> state = new LinkedBlockingDeque<IClientState>();
|
||||||
private LobbyPlayer player = null;
|
private LobbyPlayer player = null;
|
||||||
|
private final ClientProtocol<IPacketSrv, IPacketClt> protocol;
|
||||||
|
|
||||||
|
|
||||||
public NetClient(IClientSocket clientSocket) {
|
public NetClient(IClientSocket clientSocket) {
|
||||||
socket = clientSocket;
|
socket = clientSocket;
|
||||||
state.push(new ConnectedClientState(this));
|
state.push(new ConnectedClientState(this));
|
||||||
state.push(new UnauthorizedClientState(this));
|
state.push(new UnauthorizedClientState(this));
|
||||||
|
protocol = new ClientProtocolJson();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void autorized() {
|
public void autorized() {
|
||||||
@@ -48,7 +52,7 @@ public class NetClient implements IConnectionObserver, INetClient{
|
|||||||
/** Receives input from network client */
|
/** Receives input from network client */
|
||||||
@Override
|
@Override
|
||||||
public void onMessage(String data) {
|
public void onMessage(String data) {
|
||||||
IPacket p = PacketOpcode.decode(data);
|
IPacketSrv p = protocol.decodePacket(data);
|
||||||
for(IClientState s : state) {
|
for(IClientState s : state) {
|
||||||
if ( s.processPacket(p) )
|
if ( s.processPacket(p) )
|
||||||
break;
|
break;
|
||||||
@@ -57,8 +61,9 @@ public class NetClient implements IConnectionObserver, INetClient{
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void send(IMessage message) {
|
public void send(IPacketClt message) {
|
||||||
socket.send(message.toNetString());
|
String rawData = protocol.encodePacket(message);
|
||||||
|
socket.send(rawData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package forge.net.client.state;
|
package forge.net.client.state;
|
||||||
|
|
||||||
import forge.net.client.INetClient;
|
import forge.net.client.INetClient;
|
||||||
import forge.net.protocol.incoming.EchoPacket;
|
import forge.net.protocol.toclient.EchoPacketClt;
|
||||||
import forge.net.protocol.incoming.IncorrectPacket;
|
import forge.net.protocol.toclient.ErrorIncorrectPacketClt;
|
||||||
import forge.net.protocol.incoming.IPacket;
|
import forge.net.protocol.toclient.ErrorUnknownPacketClt;
|
||||||
import forge.net.protocol.outcoming.EchoMessage;
|
import forge.net.protocol.toserver.EchoPacketSrv;
|
||||||
import forge.net.protocol.outcoming.IncorrectPacketMessage;
|
import forge.net.protocol.toserver.IPacketSrv;
|
||||||
import forge.net.protocol.outcoming.UnknownPacketMessage;
|
import forge.net.protocol.toserver.IncorrectPacketSrv;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -19,22 +19,20 @@ public class ConnectedClientState implements IClientState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean processPacket(IPacket packet ) {
|
public boolean processPacket(IPacketSrv packet ) {
|
||||||
switch( packet.getOpCode() ) {
|
if( packet instanceof EchoPacketSrv) {
|
||||||
case Echo:
|
EchoPacketSrv pe = (EchoPacketSrv)packet;
|
||||||
EchoPacket pe = (EchoPacket)packet;
|
client.send(new EchoPacketClt(pe.getMessage()));
|
||||||
client.send(new EchoMessage(pe.getMessage()));
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case Incorrect:
|
|
||||||
IncorrectPacket pi = (IncorrectPacket)packet;
|
|
||||||
client.send(new IncorrectPacketMessage(pi));
|
|
||||||
return true;
|
|
||||||
|
|
||||||
default:
|
|
||||||
client.send(new UnknownPacketMessage());
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if( packet instanceof IncorrectPacketSrv) {
|
||||||
|
IncorrectPacketSrv pi = (IncorrectPacketSrv)packet;
|
||||||
|
client.send(new ErrorIncorrectPacketClt(pi.getMessage()));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
client.send(new ErrorUnknownPacketClt());
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package forge.net.client.state;
|
package forge.net.client.state;
|
||||||
|
|
||||||
import forge.net.protocol.incoming.IPacket;
|
import forge.net.protocol.toserver.IPacketSrv;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public interface IClientState {
|
public interface IClientState {
|
||||||
boolean processPacket(IPacket data);
|
boolean processPacket(IPacketSrv data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,8 @@ package forge.net.client.state;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.control.ChatArea;
|
import forge.control.ChatArea;
|
||||||
import forge.net.client.INetClient;
|
import forge.net.client.INetClient;
|
||||||
import forge.net.protocol.incoming.ChatPacket;
|
import forge.net.protocol.toserver.ChatPacketSrv;
|
||||||
import forge.net.protocol.incoming.IPacket;
|
import forge.net.protocol.toserver.IPacketSrv;
|
||||||
import forge.net.protocol.incoming.PacketOpcode;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
@@ -19,10 +18,9 @@ public class InLobbyClientState implements IClientState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean processPacket(IPacket data) {
|
public boolean processPacket(IPacketSrv data) {
|
||||||
if( data.getOpCode() == PacketOpcode.Chat)
|
if( data instanceof ChatPacketSrv) {
|
||||||
{
|
ChatPacketSrv cp = (ChatPacketSrv) data;
|
||||||
ChatPacket cp = (ChatPacket) data;
|
|
||||||
// if ( not muted )
|
// if ( not muted )
|
||||||
Singletons.getControl().getLobby().speak(ChatArea.Room, client.getPlayer(), cp.getMessage());
|
Singletons.getControl().getLobby().speak(ChatArea.Room, client.getPlayer(), cp.getMessage());
|
||||||
// else
|
// else
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
package forge.net.client.state;
|
package forge.net.client.state;
|
||||||
|
|
||||||
import forge.net.client.INetClient;
|
import forge.net.client.INetClient;
|
||||||
import forge.net.protocol.incoming.AuthorizePacket;
|
import forge.net.protocol.toclient.AuthResultPacketClt;
|
||||||
import forge.net.protocol.incoming.IPacket;
|
import forge.net.protocol.toserver.AuthorizePacketSrv;
|
||||||
import forge.net.protocol.incoming.PacketOpcode;
|
import forge.net.protocol.toserver.IPacketSrv;
|
||||||
import forge.net.protocol.outcoming.AuthorizationSuccessfulMessage;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
@@ -23,11 +22,11 @@ public class UnauthorizedClientState implements IClientState {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean processPacket(IPacket packet) {
|
public boolean processPacket(IPacketSrv packet) {
|
||||||
if( packet.getOpCode() == PacketOpcode.Authorize ) {
|
if( packet instanceof AuthorizePacketSrv ) {
|
||||||
AuthorizePacket p = (AuthorizePacket)packet;
|
AuthorizePacketSrv p = (AuthorizePacketSrv)packet;
|
||||||
if( true ) { // check credentials here!
|
if( true ) { // check credentials here!
|
||||||
client.send(new AuthorizationSuccessfulMessage(p.getUsername()));
|
client.send(new AuthResultPacketClt(p.getUsername(), true));
|
||||||
|
|
||||||
|
|
||||||
client.createPlayer(p.getUsername());
|
client.createPlayer(p.getUsername());
|
||||||
|
|||||||
9
src/main/java/forge/net/protocol/ClientProtocol.java
Normal file
9
src/main/java/forge/net/protocol/ClientProtocol.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package forge.net.protocol;
|
||||||
|
|
||||||
|
|
||||||
|
/** The protocol is in charge of serialization of internal classes into whatever remote client understands.
|
||||||
|
* Descendants may use different techniques to serialize data, be it Gson, ProtoBuf or common Java serialization */
|
||||||
|
public interface ClientProtocol<TIncoming, TOutComing> {
|
||||||
|
TIncoming decodePacket(String data);
|
||||||
|
String encodePacket(TOutComing packet);
|
||||||
|
}
|
||||||
82
src/main/java/forge/net/protocol/ClientProtocolJson.java
Normal file
82
src/main/java/forge/net/protocol/ClientProtocolJson.java
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
package forge.net.protocol;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
|
|
||||||
|
import forge.net.protocol.toclient.AuthResultPacketClt;
|
||||||
|
import forge.net.protocol.toclient.ChatPacketClt;
|
||||||
|
import forge.net.protocol.toclient.EchoPacketClt;
|
||||||
|
import forge.net.protocol.toclient.ErrorIncorrectPacketClt;
|
||||||
|
import forge.net.protocol.toclient.ErrorUnknownPacketClt;
|
||||||
|
import forge.net.protocol.toclient.IPacketClt;
|
||||||
|
import forge.net.protocol.toserver.AuthorizePacketSrv;
|
||||||
|
import forge.net.protocol.toserver.ChatPacketSrv;
|
||||||
|
import forge.net.protocol.toserver.EchoPacketSrv;
|
||||||
|
import forge.net.protocol.toserver.IPacketSrv;
|
||||||
|
import forge.net.protocol.toserver.IncorrectPacketSrv;
|
||||||
|
import forge.net.protocol.toserver.UnknownPacketSrv;
|
||||||
|
import forge.util.TextUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The expected incoming message format is: /{opcode} {json-object}, where opcode is a string among keys of headerToClassInbound
|
||||||
|
* If string starts with a non-slash character, the whole line is considered a chat packet
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ClientProtocolJson implements ClientProtocol<IPacketSrv, IPacketClt> {
|
||||||
|
private final static Map<String, Class<? extends IPacketSrv>> headerToClassInbound = new HashMap<String, Class<? extends IPacketSrv>>();
|
||||||
|
private final static Map<Class<? extends IPacketClt>, String> classToHeaderOutbound = new HashMap<Class<? extends IPacketClt>, String>();
|
||||||
|
|
||||||
|
// Static ctor to fill maps
|
||||||
|
static {
|
||||||
|
// The what remote part sends us
|
||||||
|
headerToClassInbound.put("echo", EchoPacketSrv.class);
|
||||||
|
headerToClassInbound.put("s", ChatPacketSrv.class);
|
||||||
|
headerToClassInbound.put("auth", AuthorizePacketSrv.class);
|
||||||
|
|
||||||
|
// The what we reply there
|
||||||
|
classToHeaderOutbound.put(AuthResultPacketClt.class, "auth");
|
||||||
|
classToHeaderOutbound.put(ChatPacketClt.class, "s");
|
||||||
|
classToHeaderOutbound.put(EchoPacketClt.class, "echo");
|
||||||
|
classToHeaderOutbound.put(ErrorIncorrectPacketClt.class, "err:packet_args");
|
||||||
|
classToHeaderOutbound.put(ErrorUnknownPacketClt.class, "err:packet");
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Gson gson = new Gson(); // looks like a single instance per class is enough
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPacketSrv decodePacket(String data) {
|
||||||
|
if ( '/' != data.charAt(0) )
|
||||||
|
return new ChatPacketSrv(data);
|
||||||
|
|
||||||
|
data = data.substring(1);
|
||||||
|
String[] parts = TextUtil.split(data, ' ', 2);
|
||||||
|
|
||||||
|
Class<? extends IPacketSrv> packetClass = headerToClassInbound.get(parts[0]);
|
||||||
|
if( null == packetClass )
|
||||||
|
return new IncorrectPacketSrv("Unknown header: " + parts[0]);
|
||||||
|
|
||||||
|
String args = parts.length > 1 ? parts[1] : null;
|
||||||
|
if ( StringUtils.isBlank(args) )
|
||||||
|
args = "{}"; // assume default empty object
|
||||||
|
|
||||||
|
try {
|
||||||
|
return gson.fromJson(parts[1].trim(), packetClass);
|
||||||
|
} catch( JsonParseException ex ) {
|
||||||
|
return new IncorrectPacketSrv("Invalid json: " + args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String encodePacket(IPacketClt packet) {
|
||||||
|
Class<? extends IPacketClt> packetClass = packet.getClass();
|
||||||
|
String prefix = classToHeaderOutbound.get(packetClass);
|
||||||
|
return String.format("%s %s", prefix != null ? prefix : "/!unserialized!: " + packetClass.getName(), gson.toJson(packet));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
package forge.net.protocol.incoming;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import forge.util.TextUtil;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class AuthorizePacket implements IPacket {
|
|
||||||
private final String username;
|
|
||||||
private final String password;
|
|
||||||
|
|
||||||
private AuthorizePacket(String name, String pass) {
|
|
||||||
username = name;
|
|
||||||
password = pass;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUsername() {
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPassword() {
|
|
||||||
return password;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static IPacket parse(String data) {
|
|
||||||
String[] parts = TextUtil.splitWithParenthesis(data, ' ', '\"', '\"');
|
|
||||||
if(parts.length == 1 || parts.length == 2) {
|
|
||||||
if(!StringUtils.isAlphanumericSpace(parts[0]))
|
|
||||||
return new IncorrectPacket(PacketOpcode.Authorize, 0, parts[0]);
|
|
||||||
if( parts.length == 1)
|
|
||||||
return new AuthorizePacket(parts[0], null);
|
|
||||||
|
|
||||||
if(!StringUtils.isAsciiPrintable(parts[1]))
|
|
||||||
return new IncorrectPacket(PacketOpcode.Authorize, 1, parts[1]);
|
|
||||||
else
|
|
||||||
return new AuthorizePacket(parts[0], parts[1]);
|
|
||||||
}
|
|
||||||
return UnknownPacket.parse(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PacketOpcode getOpCode() {
|
|
||||||
return PacketOpcode.Authorize;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
package forge.net.protocol.incoming;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ChatPacket implements IPacket {
|
|
||||||
private final String message;
|
|
||||||
public ChatPacket(String data) {
|
|
||||||
message = data;
|
|
||||||
}
|
|
||||||
public String getMessage() {
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PacketOpcode getOpCode() {
|
|
||||||
return PacketOpcode.Chat;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
package forge.net.protocol.incoming;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class EchoPacket implements IPacket {
|
|
||||||
|
|
||||||
private final String message;
|
|
||||||
private EchoPacket(String data) {
|
|
||||||
message = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EchoPacket parse(String data) {
|
|
||||||
return new EchoPacket(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMessage() {
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PacketOpcode getOpCode() {
|
|
||||||
return PacketOpcode.Echo;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
package forge.net.protocol.incoming;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public interface IPacket {
|
|
||||||
PacketOpcode getOpCode();
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package forge.net.protocol.incoming;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class IncorrectPacket implements IPacket {
|
|
||||||
|
|
||||||
private final PacketOpcode intendedCode;
|
|
||||||
private final int index;
|
|
||||||
private final String sParam;
|
|
||||||
|
|
||||||
public IncorrectPacket(PacketOpcode code, int iParameter, String value) {
|
|
||||||
intendedCode = code;
|
|
||||||
index = iParameter;
|
|
||||||
sParam = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getString() {
|
|
||||||
return sParam;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getIndex() {
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PacketOpcode getIntendedCode() {
|
|
||||||
return intendedCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PacketOpcode getOpCode() {
|
|
||||||
return PacketOpcode.Incorrect;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
package forge.net.protocol.incoming;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public enum PacketOpcode {
|
|
||||||
Echo("/echo"),
|
|
||||||
Chat("/s"),
|
|
||||||
Authorize("/auth"),
|
|
||||||
|
|
||||||
Incorrect(null),
|
|
||||||
Unknown(null);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private final String opcode;
|
|
||||||
|
|
||||||
private PacketOpcode(String code) {
|
|
||||||
opcode = code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final String getOpcode() {
|
|
||||||
return opcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this method.
|
|
||||||
* @param data
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static IPacket decode(String data) {
|
|
||||||
for(PacketOpcode s : PacketOpcode.values()) {
|
|
||||||
if ( s.opcode != null && data.startsWith(s.opcode) )
|
|
||||||
return decodePacket(s, data.substring(s.opcode.length()).trim());
|
|
||||||
}
|
|
||||||
if( data.startsWith("/") )
|
|
||||||
return UnknownPacket.parse(data.substring(1));
|
|
||||||
else
|
|
||||||
return new ChatPacket(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static IPacket decodePacket(PacketOpcode code, String data) {
|
|
||||||
switch(code) {
|
|
||||||
case Echo: return EchoPacket.parse(data);
|
|
||||||
case Authorize: return AuthorizePacket.parse(data);
|
|
||||||
|
|
||||||
default: return UnknownPacket.parse(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
package forge.net.protocol.incoming;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class UnknownPacket implements IPacket {
|
|
||||||
|
|
||||||
private final String message;
|
|
||||||
private UnknownPacket(String data) {
|
|
||||||
message = data;
|
|
||||||
}
|
|
||||||
public String getMessage() {
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this method.
|
|
||||||
* @param substring
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static IPacket parse(String substring) {
|
|
||||||
return new UnknownPacket(substring);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PacketOpcode getOpCode() {
|
|
||||||
return PacketOpcode.Unknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package forge.net.protocol.outcoming;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class AuthorizationSuccessfulMessage implements IMessage {
|
|
||||||
|
|
||||||
private final String username;
|
|
||||||
|
|
||||||
public AuthorizationSuccessfulMessage(String user) {
|
|
||||||
username = user;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toNetString() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return "Authorization Successful. Welcome, " + username;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
package forge.net.protocol.outcoming;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ChatMessage implements IMessage {
|
|
||||||
|
|
||||||
private final String player;
|
|
||||||
private final String message;
|
|
||||||
|
|
||||||
public ChatMessage(String playerName, String message) {
|
|
||||||
// TODO Auto-generated constructor stub
|
|
||||||
this.message = message;
|
|
||||||
this.player = playerName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toNetString() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return String.format("%s: %s", player, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
package forge.net.protocol.outcoming;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class EchoMessage implements IMessage {
|
|
||||||
|
|
||||||
private final String message;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for Constructor.
|
|
||||||
* @param message2
|
|
||||||
*/
|
|
||||||
public EchoMessage(String message) {
|
|
||||||
this.message = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toNetString() {
|
|
||||||
return String.format("Echo: %s", message);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
package forge.net.protocol.outcoming;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public interface IMessage {
|
|
||||||
public String toNetString();
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
package forge.net.protocol.outcoming;
|
|
||||||
|
|
||||||
import forge.net.protocol.incoming.IncorrectPacket;
|
|
||||||
|
|
||||||
|
|
||||||
public class IncorrectPacketMessage implements IMessage {
|
|
||||||
|
|
||||||
IncorrectPacket badPacket;
|
|
||||||
public IncorrectPacketMessage(IncorrectPacket packet) {
|
|
||||||
badPacket = packet;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toNetString() {
|
|
||||||
return String.format("Wrong syntax for %s command: parameter #%d is %s", badPacket.getIntendedCode().getOpcode(), 1+badPacket.getIndex(), badPacket.getString());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package forge.net.protocol.outcoming;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this type.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class UnknownPacketMessage implements IMessage {
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see forge.net.protocol.outcoming.Message#toNetString()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toNetString() {
|
|
||||||
return "Unkown packet received";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package forge.net.protocol.toclient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class AuthResultPacketClt implements IPacketClt {
|
||||||
|
private final boolean successful;
|
||||||
|
private final String username;
|
||||||
|
|
||||||
|
public AuthResultPacketClt(String user, boolean success) {
|
||||||
|
username = user;
|
||||||
|
successful = success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSuccessful() {
|
||||||
|
return successful;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
src/main/java/forge/net/protocol/toclient/ChatPacketClt.java
Normal file
25
src/main/java/forge/net/protocol/toclient/ChatPacketClt.java
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package forge.net.protocol.toclient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ChatPacketClt implements IPacketClt {
|
||||||
|
|
||||||
|
private final String actor;
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
public ChatPacketClt(String playerName, String message) {
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
this.message = message;
|
||||||
|
this.actor = playerName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getActor() {
|
||||||
|
return actor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
24
src/main/java/forge/net/protocol/toclient/EchoPacketClt.java
Normal file
24
src/main/java/forge/net/protocol/toclient/EchoPacketClt.java
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package forge.net.protocol.toclient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class EchoPacketClt implements IPacketClt {
|
||||||
|
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for Constructor.
|
||||||
|
* @param message2
|
||||||
|
*/
|
||||||
|
public EchoPacketClt(String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package forge.net.protocol.toclient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A response packet to an Incorrect packet client had sent to server
|
||||||
|
*/
|
||||||
|
public class ErrorIncorrectPacketClt implements IPacketClt {
|
||||||
|
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
public ErrorIncorrectPacketClt(String msg) {
|
||||||
|
message = msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package forge.net.protocol.toclient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ErrorUnknownPacketClt implements IPacketClt {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package forge.net.protocol.toclient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface IPacketClt {
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package forge.net.protocol.toserver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class AuthorizePacketSrv implements IPacketSrv {
|
||||||
|
private final String username;
|
||||||
|
private final String password;
|
||||||
|
|
||||||
|
private AuthorizePacketSrv(String name, String pass) {
|
||||||
|
username = name;
|
||||||
|
password = pass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
16
src/main/java/forge/net/protocol/toserver/ChatPacketSrv.java
Normal file
16
src/main/java/forge/net/protocol/toserver/ChatPacketSrv.java
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package forge.net.protocol.toserver;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ChatPacketSrv implements IPacketSrv {
|
||||||
|
private final String message;
|
||||||
|
public ChatPacketSrv(String data) {
|
||||||
|
message = data;
|
||||||
|
}
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
22
src/main/java/forge/net/protocol/toserver/EchoPacketSrv.java
Normal file
22
src/main/java/forge/net/protocol/toserver/EchoPacketSrv.java
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package forge.net.protocol.toserver;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class EchoPacketSrv implements IPacketSrv {
|
||||||
|
|
||||||
|
private final String message;
|
||||||
|
private EchoPacketSrv(String data) {
|
||||||
|
message = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EchoPacketSrv parse(String data) {
|
||||||
|
return new EchoPacketSrv(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package forge.net.protocol.toserver;
|
||||||
|
|
||||||
|
|
||||||
|
/** A common ancestor for all packets directed to server */
|
||||||
|
public interface IPacketSrv {}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package forge.net.protocol.toserver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class IncorrectPacketSrv implements IPacketSrv {
|
||||||
|
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
public IncorrectPacketSrv(String errorMessage) {
|
||||||
|
message = errorMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package forge.net.protocol.toserver;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class UnknownPacketSrv implements IPacketSrv {
|
||||||
|
|
||||||
|
private final String message;
|
||||||
|
public UnknownPacketSrv(String data) {
|
||||||
|
message = data;
|
||||||
|
}
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
/** Model (as in model-view-controller) for Forge. */
|
/** Model (as in model-view-controller) for Forge. */
|
||||||
package forge.net.protocol.incoming;
|
package forge.net.protocol.toserver;
|
||||||
|
|
||||||
Reference in New Issue
Block a user