/* 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 java.net.MalformedURLException;
import freenet.keys.FreenetURI;
import freenet.keys.USK;
import freenet.node.Node;
import freenet.node.RequestStarter;
import freenet.support.SimpleFieldSet;
/**
* Sent by a client to subscribe to a USK. The client will then be notified by a SubscribedUSKMessage that his
* request has been taken into account and whenever a new latest version of the USK is available.
* There is a flag for whether the node should actively probe for the USK.
*
* SubscribeUSK
* URI=USK@60I8H8HinpgZSOuTSD66AVlIFAy-xsppFr0YCzCar7c,NzdivUGCGOdlgngOGRbbKDNfSCnjI0FXjHLzJM4xkJ4,AQABAAE/index/4
* DontPoll=true // meaning passively subscribe, don't cause the node to actively probe for it
* Identifier=identifier
* End
*/
public class SubscribeUSKMessage extends FCPMessage {
public static final String NAME = "SubscribeUSK";
final USK key;
final boolean dontPoll;
final String identifier;
final short prio;
final short prioProgress;
final boolean realTimeFlag;
final boolean sparsePoll;
final boolean ignoreUSKDatehints;
public SubscribeUSKMessage(SimpleFieldSet fs) throws MessageInvalidException {
this.identifier = fs.get("Identifier");
if(identifier == null)
throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "No Identifier!", null, false);
String suri = fs.get("URI");
if(suri == null)
throw new MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "Expected a URI on SubscribeUSK", identifier, false);
FreenetURI uri;
try {
uri = new FreenetURI(suri);
key = USK.create(uri);
} catch (MalformedURLException e) {
throw new MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "Could not parse URI: "+e, identifier, false);
}
this.dontPoll = fs.getBoolean("DontPoll", false);
if(!dontPoll)
this.sparsePoll = fs.getBoolean("SparsePoll", false);
else
sparsePoll = false;
prio = fs.getShort("PriorityClass", RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS);
prioProgress = fs.getShort("PriorityClassProgress", (short)Math.max(0, prio-1));
realTimeFlag = fs.getBoolean("RealTimeFlag", false);
ignoreUSKDatehints = fs.getBoolean("IgnoreUSKDatehints", false);
}
@Override
public SimpleFieldSet getFieldSet() {
SimpleFieldSet fs = new SimpleFieldSet(true);
fs.putSingle("URI", key.getURI().toString());
fs.put("DontPoll", dontPoll);
return fs;
}
@Override
public String getName() {
return NAME;
}
@Override
public void run(FCPConnectionHandler handler, Node node)
throws MessageInvalidException {
try {
new SubscribeUSK(this, node.clientCore, handler);
} catch (IdentifierCollisionException e) {
handler.outputHandler.queue(new IdentifierCollisionMessage(identifier, false));
return;
}
SubscribedUSKMessage reply = new SubscribedUSKMessage(this);
handler.outputHandler.queue(reply);
}
}