/* 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.USKCallback;
import freenet.client.async.USKProgressCallback;
import freenet.keys.USK;
import freenet.node.NodeClientCore;
public class SubscribeUSK implements USKProgressCallback {
// FIXME allow client to specify priorities
final FCPConnectionHandler handler;
final String identifier;
final NodeClientCore core;
final boolean dontPoll;
final short prio;
final short prioProgress;
final USK usk;
final USKCallback toUnsub;
public SubscribeUSK(SubscribeUSKMessage message, NodeClientCore core, FCPConnectionHandler handler) throws IdentifierCollisionException {
this.handler = handler;
this.dontPoll = message.dontPoll;
this.identifier = message.identifier;
this.core = core;
this.usk = message.key;
prio = message.prio;
prioProgress = message.prioProgress;
handler.addUSKSubscription(identifier, this);
if((!message.dontPoll) && message.sparsePoll)
toUnsub = core.uskManager.subscribeSparse(message.key, this, message.ignoreUSKDatehints,
handler.getRebootClient().lowLevelClient(message.realTimeFlag));
else {
core.uskManager.subscribe(message.key, this, !message.dontPoll, message.ignoreUSKDatehints,
handler.getRebootClient().lowLevelClient(message.realTimeFlag));
toUnsub = this;
}
}
@Override
public void onFoundEdition(long l, USK key, ClientContext context, boolean wasMetadata, short codec, byte[] data, boolean newKnownGood, boolean newSlotToo) {
if(handler.isClosed()) {
core.uskManager.unsubscribe(key, toUnsub);
return;
}
//if(newKnownGood && !newSlotToo) return;
FCPMessage msg = new SubscribedUSKUpdate(identifier, l, key, newKnownGood, newSlotToo);
handler.outputHandler.queue(msg);
}
@Override
public short getPollingPriorityNormal() {
return prio;
}
@Override
public short getPollingPriorityProgress() {
return prioProgress;
}
public void unsubscribe() {
core.uskManager.unsubscribe(usk, toUnsub);
}
@Override
public void onSendingToNetwork(ClientContext context) {
handler.outputHandler.queue(new SubscribedUSKSendingToNetworkMessage(identifier));
}
@Override
public void onRoundFinished(ClientContext context) {
handler.outputHandler.queue(new SubscribedUSKRoundFinishedMessage(identifier));
}
}