package net.i2p.router;
/*
* free (adj.): unencumbered; not under the control of others
* Written by jrandom in 2003 and released into the public domain
* with no warranty of any kind, either expressed or implied.
* It probably won't make your computer catch on fire, or eat
* your children, but it might. Use at your own risk.
*
*/
import net.i2p.router.message.OutboundCache;
import net.i2p.router.message.OutboundClientMessageOneShotJob;
import net.i2p.util.Log;
/**
* Manage all of the inbound and outbound client messages maintained by the router.
* The ClientManager subsystem fetches messages from this for locally deliverable
* messages and adds in remotely deliverable messages. Remotely deliverable messages
* are picked up by interested jobs and processed and transformed into an OutNetMessage
* to be eventually placed in the OutNetMessagePool.
*
*/
public class ClientMessagePool {
private final Log _log;
private final RouterContext _context;
private final OutboundCache _cache;
public ClientMessagePool(RouterContext context) {
_context = context;
_log = _context.logManager().getLog(ClientMessagePool.class);
_cache = new OutboundCache(_context);
OutboundClientMessageOneShotJob.init(_context);
}
/**
* @since 0.8.8
*/
public void shutdown() {
_cache.clearAllCaches();
}
/**
* @since 0.8.8
*/
public void restart() {
shutdown();
}
/**
* Add a new message to the pool. The message can either be locally or
* remotely destined.
*
*/
public void add(ClientMessage msg) {
add(msg, false);
}
/**
* If we're coming from the client subsystem itself, we already know whether
* the target is definitely remote and as such don't need to recheck
* ourselves, but if we aren't certain, we want it to check for us.
*
* @param isDefinitelyRemote true if we know for sure that the target is not local
*
*/
public void add(ClientMessage msg, boolean isDefinitelyRemote) {
if ( !isDefinitelyRemote ||
(_context.clientManager().isLocal(msg.getDestination())) ||
(_context.clientManager().isLocal(msg.getDestinationHash())) ) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Adding message for local delivery");
_context.clientManager().messageReceived(msg);
} else {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Adding message for remote delivery");
OutboundClientMessageOneShotJob j = new OutboundClientMessageOneShotJob(_context, _cache, msg);
if (true) // blocks the I2CP reader for a nontrivial period of time
j.runJob();
else
_context.jobQueue().addJob(j);
}
}
/******
private boolean isGuaranteed(ClientMessage msg) {
Properties opts = null;
if (msg.getSenderConfig() != null)
opts = msg.getSenderConfig().getOptions();
if (opts != null) {
String val = opts.getProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
return val.equals(I2PClient.PROP_RELIABILITY_GUARANTEED);
} else {
return false;
}
}
******/
}