package com.sonycsl.Kadecot.wamp;
import android.util.Log;
import com.sonycsl.wamp.WampError;
import com.sonycsl.wamp.WampPeer;
import com.sonycsl.wamp.message.WampMessage;
import com.sonycsl.wamp.message.WampMessageFactory;
import com.sonycsl.wamp.role.WampRole;
import org.java_websocket.WebSocket.READYSTATE;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.exceptions.WebsocketNotConnectedException;
import org.java_websocket.handshake.ServerHandshake;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class KadecotWebsocketClientProxy extends WampPeer {
private static final String TAG = KadecotWebsocketClientProxy.class.getSimpleName();
private static final String PROTOCOL = "ws://";
private WebSocketClient mWsClient;
@Override
protected Set<WampRole> getRoleSet() {
Set<WampRole> roleSet = new HashSet<WampRole>();
roleSet.add(new WampWebSocketClientProxy());
return roleSet;
}
@Override
protected void onConnected(WampPeer peer) {
}
public void open(String ipaddress, String port) throws InterruptedException, TimeoutException {
if (mWsClient != null && mWsClient.getReadyState() == READYSTATE.OPEN) {
return;
}
URI uri;
try {
uri = new URI(PROTOCOL + ipaddress + ":" + port);
} catch (URISyntaxException e) {
Log.e(TAG, "URI Syntax Exception" + ipaddress);
return;
}
final CountDownLatch latch = new CountDownLatch(1);
mWsClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake handshakedata) {
latch.countDown();
}
@Override
public void onMessage(String message) {
try {
transmit(WampMessageFactory.create(new JSONArray(message)));
} catch (JSONException e) {
Log.e(TAG, "message is not WAMP format: " + message);
}
}
@Override
public void onError(Exception ex) {
Log.e(TAG, "onError : " + ex);
}
@Override
public void onClose(int code, String reason, boolean remote) {
transmit(WampMessageFactory.createGoodbye(new JSONObject(),
WampError.SYSTEM_SHUTDOWN));
}
};
mWsClient.connect();
if (!latch.await(1, TimeUnit.SECONDS)) {
throw new TimeoutException("WebSocket connect timeout");
}
}
public void close() {
if (mWsClient == null || mWsClient.getReadyState() != READYSTATE.OPEN) {
return;
}
mWsClient.close();
}
public boolean isOpen() {
if (mWsClient == null) {
return false;
}
return mWsClient.getReadyState() == READYSTATE.OPEN;
}
@Override
protected void onTransmitted(WampPeer peer, WampMessage msg) {
}
@Override
protected void onReceived(WampMessage msg) {
if (mWsClient == null) {
Log.e(TAG, "msg: " + msg);
return;
}
if (mWsClient.getReadyState() != READYSTATE.OPEN) {
Log.i(TAG, "OnReceived: WebSocket is already closed. msg=" + msg.toString());
return;
}
try {
mWsClient.send(msg.toString());
} catch (WebsocketNotConnectedException e) {
Log.i(TAG, "OnReceived: WebSocket is already closed. msg=" + msg.toString());
}
}
private static class WampWebSocketClientProxy extends WampRole {
@Override
public String getRoleName() {
return "proxy";
}
@Override
protected boolean resolveTxMessageImpl(WampPeer receiver, WampMessage msg) {
return true;
}
@Override
protected boolean resolveRxMessageImpl(WampPeer transmitter, WampMessage msg,
OnReplyListener listener) {
return true;
}
}
}