Enable “WatchGlobal” mode directly after connecting.
[jFCPlib.git] / src / net / pterodactylus / fcp / highlevel / FcpClient.java
index d33105c..aa2c8f1 100644 (file)
@@ -33,11 +33,14 @@ 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;
@@ -45,8 +48,11 @@ 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;
 
 /**
@@ -159,6 +165,8 @@ public class FcpClient {
                                fcpConnection.connect();
                                ClientHello clientHello = new ClientHello(name);
                                fcpConnection.sendMessage(clientHello);
+                               WatchGlobal watchGlobal = new WatchGlobal(true);
+                               fcpConnection.sendMessage(watchGlobal);
                        }
 
                        /**
@@ -203,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}
@@ -493,6 +502,110 @@ public class FcpClient {
                }.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<SSKKeypair> sskKeypairWrapper = new ObjectWrapper<SSKKeypair>();
+               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
+        *            <code>true</code> to return get requests from the global
+        *            queue, <code>false</code> 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<PersistentGet> getGetRequests(final boolean global) throws IOException, FcpException {
+               final Set<PersistentGet> getRequests = Collections.synchronizedSet(new HashSet<PersistentGet>());
+               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.