package com.sonycsl.Kadecot.wamp;
import android.util.Log;
import com.sonycsl.Kadecot.wamp.KadecotAppClient.MessageListener;
import com.sonycsl.wamp.WampPeer;
import com.sonycsl.wamp.message.WampErrorMessage;
import com.sonycsl.wamp.message.WampEventMessage;
import com.sonycsl.wamp.message.WampMessage;
import com.sonycsl.wamp.message.WampMessageFactory;
import com.sonycsl.wamp.message.WampMessageType;
import com.sonycsl.wamp.message.WampResultMessage;
import com.sonycsl.wamp.message.WampSubscribedMessage;
import com.sonycsl.wamp.message.WampUnsubscribedMessage;
import com.sonycsl.wamp.util.WampRequestIdGenerator;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class KadecotAppClientWrapper {
private static final String TAG = KadecotAppClientWrapper.class.getSimpleName();
private KadecotAppClient mAppClient;
private Map<Integer, WampRequestListener> reqIdListenerMap = new ConcurrentHashMap<Integer, WampRequestListener>();
private Map<Integer, WampSubscribeListener> subIdSubscriberMap = new ConcurrentHashMap<Integer, WampSubscribeListener>();
private Map<Integer, Integer> reqIdSubIdMap = new ConcurrentHashMap<Integer, Integer>();
public interface WampRequestListener {
}
public interface WampCallListener extends WampRequestListener {
public void onResult(JSONObject details, JSONObject argumentsKw);
public void onError(JSONObject details, String error);
}
public interface WampSubscribeListener extends WampRequestListener {
public void onEvent(JSONObject details, JSONObject argumentsKw);
public void onSubscribed(int subscriptionId);
public void onError(JSONObject details, String error);
}
public interface WampUnsubscribeListener extends WampRequestListener {
public void onUnsubscribed();
public void onError(JSONObject details, String error);
}
public KadecotAppClientWrapper() {
mAppClient = new KadecotAppClient();
mAppClient.setOnMessageListener(new MessageListener() {
@Override
public void onMessage(WampMessage msg) {
switch (msg.getMessageType()) {
case WampMessageType.ERROR:
respondError(msg.asErrorMessage());
break;
case WampMessageType.RESULT:
respondResult(msg.asResultMessage());
break;
case WampMessageType.EVENT:
respondEvent(msg.asEventMessage());
break;
case WampMessageType.SUBSCRIBED:
respondSubscribed(msg.asSubscribedMessage());
break;
case WampMessageType.UNSUBSCRIBED:
respondUnsubscribed(msg.asUnsubscribedMessage());
break;
default:
break;
}
}
});
}
private void respondError(WampErrorMessage msg) {
WampRequestListener callback = reqIdListenerMap.remove(msg.getRequestId());
if (callback == null) {
Log.e(TAG, "Unknown Response. msg=" + msg);
return;
}
switch (msg.getRequestType()) {
case WampMessageType.CALL:
WampCallListener callListener = (WampCallListener) callback;
callListener.onError(msg.getDetails(), msg.getUri());
break;
case WampMessageType.SUBSCRIBE:
WampSubscribeListener subscribeListener = (WampSubscribeListener) callback;
subscribeListener.onError(msg.getDetails(), msg.getUri());
break;
case WampMessageType.UNSUBSCRIBE:
WampUnsubscribeListener unsubscribeListener = (WampUnsubscribeListener) callback;
unsubscribeListener.onError(msg.getDetails(), msg.getUri());
break;
}
}
private void respondResult(WampResultMessage msg) {
WampCallListener callback = (WampCallListener) reqIdListenerMap.remove(msg.getRequestId());
if (callback == null) {
Log.e(TAG, "Unknown Result message: " + msg);
return;
}
callback.onResult(msg.getDetails(), msg.getArgumentsKw());
}
private void respondEvent(WampEventMessage msg) {
WampSubscribeListener callback = (WampSubscribeListener) subIdSubscriberMap.get(msg
.getSubscriptionId());
if (callback == null) {
Log.e(TAG, "Unknown Event message: " + msg);
return;
}
callback.onEvent(msg.getDetails(), msg.getArgumentsKw());
}
private void respondSubscribed(WampSubscribedMessage msg) {
WampSubscribeListener callback = (WampSubscribeListener) reqIdListenerMap.remove(msg
.getRequestId());
if (callback == null) {
Log.e(TAG, "Unknown Subscribed message: " + msg);
return;
}
subIdSubscriberMap.put(msg.getSubscriptionId(), callback);
callback.onSubscribed(msg.getSubscriptionId());
}
private void respondUnsubscribed(WampUnsubscribedMessage msg) {
WampUnsubscribeListener callback = (WampUnsubscribeListener) reqIdListenerMap.get(msg
.getRequestId());
if (callback == null) {
Log.e(TAG, "Unknown Unsubscribed message: " + msg);
return;
}
int subscriptionId = reqIdSubIdMap.remove(msg.getRequestId());
if (subIdSubscriberMap.remove(subscriptionId) == null) {
Log.e(TAG, "Already unsubscribed: " + msg);
return;
}
callback.onUnsubscribed();
}
public void connect(WampPeer peer) {
mAppClient.connect(peer);
}
public void hello(String realm) {
mAppClient.transmit(WampMessageFactory.createHello(realm, new JSONObject()));
}
public void goodbye(String reason) {
mAppClient.transmit(WampMessageFactory.createGoodbye(new JSONObject(), reason));
}
public void call(String procedure, JSONObject options, JSONObject paramsKw,
WampCallListener listener) {
int reqId = WampRequestIdGenerator.getId();
reqIdListenerMap.put(reqId, listener);
mAppClient.transmit(WampMessageFactory.createCall(reqId, options, procedure,
new JSONArray(), paramsKw));
}
public void subscribe(String topic, JSONObject options, WampSubscribeListener listener) {
int reqId = WampRequestIdGenerator.getId();
reqIdListenerMap.put(reqId, listener);
mAppClient.transmit(WampMessageFactory.createSubscribe(reqId, options, topic));
}
public void unsubscribe(int subscriptionId, WampUnsubscribeListener listener) {
int reqId = WampRequestIdGenerator.getId();
reqIdListenerMap.put(reqId, listener);
reqIdSubIdMap.put(reqId, subscriptionId);
mAppClient.transmit(WampMessageFactory.createUnsubscribe(reqId, subscriptionId));
}
}