package com.zsoft.SignalA.Transport.Longpolling;
import org.json.JSONException;
import org.json.JSONObject;
import com.turbomanage.httpclient.AsyncCallback;
import com.turbomanage.httpclient.HttpResponse;
import com.zsoft.SignalA.ConnectionBase;
import com.zsoft.SignalA.ConnectionState;
import com.zsoft.SignalA.SignalAUtils;
import com.zsoft.SignalA.SendCallback;
import com.zsoft.SignalA.Transport.TransportHelper;
import com.zsoft.parallelhttpclient.ParallelHttpClient;
public class ConnectingState extends StopableStateWithCallback {
public ConnectingState(ConnectionBase connection) {
super(connection);
}
@Override
public ConnectionState getState() {
return ConnectionState.Connecting;
}
@Override
public void Start() {
}
@Override
public void Send(CharSequence text, SendCallback callback) {
callback.OnError(new Exception("Not connected"));
}
@Override
protected void OnRun() {
if(DoStop()) return;
// negotiate
String url = SignalAUtils.EnsureEndsWith(mConnection.getUrl(), "/") + "negotiate";
TransportHelper.AppendCustomQueryString(mConnection, url);
AsyncCallback cb = new AsyncCallback() {
@Override
public void onComplete(HttpResponse httpResponse) {
try
{
if(DoStop()) return;
if(httpResponse!=null && httpResponse.getStatus()==200 && !httpResponse.getBodyAsString().equals(""))
{
JSONObject json = JSONHelper.ToJSONObject(httpResponse.getBodyAsString());
String connectionId="";
String connectionToken="";
String protocolVersion = "";
try {
connectionId = json.getString("ConnectionId");
connectionToken = json.getString("ConnectionToken");
protocolVersion = json.getString("ProtocolVersion");
if(mConnection.VerifyProtocolVersion(protocolVersion))
{
mConnection.setConnectionId(connectionId);
mConnection.setConnectionToken(connectionToken);
mConnection.SetNewState(new ConnectedState(mConnection));
return;
}
else
{
mConnection.setError(new Exception("Not supported protocol version."));
mConnection.SetNewState(new DisconnectedState(mConnection));
return;
}
} catch (JSONException e) {
mConnection.setError(new Exception("Unable to parse negotiation response."));
return;
}
}
else
{
mConnection.SetNewState(new DisconnectedState(mConnection));
}
}
finally
{
mIsRunning.set(false);
}
}
@Override
public void onError(Exception ex) {
mConnection.setError(ex);
mConnection.SetNewState(new DisconnectedState(mConnection));
}
};
synchronized (mCallbackLock) {
//mCurrentCallback = cb;
}
ParallelHttpClient httpClient = new ParallelHttpClient();
httpClient.setMaxRetries(1);
httpClient.get(url, null, cb);
}
}