package com.robonobo.mina.network;
import java.util.List;
import com.robonobo.core.api.proto.CoreApi.EndPoint;
import com.robonobo.core.api.proto.CoreApi.Node;
import com.robonobo.mina.external.HandoverHandler;
import com.robonobo.mina.instance.MinaInstance;
import com.robonobo.mina.message.proto.MinaProtocol.PublicDetails;
public interface EndPointMgr {
public void start() throws Exception;
public void stop();
/**
* If this guy is asking for service, which endpoint should I send to him
* (null to not advertise to him)?
*/
public EndPoint getEndPointForTalkingTo(Node node);
/** The endpoint I am listening on - public version (null if none) */
public EndPoint getPublicEndPoint();
/** Local version */
public EndPoint getLocalEndPoint();
/** Can I connect to this guy? */
public boolean canConnectTo(Node node);
/**
* Connect to the specified node, but don't use any of the endpoints in
* alreadyTriedEps.
* @param indirectAllowed Are we allowed to ask them to connect to us based on this ep (eg nat traversal)
* @return The newly-created cc, or null if no connection was made - if canConnectTo() returned true for this ep, this means send a ReqConn (we're doing nat traversal)
*/
public ControlConnection connectTo(Node node, List<EndPoint> alreadyTriedEps, boolean indirectAllowed);
/** Locates local nodes (those reachable without a supernode) */
public void locateLocalNodes();
public void setMina(MinaInstance mina);
public void configUpdated();
public void setHandoverHandler(HandoverHandler handler);
/** Have we decided if we can holepunch through NAT yet? */
public boolean natTraversalDecided();
/** Advised of my public details so I can decide if we can holepunch through NAT.
* @return true if I now have an extra endpoint to advertise, false otherwise */
public boolean advisePublicDetails(PublicDetails publicDetails, EndPoint source);
public abstract ControlConnection connectTo(Node node, EndPoint ep, boolean indirectAllowed);
public abstract EndPoint getEndPointForConnectionTo(Node node, List<EndPoint> alreadyTriedEps, boolean indirectAllowed);
public abstract boolean canConnectTo(EndPoint ep);
}