package com.cardshifter.gdx.client;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.utils.Base64Coder;
import com.cardshifter.api.CardshifterSerializationException;
import com.cardshifter.api.incoming.LoginMessage;
import com.cardshifter.api.messages.Message;
import com.cardshifter.api.serial.ByteTransformer;
import com.cardshifter.gdx.CardshifterClient;
import com.cardshifter.gdx.CardshifterMessageHandler;
import com.cardshifter.gdx.GdxLogger;
import com.cardshifter.gdx.GdxReflection;
import com.sksamuel.gwt.websockets.BinaryWebsocketListener;
import com.sksamuel.gwt.websockets.Websocket;
import java.io.ByteArrayInputStream;
/**
* Created by Simon on 4/25/2015.
*/
public class GWTClient implements CardshifterClient, BinaryWebsocketListener {
private static final String TAG = "Websocket";
private final Websocket websocket;
private final CardshifterMessageHandler handler;
private final ByteTransformer transformer;
private final LoginMessage loginMessage;
public GWTClient(String host, int port, CardshifterMessageHandler handler, LoginMessage loginMessage) {
websocket = new Websocket(host + ":" + port);
websocket.addListener(this);
this.handler = handler;
transformer = new ByteTransformer(new GdxLogger(), new GdxReflection());
this.loginMessage = loginMessage;
websocket.open();
}
@Override
public void send(Message message) {
try {
byte[] data = transformer.transform(message);
websocket.send(data);
} catch (CardshifterSerializationException e) {
Gdx.app.log(TAG, "Error sending " + message, e);
}
}
@Override
public void onClose() {
Gdx.app.log(TAG, "Websocket closed");
}
@Override
public void onMessage(String msg) {
Gdx.app.log(TAG, "Websocket String: " + msg);
}
@Override
public void onOpen() {
Gdx.app.log(TAG, "Websocket opened");
send(loginMessage);
/* websocket.send("{ \"command\": \"serial\", \"type\": \"1\" }");
Gdx.app.log("Client", "Sent serial type");*/
//platform.setupLogging();
}
@Override
public void onMessage(byte[] bytes) {
// Gdx.app.log(TAG, "Message: " + msg);
try {
// byte[] bytes = Base64Coder.decode(msg);
Gdx.app.log(TAG, "Received " + bytes.length + " bytes");
Message message = transformer.readOnce(new ByteArrayInputStream(bytes));
Gdx.app.log(TAG, "Received " + message);
handler.handle(message);
} catch (CardshifterSerializationException e) {
Gdx.app.log(TAG, "Read error", e);
}
}
}