X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Ffcp%2Fhighlevel%2FFcpClient.java;h=aa2c8f15dcb6f2ffa3d3e0f125c7381dbc931e44;hb=fa22404c6b514de83828117b9885a1da1a851481;hp=71b118e5f51faf2b49b15212603d554f4927101a;hpb=9eeeeee78c2b7c3f6e8cda59779f1c9be036357e;p=jFCPlib.git diff --git a/src/net/pterodactylus/fcp/highlevel/FcpClient.java b/src/net/pterodactylus/fcp/highlevel/FcpClient.java index 71b118e..aa2c8f1 100644 --- a/src/net/pterodactylus/fcp/highlevel/FcpClient.java +++ b/src/net/pterodactylus/fcp/highlevel/FcpClient.java @@ -33,19 +33,26 @@ import net.pterodactylus.fcp.ClientHello; import net.pterodactylus.fcp.CloseConnectionDuplicateClientName; import net.pterodactylus.fcp.EndListPeerNotes; import net.pterodactylus.fcp.EndListPeers; +import net.pterodactylus.fcp.EndListPersistentRequests; import net.pterodactylus.fcp.FcpAdapter; import net.pterodactylus.fcp.FcpConnection; import net.pterodactylus.fcp.FcpListener; +import net.pterodactylus.fcp.GenerateSSK; import net.pterodactylus.fcp.ListPeerNotes; import net.pterodactylus.fcp.ListPeers; +import net.pterodactylus.fcp.ListPersistentRequests; import net.pterodactylus.fcp.ModifyPeer; +import net.pterodactylus.fcp.ModifyPeerNote; import net.pterodactylus.fcp.NodeHello; import net.pterodactylus.fcp.NodeRef; import net.pterodactylus.fcp.Peer; import net.pterodactylus.fcp.PeerNote; import net.pterodactylus.fcp.PeerRemoved; +import net.pterodactylus.fcp.PersistentGet; import net.pterodactylus.fcp.ProtocolError; import net.pterodactylus.fcp.RemovePeer; +import net.pterodactylus.fcp.SSKKeypair; +import net.pterodactylus.fcp.WatchGlobal; import net.pterodactylus.util.thread.ObjectWrapper; /** @@ -158,6 +165,8 @@ public class FcpClient { fcpConnection.connect(); ClientHello clientHello = new ClientHello(name); fcpConnection.sendMessage(clientHello); + WatchGlobal watchGlobal = new WatchGlobal(true); + fcpConnection.sendMessage(watchGlobal); } /** @@ -202,7 +211,8 @@ public class FcpClient { new ExtendedFcpAdapter() { /** The ID of the “ListPeers” request. */ - private String identifier = "list-peers-" + System.currentTimeMillis(); + @SuppressWarnings("synthetic-access") + private String identifier = createIdentifier("list-peers"); /** * {@inheritDoc} @@ -454,6 +464,149 @@ public class FcpClient { } /** + * Replaces the peer note for the given peer. + * + * @param peer + * The peer + * @param noteText + * The new base64-encoded note text + * @param noteType + * The type of the note (currently only 1 is + * allowed) + * @throws IOException + * if an I/O error occurs + * @throws FcpException + * if an FCP error occurs + */ + public void modifyPeerNote(final Peer peer, final String noteText, final int noteType) throws IOException, FcpException { + new ExtendedFcpAdapter() { + + /** + * {@inheritDoc} + */ + @Override + @SuppressWarnings("synthetic-access") + public void run() throws IOException { + fcpConnection.sendMessage(new ModifyPeerNote(peer.getIdentity(), noteText, noteType)); + } + + /** + * {@inheritDoc} + */ + @Override + public void receivedPeer(FcpConnection fcpConnection, Peer receivedPeer) { + if (receivedPeer.getIdentity().equals(peer.getIdentity())) { + completionLatch.countDown(); + } + } + }.execute(); + } + + // + // KEY GENERATION + // + + /** + * Generates a new SSK key pair. + * + * @return The generated key pair + * @throws IOException + * if an I/O error occurs + * @throws FcpException + * if an FCP error occurs + */ + public SSKKeypair generateKeyPair() throws IOException, FcpException { + final ObjectWrapper sskKeypairWrapper = new ObjectWrapper(); + new ExtendedFcpAdapter() { + + /** + * {@inheritDoc} + */ + @Override + @SuppressWarnings("synthetic-access") + public void run() throws IOException { + fcpConnection.sendMessage(new GenerateSSK()); + } + + /** + * {@inheritDoc} + */ + @Override + public void receivedSSKKeypair(FcpConnection fcpConnection, SSKKeypair sskKeypair) { + sskKeypairWrapper.set(sskKeypair); + completionLatch.countDown(); + } + }.execute(); + return sskKeypairWrapper.get(); + } + + // + // REQUEST MANAGEMENT + // + + /** + * Returns all currently visible persistent get requests. + * + * @param global + * true to return get requests from the global + * queue, false to only show requests from the + * client-local queue + * @return All get requests + * @throws IOException + * if an I/O error occurs + * @throws FcpException + * if an FCP error occurs + */ + public Set getGetRequests(final boolean global) throws IOException, FcpException { + final Set getRequests = Collections.synchronizedSet(new HashSet()); + new ExtendedFcpAdapter() { + + /** + * {@inheritDoc} + */ + @Override + @SuppressWarnings("synthetic-access") + public void run() throws IOException { + fcpConnection.sendMessage(new ListPersistentRequests()); + } + + /** + * {@inheritDoc} + */ + @Override + public void receivedPersistentGet(FcpConnection fcpConnection, PersistentGet persistentGet) { + if (!persistentGet.isGlobal() || global) { + getRequests.add(persistentGet); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void receivedEndListPersistentRequests(FcpConnection fcpConnection, EndListPersistentRequests endListPersistentRequests) { + completionLatch.countDown(); + } + }.execute(); + return getRequests; + } + + // + // PRIVATE METHODS + // + + /** + * Creates a unique request identifier. + * + * @param basename + * The basename of the request + * @return The created request identifier + */ + private String createIdentifier(String basename) { + return basename + "-" + System.currentTimeMillis() + "-" + (int) (Math.random() * Integer.MAX_VALUE); + } + + /** * Implementation of an {@link FcpListener} that can store an * {@link FcpException} and wait for the arrival of a certain command. *