/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.clients.fcp;
import freenet.client.async.ClientContext;
import freenet.client.async.PersistenceDisabledException;
import freenet.client.async.PersistentJob;
import freenet.node.Node;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
import freenet.support.io.NativeThread;
/**
* Client telling node to remove a (completed or not) persistent request.
*/
public class RemovePersistentRequest extends FCPMessage {
final static String NAME = "RemoveRequest";
final static String ALT_NAME = "RemovePersistentRequest";
final String identifier;
final boolean global;
public RemovePersistentRequest(SimpleFieldSet fs) throws MessageInvalidException {
this.global = fs.getBoolean("Global", false);
this.identifier = fs.get("Identifier");
if(identifier == null)
throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "Must have Identifier", null, global);
}
@Override
public SimpleFieldSet getFieldSet() {
SimpleFieldSet fs = new SimpleFieldSet(true);
fs.putSingle("Identifier", identifier);
return fs;
}
@Override
public String getName() {
return NAME;
}
@Override
public void run(final FCPConnectionHandler handler, Node node)
throws MessageInvalidException {
ClientRequest req = handler.removePersistentRebootRequest(global, identifier);
if(req == null && !global) {
req = handler.removeRequestByIdentifier(identifier, true);
}
if(req == null) {
try {
handler.server.core.clientContext.jobRunner.queue(new PersistentJob() {
@Override
public boolean run(ClientContext context) {
try {
ClientRequest req = handler.removePersistentForeverRequest(global, identifier);
if(req == null) {
Logger.error(this, "Huh ? the request is null!");
return false;
}
return true;
} catch (MessageInvalidException e) {
FCPMessage err = new ProtocolErrorMessage(e.protocolCode, false, e.getMessage(), e.ident, e.global);
handler.outputHandler.queue(err);
return false;
}
}
}, NativeThread.HIGH_PRIORITY);
} catch (PersistenceDisabledException e) {
FCPMessage err = new ProtocolErrorMessage(ProtocolErrorMessage.PERSISTENCE_DISABLED, false, "Persistence disabled and non-persistent request not found", identifier, global);
handler.outputHandler.queue(err);
}
}
}
}