/* 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.node.RequestStarter;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
import freenet.support.io.NativeThread;
/**
* FCP message: Modify a persistent request.
*
* ModifyPersistentRequest
* Identifier=request identifier
* Verbosity=1023 // change verbosity
* PriorityClass=1 // change priority class
* ClientToken=new client token // change client token
* MaxRetries=100 // change max retries
* Global=true
* EndMessage
*/
public class ModifyPersistentRequest extends FCPMessage {
static final String NAME = "ModifyPersistentRequest";
final String identifier;
final boolean global;
// negative means don't change
final short priorityClass;
final String clientToken;
ModifyPersistentRequest(SimpleFieldSet fs) throws MessageInvalidException {
this.global = fs.getBoolean("Global", false);
this.identifier = fs.get("Identifier");
this.clientToken = fs.get("ClientToken");
if(identifier == null)
throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "Missing field: Identifier", null, global);
String prio = fs.get("PriorityClass");
if(prio != null) {
try {
priorityClass = Short.parseShort(prio);
if(!RequestStarter.isValidPriorityClass(priorityClass))
throw new MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "Invalid priority class "+priorityClass+" - range is "+RequestStarter.PAUSED_PRIORITY_CLASS+" to "+RequestStarter.MAXIMUM_PRIORITY_CLASS, identifier, global);
} catch (NumberFormatException e) {
throw new MessageInvalidException(ProtocolErrorMessage.ERROR_PARSING_NUMBER, "Could not parse PriorityClass: "+e.getMessage(), identifier, global);
}
} else
priorityClass = -1;
}
@Override
public SimpleFieldSet getFieldSet() {
SimpleFieldSet fs = new SimpleFieldSet(true);
fs.putSingle("Identifier", identifier);
fs.put("Global", global);
fs.put("PriorityClass", priorityClass);
if(clientToken != null)
fs.putSingle("ClientToken", clientToken);
return fs;
}
@Override
public String getName() {
return NAME;
}
@Override
public void run(final FCPConnectionHandler handler, Node node)
throws MessageInvalidException {
ClientRequest req = handler.getRebootRequest(global, handler, identifier);
if(req == null) {
try {
node.clientCore.clientContext.jobRunner.queue(new PersistentJob() {
@Override
public boolean run(ClientContext context) {
ClientRequest req = handler.getForeverRequest(global, handler, identifier);
if(req==null){
Logger.error(this, "Huh ? the request is null!");
ProtocolErrorMessage msg = new ProtocolErrorMessage(ProtocolErrorMessage.NO_SUCH_IDENTIFIER, false, null, identifier, global);
handler.outputHandler.queue(msg);
return false;
} else {
req.modifyRequest(clientToken, priorityClass, handler.server);
}
return true;
}
}, NativeThread.NORM_PRIORITY);
} catch (PersistenceDisabledException e) {
ProtocolErrorMessage msg = new ProtocolErrorMessage(ProtocolErrorMessage.NO_SUCH_IDENTIFIER, false, null, identifier, global);
handler.outputHandler.queue(msg);
}
} else {
req.modifyRequest(clientToken, priorityClass, node.clientCore.getFCPServer());
}
}
}