package com.zsoft.SignalA.Hubs;
import java.util.Collection;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.json.JSONArray;
import android.util.Log;
import com.zsoft.SignalA.SendCallback;
public class HubProxy implements IHubProxy {
protected static final String TAG = "HubProxy";
private String mHubName;
private HubConnection mConnection;
//private Map<string, JSONObject> _state = new Dictionary<string, JToken>(StringComparer.OrdinalIgnoreCase);
private Map<String, HubOnDataCallback> mSubscriptions = new HashMap<String, HubOnDataCallback>();
public HubProxy(HubConnection hubConnection, String hubName) {
mConnection = hubConnection;
mHubName = hubName;
}
public void Invoke(final String method, Collection<?> args,
HubInvokeCallback callback) {
Invoke(method, new JSONArray(args), callback);
}
// Executes a method on the server asynchronously
@Override
public void Invoke(final String method, JSONArray args,
HubInvokeCallback callback) {
if (method == null)
{
throw new IllegalArgumentException("method");
}
if (args == null)
{
throw new IllegalArgumentException("args");
}
final String callbackId = mConnection.RegisterCallback(callback);
HubInvocation hubData = new HubInvocation(mHubName, method, args, callbackId);
String value = hubData.Serialize();
mConnection.Send(value, new SendCallback()
{
@Override
public void OnSent(CharSequence messageSent) {
Log.v(TAG, "Invoke of " + method + "sent to " + mHubName);
// callback.OnSent() ??!?!?
}
@Override
public void OnError(Exception ex) {
// TODO Cancel the callback
Log.e(TAG, "Failed to invoke " + method + "on " + mHubName);
mConnection.RemoveCallback(callbackId);
// callback.OnError() ?!?!?
}
});
}
public void On(String eventName, HubOnDataCallback callback)
{
Subscribe(eventName, callback);
}
public void Subscribe(String eventName, HubOnDataCallback callback)
{
if(eventName==null) throw new IllegalArgumentException("eventName can not be null");
if(callback==null) throw new IllegalArgumentException("callback can not be null");
eventName = eventName.toLowerCase(Locale.US);
if(!mSubscriptions.containsKey(eventName))
{
mSubscriptions.put(eventName, callback);
}
}
// K�r event lokalt som anropas fr�n servern och som registrerats i ON-metod.
public void InvokeEvent(String eventName, JSONArray args)
{
HubOnDataCallback subscription;
if(mSubscriptions.containsKey(eventName))
{
subscription = mSubscriptions.get(eventName);
subscription.OnReceived(args);
}
}
}