package net.i2p.router.client;
import java.net.Socket;
import net.i2p.data.Destination;
import net.i2p.data.Hash;
import net.i2p.data.Lease;
import net.i2p.data.LeaseSet;
import net.i2p.data.i2cp.I2CPMessageException;
import net.i2p.data.i2cp.I2CPMessageReader;
import net.i2p.data.i2cp.MessageId;
import net.i2p.data.i2cp.MessageStatusMessage;
import net.i2p.data.i2cp.RequestVariableLeaseSetMessage;
import net.i2p.router.Job;
import net.i2p.router.RouterContext;
/**
* For testing
*
* @since 0.9.8
*/
class LocalClientConnectionRunner extends ClientConnectionRunner {
/**
* Create a new runner with the given queues
*
*/
public LocalClientConnectionRunner(RouterContext context, ClientManager manager, Socket socket) {
super(context, manager, socket);
}
/**
* Custom listener
*/
@Override
protected I2CPMessageReader.I2CPMessageEventListener createListener() {
return new LocalClientMessageEventListener(_context, this, true);
}
/**
* Just send the message directly,
* don't instantiate a RequestLeaseSetJob
*/
@Override
void requestLeaseSet(Hash h, LeaseSet set, long expirationTime, Job onCreateJob, Job onFailedJob) {
RequestVariableLeaseSetMessage msg = new RequestVariableLeaseSetMessage();
msg.setSessionId(getSessionId(h));
for (int i = 0; i < set.getLeaseCount(); i++) {
Lease lease = set.getLease(i);
msg.addEndpoint(lease);
}
try {
doSend(msg);
} catch (I2CPMessageException ime) {
ime.printStackTrace();
}
}
/**
* No job queue, so super NPEs
*/
@Override
void updateMessageDeliveryStatus(Destination dest, MessageId id, long messageNonce, int status) {
if (messageNonce <= 0)
return;
MessageStatusMessage msg = new MessageStatusMessage();
msg.setMessageId(id.getMessageId());
msg.setSessionId(getSessionId(dest.calculateHash()).getSessionId());
// has to be >= 0, it is initialized to -1
msg.setNonce(messageNonce);
msg.setSize(0);
msg.setStatus(status);
try {
doSend(msg);
} catch (I2CPMessageException ime) {
_log.warn("Error updating the status for " + id, ime);
}
}
/**
* So LocalClientMessageEventListener can lookup other local dests
*/
public Destination localLookup(Hash h) {
for (Destination d : _manager.getRunnerDestinations()) {
if (d.calculateHash().equals(h))
return d;
}
return null;
}
}