package freenet.node;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Random;
import freenet.io.comm.AsyncMessageCallback;
import freenet.io.comm.ByteCounter;
import freenet.io.comm.Message;
import freenet.io.comm.NotConnectedException;
import freenet.io.comm.Peer;
import freenet.io.comm.PeerContext;
import freenet.io.comm.SocketHandler;
import freenet.io.comm.Peer.LocalAddressException;
import freenet.io.xfer.PacketThrottle;
/** Tests can override this to record specific events e.g. rekey */
public class NullBasePeerNode implements BasePeerNode {
@Override
public Peer getPeer() {
return null;
}
@Override
public void forceDisconnect() {
throw new UnsupportedOperationException();
}
@Override
public boolean isConnected() {
return true;
}
@Override
public boolean isRoutable() {
return false;
}
@Override
public int getVersionNumber() {
throw new UnsupportedOperationException();
}
@Override
public MessageItem sendAsync(Message msg, AsyncMessageCallback cb,
ByteCounter ctr) throws NotConnectedException {
throw new UnsupportedOperationException();
}
@Override
public long getBootID() {
return 0;
}
@Override
public PacketThrottle getThrottle() {
return null;
}
@Override
public SocketHandler getSocketHandler() {
return null;
}
@Override
public OutgoingPacketMangler getOutgoingMangler() {
return null;
}
@Override
public WeakReference<? extends PeerContext> getWeakRef() {
return new WeakReference<NullBasePeerNode>(this);
}
@Override
public String shortToString() {
return toString();
}
@Override
public void transferFailed(String reason, boolean realTime) {
// Awww
}
@Override
public boolean unqueueMessage(MessageItem item) {
throw new UnsupportedOperationException();
}
SessionKey currentKey;
SessionKey previousKey;
SessionKey unverifiedKey;
@Override
public SessionKey getCurrentKeyTracker() {
return currentKey;
}
@Override
public SessionKey getPreviousKeyTracker() {
return previousKey;
}
@Override
public SessionKey getUnverifiedKeyTracker() {
return unverifiedKey;
}
@Override
public void receivedPacket(boolean dontLog, boolean dataPacket) {
// Do nothing by default
}
@Override
public void verified(SessionKey s) {
if (decryptedMessages == null)
throw new UnsupportedOperationException(); // Not expecting messages.
}
@Override
public void startRekeying() {
throw new UnsupportedOperationException();
}
@Override
public void maybeRekey() {
// Do nothing
}
@Override
public void reportIncomingBytes(int length) {
// Ignore
}
@Override
public void reportOutgoingBytes(int length) {
// Ignore
}
protected ArrayList<byte[]> decryptedMessages;
protected void processDecryptedMessage(byte[] data, int offset, int length,
int overhead) {
if (decryptedMessages == null) {
throw new UnsupportedOperationException();
} else {
decryptedMessages.add(java.util.Arrays.copyOfRange(data, offset, offset+length));
}
}
@Override
public void reportPing(long rt) {
// Ignore
}
@Override
public double averagePingTime() {
return 250;
}
@Override
public void wakeUpSender() {
// Do nothing
}
@Override
public int getMaxPacketSize() {
return 1280;
}
public PeerMessageQueue messageQueue;
@Override
public PeerMessageQueue getMessageQueue() {
return messageQueue;
}
@Override
public boolean shouldPadDataPackets() {
return false;
}
byte[] sentEncryptedPacket;
@Override
public void sendEncryptedPacket(byte[] data) throws LocalAddressException {
sentEncryptedPacket = data;
}
@Override
public void sentPacket() {
// Do nothing
}
@Override
public boolean shouldThrottle() {
return false;
}
@Override
public void sentThrottledBytes(int length) {
// Do nothing
}
@Override
public void onNotificationOnlyPacketSent(int length) {
// Do nothing
}
@Override
public void resentBytes(int bytesToResend) {
// Ignore
}
@Override
public Random paddingGen() {
return null;
}
@Override
public void handleMessage(Message msg) {
throw new UnsupportedOperationException();
}
@Override
public MessageItem makeLoadStats(boolean realtime, boolean highPriority, boolean lossy) {
// Don't send load stats.
return null;
}
@Override
public boolean grabSendLoadStatsASAP(boolean realtime) {
return false;
}
@Override
public void setSendLoadStatsASAP(boolean realtime) {
throw new UnsupportedOperationException();
}
@Override
public void reportThrottledPacketSendTime(long time, boolean realTime) {
// Ignore.
}
@Override
public DecodingMessageGroup startProcessingDecryptedMessages(int count) {
return new DecodingMessageGroup() {
@Override
public void processDecryptedMessage(byte[] data, int offset,
int length, int overhead) {
NullBasePeerNode.this.processDecryptedMessage(data, offset, length, overhead);
}
@Override
public void complete() {
// Do nothing.
}
};
}
@Override
public double averagePingTimeCorrected() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void backoffOnResend() {
// Ignore
}
@Override
public void receivedAck(long currentTimeMillis) {
// Ignore
}
@Override
public int getThrottleWindowSize() {
// Arbitrary.
return 10;
}
}