X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Ffcp%2Fhighlevel%2FHighLevelClient.java;h=14be335a68d4b60b4af98c4d72d3408df80cb524;hb=60144e6607f54352fdd28869e4af8b567c4e69da;hp=6ab962bfd7b4eec5a0b7033a5097cf8834bf3cda;hpb=7020af8093e423c6a990a6db20da3514ac56236a;p=jFCPlib.git diff --git a/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java b/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java index 6ab962b..14be335 100644 --- a/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java +++ b/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java @@ -22,6 +22,9 @@ package net.pterodactylus.fcp.highlevel; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import net.pterodactylus.fcp.AllData; import net.pterodactylus.fcp.ClientHello; @@ -36,8 +39,10 @@ import net.pterodactylus.fcp.FcpConnection; import net.pterodactylus.fcp.FcpListener; import net.pterodactylus.fcp.FcpMessage; import net.pterodactylus.fcp.FinishedCompression; +import net.pterodactylus.fcp.GenerateSSK; import net.pterodactylus.fcp.GetFailed; import net.pterodactylus.fcp.IdentifierCollision; +import net.pterodactylus.fcp.ListPeers; import net.pterodactylus.fcp.NodeData; import net.pterodactylus.fcp.NodeHello; import net.pterodactylus.fcp.Peer; @@ -93,6 +98,12 @@ public class HighLevelClient { /** The callback for {@link #connect()}. */ private HighLevelCallback connectCallback; + /** Mapping from request identifiers to callbacks. */ + private Map> keyGenerationCallbacks = Collections.synchronizedMap(new HashMap>()); + + /** Mapping from request identifier to peer list callbacks. */ + private Map> peerListCallbacks = Collections.synchronizedMap(new HashMap>()); + /** * Creates a new high-level client that connects to a node on * localhost. @@ -174,7 +185,7 @@ public class HighLevelClient { fcpConnection = new FcpConnection(address, port); fcpConnection.addFcpListener(highLevelClientFcpListener); ClientHello clientHello = new ClientHello(clientName); - connectCallback = new HighLevelCallback(); + connectCallback = new HighLevelCallback(new ConnectResult()); fcpConnection.sendMessage(clientHello); return connectCallback; } @@ -186,6 +197,49 @@ public class HighLevelClient { } /** + * Generates a new SSK keypair. + * + * @return A callback with the keypair + * @throws IOException + * if an I/O error occurs communicating with the node + */ + public HighLevelCallback generateKey() throws IOException { + String identifier = generateIdentifier("generateSSK"); + GenerateSSK generateSSK = new GenerateSSK(identifier); + HighLevelCallback keyGenerationCallback = new HighLevelCallback(new KeyGenerationResult()); + keyGenerationCallbacks.put(identifier, keyGenerationCallback); + fcpConnection.sendMessage(generateSSK); + return keyGenerationCallback; + } + + /** + * Gets a list of all peers from the node. + * + * @return A callback with the peer list + * @throws IOException + * if an I/O error occurs with the node + */ + public HighLevelCallback getPeers() throws IOException { + String identifier = generateIdentifier("listPeers"); + ListPeers listPeers = new ListPeers(identifier, true, true); + HighLevelCallback peerListCallback = new HighLevelCallback(new PeerListResult()); + peerListCallbacks.put(identifier, peerListCallback); + fcpConnection.sendMessage(listPeers); + return peerListCallback; + } + + /** + * Generates an identifier for the given function. + * + * @param function + * The name of the function + * @return An identifier + */ + private String generateIdentifier(String function) { + return "jFCPlib-" + function + "-" + System.currentTimeMillis(); + } + + /** * FCP listener for {@link HighLevelClient}. * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> @@ -244,7 +298,17 @@ public class HighLevelClient { * @see net.pterodactylus.fcp.FcpListener#receivedEndListPeers(net.pterodactylus.fcp.FcpConnection, * net.pterodactylus.fcp.EndListPeers) */ + @SuppressWarnings("synthetic-access") public void receivedEndListPeers(FcpConnection fcpConnection, EndListPeers endListPeers) { + if (fcpConnection != HighLevelClient.this.fcpConnection) { + return; + } + String identifier = endListPeers.getIdentifier(); + HighLevelCallback peerListCallback = peerListCallbacks.remove(identifier); + if (peerListCallback == null) { + return; + } + peerListCallback.setDone(); } /** @@ -298,10 +362,10 @@ public class HighLevelClient { if (fcpConnection != HighLevelClient.this.fcpConnection) { return; } - ConnectResult connectResult = new ConnectResult(); - synchronized (syncObject) { - connectCallback.setResult(connectResult); + connectCallback.getIntermediaryResult().setFailed(false); + connectCallback.setDone(); + connectCallback = null; } } @@ -309,7 +373,17 @@ public class HighLevelClient { * @see net.pterodactylus.fcp.FcpListener#receivedPeer(net.pterodactylus.fcp.FcpConnection, * net.pterodactylus.fcp.Peer) */ + @SuppressWarnings("synthetic-access") public void receivedPeer(FcpConnection fcpConnection, Peer peer) { + if (fcpConnection != HighLevelClient.this.fcpConnection) { + return; + } + String identifier = peer.getIdentifier(); + HighLevelCallback peerListCallback = peerListCallbacks.get(identifier); + if (peerListCallback == null) { + return; + } + peerListCallback.getIntermediaryResult().addPeer(peer); } /** @@ -372,7 +446,28 @@ public class HighLevelClient { * @see net.pterodactylus.fcp.FcpListener#receivedProtocolError(net.pterodactylus.fcp.FcpConnection, * net.pterodactylus.fcp.ProtocolError) */ + @SuppressWarnings("synthetic-access") public void receivedProtocolError(FcpConnection fcpConnection, ProtocolError protocolError) { + if (fcpConnection != HighLevelClient.this.fcpConnection) { + return; + } + String identifier = protocolError.getIdentifier(); + if (identifier == null) { + return; + } + /* now check all callbacks. */ + synchronized (syncObject) { + if (connectCallback != null) { + connectCallback.getIntermediaryResult().setFailed(true); + connectCallback.setDone(); + connectCallback = null; + } + } + HighLevelCallback keyGenerationCallback = keyGenerationCallbacks.remove(identifier); + if (keyGenerationCallback != null) { + keyGenerationCallback.getIntermediaryResult().setFailed(true); + keyGenerationCallback.setDone(); + } } /** @@ -400,7 +495,19 @@ public class HighLevelClient { * @see net.pterodactylus.fcp.FcpListener#receivedSSKKeypair(net.pterodactylus.fcp.FcpConnection, * net.pterodactylus.fcp.SSKKeypair) */ + @SuppressWarnings("synthetic-access") public void receivedSSKKeypair(FcpConnection fcpConnection, SSKKeypair sskKeypair) { + if (fcpConnection != HighLevelClient.this.fcpConnection) { + return; + } + HighLevelCallback keyGenerationCallback = keyGenerationCallbacks.remove(sskKeypair.getIdentifier()); + if (keyGenerationCallback == null) { + return; + } + KeyGenerationResult keyGenerationResult = keyGenerationCallback.getIntermediaryResult(); + keyGenerationResult.setInsertURI(sskKeypair.getInsertURI()); + keyGenerationResult.setRequestURI(sskKeypair.getRequestURI()); + keyGenerationCallback.setDone(); } /**