package net.tomp2p.holep.strategy;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.util.concurrent.EventExecutorGroup;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.tomp2p.futures.FutureDone;
import net.tomp2p.message.Message;
import net.tomp2p.p2p.Peer;
import net.tomp2p.utils.Pair;
import net.tomp2p.utils.Utils;
public class PortPreservingStrategy extends AbstractHolePStrategy {
public PortPreservingStrategy(final Peer peer, final int numberOfHoles, final int idleUDPSeconds, final Message originalMessage) {
super(peer, numberOfHoles, idleUDPSeconds, originalMessage);
}
@Override
protected void doPortGuessingInitiatingPeer(final Message holePMessage, final FutureDone<Message> initMessageFutureDone,
final List<ChannelFuture> channelFutures) throws Exception {
final List<Integer> portList = new ArrayList<Integer>(channelFutures.size());
for (int i = 0; i < channelFutures.size(); i++) {
final InetSocketAddress inetSocketAddress = (InetSocketAddress) channelFutures.get(i).channel().localAddress();
portList.add(inetSocketAddress.getPort());
}
holePMessage.intValue(portList.size());
// send all ports via Buffer
holePMessage.buffer(encodePortList(portList));
initMessageFutureDone.done(holePMessage);
}
@SuppressWarnings("unchecked")
@Override
protected void doPortGuessingTargetPeer(final Message replyMessage, final FutureDone<Message> replyMessageFuture2) throws Exception {
final List<Integer> remotePorts = (List<Integer>) Utils.decodeJavaObject(originalMessage.buffer(0).buffer());
final List<Integer> replyPorts = new ArrayList<Integer>(channelFutures.size()*2);
for (int i = 0; i < channelFutures.size(); i++) {
final InetSocketAddress socket = (InetSocketAddress) channelFutures.get(i).channel().localAddress();
portMappings.add(new Pair<Integer, Integer>(remotePorts.get(i), socket.getPort()));
replyPorts.add(remotePorts.get(i));
replyPorts.add(socket.getPort());
}
replyMessage.intValue(replyPorts.size());
// send all ports via Buffer
replyMessage.buffer(encodePortList(replyPorts));
replyMessageFuture2.done(replyMessage);
}
/**
* This method is just for testing causes.
*/
@Override
protected FutureDone<List<ChannelFuture>> createChannelFutures(
final List<Map<String, Pair<EventExecutorGroup, ChannelHandler>>> handlersList, final FutureDone<Message> mainFutureDone,
final int numberOfHoles) {
return super.createChannelFutures(handlersList, mainFutureDone, numberOfHoles);
}
/**
* This method is just for testing causes.
*/
@Override
protected List<Map<String, Pair<EventExecutorGroup, ChannelHandler>>> prepareHandlers(final boolean initiator, final FutureDone<Message> futureDone) {
return super.prepareHandlers(initiator, futureDone);
}
}