package freenet.client.connection;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Timer;
import freenet.client.FreenetJs;
import freenet.client.UpdaterConstants;
import freenet.client.l10n.L10n;
import freenet.client.messages.Message;
import freenet.client.messages.MessageManager;
import freenet.client.messages.Priority;
import freenet.client.tools.FreenetRequest;
import freenet.client.tools.QueryParameter;
/**
* This ConnectionManager sends a keepalive message periodically to notify the server that the page is still open. If a keepalive fails, it tells the client that the server already
* cleaned up this request.
*/
public class KeepaliveManager implements IConnectionManager {
/** The timer that schedules the periodic message */
private KeepaliveTimer timer = new KeepaliveTimer();
/** Is it cancelled already? */
private boolean cancelled = false;
/** Does the first keepalive succeded? */
private boolean firstSuccess = false;
@Override
public void closeConnection() {
timer.cancel();
// If it wasn't cancelled, then we show a message about pushing cancelled. It makes sure that this message shows only once
if (cancelled == false) {
if (FreenetJs.isPushingCancelledExpected == false) {
MessageManager.get().addMessage(new Message(L10n.get("pushingCancelled"), Priority.ERROR, null, true));
}
cancelled = true;
}
}
@Override
public void openConnection() {
timer.run();
timer.scheduleRepeating(UpdaterConstants.KEEPALIVE_INTERVAL_SECONDS * 1000);
}
/** This class is a Timer that sends a keepalive message periodically */
private class KeepaliveTimer extends Timer {
@Override
public void run() {
FreenetRequest.sendRequest(UpdaterConstants.keepalivePath, new QueryParameter("requestId", FreenetJs.requestId), new RequestCallback() {
@Override
public void onResponseReceived(Request request, Response response) {
// If not success, then close the connection
if (response.getText().compareTo(UpdaterConstants.SUCCESS) != 0) {
if (firstSuccess == false) {
FreenetJs.isPushingCancelledExpected = true;
}
closeConnection();
} else {
firstSuccess = true;
}
}
@Override
public void onError(Request request, Throwable exception) {
// If the server responded with error, close the connection
closeConnection();
}
});
}
}
}