package com.sonycsl.Kadecot.wamp;
import com.sonycsl.wamp.WampPeer;
import com.sonycsl.wamp.WampPeer.Callback;
import com.sonycsl.wamp.message.WampMessage;
import com.sonycsl.wamp.message.WampMessageFactory;
import com.sonycsl.wamp.util.WampRequestIdGenerator;
import org.json.JSONObject;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
public class KadecotWampSetupCallback implements Callback {
public interface OnCompletionListener {
public void onCompletion();
}
private final Collection<String> mTopics;
private final Collection<String> mProcedures;
private final Collection<Integer> mSubscriptionIds;
private final Collection<Integer> mRegistrationIds;
private final OnCompletionListener mListener;
public KadecotWampSetupCallback(Collection<String> topics, Collection<String> procedures,
OnCompletionListener listener) {
mTopics = topics;
mProcedures = procedures;
mSubscriptionIds = Collections.synchronizedSet(new HashSet<Integer>(mTopics.size()));
mRegistrationIds = Collections.synchronizedSet(new HashSet<Integer>(mProcedures.size()));
mListener = listener;
}
@Override
public void preConnect(WampPeer connecter, WampPeer connectee) {
}
@Override
public void postConnect(WampPeer connecter, WampPeer connectee) {
}
@Override
public void preTransmit(WampPeer transmitter, WampMessage msg) {
if (msg.isGoodbyeMessage()) {
synchronized (mSubscriptionIds) {
for (int id : mSubscriptionIds) {
transmitter.transmit(WampMessageFactory.createUnsubscribe(
WampRequestIdGenerator.getId(), id));
}
mSubscriptionIds.clear();
}
synchronized (mRegistrationIds) {
for (int id : mRegistrationIds) {
transmitter.transmit(WampMessageFactory.createUnregister(
WampRequestIdGenerator.getId(), id));
}
mRegistrationIds.clear();
}
return;
}
}
@Override
public void postTransmit(WampPeer transmitter, WampMessage msg) {
}
@Override
public void preReceive(WampPeer receiver, WampMessage msg) {
}
private void notifyCompletion() {
if (mSubscriptionIds.size() + mRegistrationIds.size()
== mTopics.size() + mProcedures.size()) {
mListener.onCompletion();
}
}
@Override
public void postReceive(WampPeer receiver, WampMessage msg) {
if (msg.isWelcomeMessage()) {
for (String topic : mTopics) {
receiver.transmit(WampMessageFactory.createSubscribe(
WampRequestIdGenerator.getId(), new JSONObject(), topic));
}
for (String procedure : mProcedures) {
receiver.transmit(WampMessageFactory.createRegister(
WampRequestIdGenerator.getId(), new JSONObject(), procedure));
}
// notifyCompletion();
return;
}
if (msg.isSubscribedMessage()) {
mSubscriptionIds.add(msg.asSubscribedMessage().getSubscriptionId());
notifyCompletion();
return;
}
if (msg.isRegisteredMessage()) {
mRegistrationIds.add(msg.asRegisteredMessage().getRegistrationId());
notifyCompletion();
return;
}
}
}