package freenet.clients.fcp; import freenet.node.DarknetPeerNode; import freenet.node.Node; import freenet.node.PeerNode; import freenet.support.SimpleFieldSet; public abstract class SendPeerMessage extends DataCarryingMessage { protected final String identifier; protected final String nodeIdentifier; private final long dataLength; public SendPeerMessage(SimpleFieldSet fs) throws MessageInvalidException { identifier = fs.get("Identifier"); nodeIdentifier = fs.get("NodeIdentifier"); String dataLengthString = fs.get("DataLength"); if(dataLengthString != null) try { //May throw NumberFormatException dataLength = Long.parseLong(dataLengthString, 10); if(dataLength < 0) throw new Exception(); } catch (Exception e) { throw new MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "Invalid DataLength field", identifier, false); } else dataLength = -1; } @Override public SimpleFieldSet getFieldSet() { SimpleFieldSet fs = new SimpleFieldSet(true); fs.putSingle("Identifier", identifier); fs.putSingle("NodeIdentifier", nodeIdentifier); if(dataLength >= 0) fs.put("DataLength", dataLength); return fs; } @Override public void run(FCPConnectionHandler handler, Node node) throws MessageInvalidException { PeerNode pn = node.getPeerNode(nodeIdentifier); if (pn == null) { FCPMessage msg = new UnknownNodeIdentifierMessage(nodeIdentifier, identifier); handler.outputHandler.queue(msg); } else if (!(pn instanceof DarknetPeerNode)) { throw new MessageInvalidException(ProtocolErrorMessage.DARKNET_ONLY, getName() + " only available for darknet peers", identifier, false); } else { int nodeStatus = handleFeed(((DarknetPeerNode) pn)); handler.outputHandler.queue(new SentPeerMessage(identifier, nodeStatus)); } } protected abstract int handleFeed(DarknetPeerNode pn) throws MessageInvalidException; @Override String getIdentifier() { return null; } @Override boolean isGlobal() { return false; } @Override long dataLength() { return dataLength; } }