package com.faforever.client.remote;
import com.faforever.client.connectivity.ConnectivityState;
import com.faforever.client.game.Faction;
import com.faforever.client.game.GameVisibility;
import com.faforever.client.remote.domain.ClientMessage;
import com.faforever.client.remote.domain.ClientMessageType;
import com.faforever.client.remote.domain.GameAccess;
import com.faforever.client.remote.domain.GameState;
import com.faforever.client.remote.domain.MessageTarget;
import com.faforever.client.remote.domain.VictoryCondition;
import com.faforever.client.remote.gson.ClientMessageTypeTypeAdapter;
import com.faforever.client.remote.gson.ConnectivityStateTypeAdapter;
import com.faforever.client.remote.gson.FactionTypeAdapter;
import com.faforever.client.remote.gson.GameAccessTypeAdapter;
import com.faforever.client.remote.gson.GameStateTypeAdapter;
import com.faforever.client.remote.gson.GameVisibilityTypeAdapter;
import com.faforever.client.remote.gson.InetSocketAddressTypeAdapter;
import com.faforever.client.remote.gson.MessageTargetTypeAdapter;
import com.faforever.client.remote.gson.VictoryConditionTypeAdapter;
import com.faforever.client.remote.io.QDataWriter;
import com.google.gson.GsonBuilder;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.net.InetSocketAddress;
public class ClientMessageSerializer extends JsonMessageSerializer<ClientMessage> {
private StringProperty username;
private ObjectProperty<Long> sessionId;
/**
* Creates a message serializer that does not append username and session ID to sent messages.
*/
public ClientMessageSerializer() {
this(new SimpleStringProperty(), new SimpleObjectProperty<>());
}
/**
* Creates a message serializer that appends username and session ID to sent messages.
*
* @param username the username property, so that this serializer can be initialized before the session ID
* @param sessionId the session ID property, so that this serializer can be initialized before the session ID
*/
public ClientMessageSerializer(StringProperty username, ObjectProperty<Long> sessionId) {
this.username = username;
this.sessionId = sessionId;
}
@Override
protected void appendMore(QDataWriter qDataWriter) throws IOException {
qDataWriter.append(StringUtils.defaultString(username.get()));
if (sessionId.get() == null) {
qDataWriter.append("");
} else {
qDataWriter.append(sessionId.get().toString());
}
}
@Override
protected void addTypeAdapters(GsonBuilder gsonBuilder) {
gsonBuilder.registerTypeAdapter(GameAccess.class, GameAccessTypeAdapter.INSTANCE)
.registerTypeAdapter(GameState.class, GameStateTypeAdapter.INSTANCE)
.registerTypeAdapter(ClientMessageType.class, ClientMessageTypeTypeAdapter.INSTANCE)
.registerTypeAdapter(VictoryCondition.class, VictoryConditionTypeAdapter.INSTANCE)
.registerTypeAdapter(Faction.class, FactionTypeAdapter.INSTANCE)
.registerTypeAdapter(GameVisibility.class, GameVisibilityTypeAdapter.INSTANCE)
.registerTypeAdapter(ConnectivityState.class, ConnectivityStateTypeAdapter.INSTANCE)
.registerTypeAdapter(MessageTarget.class, MessageTargetTypeAdapter.INSTANCE)
.registerTypeAdapter(InetSocketAddress.class, InetSocketAddressTypeAdapter.INSTANCE);
}
}