X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Ffcp%2Fhighlevel%2FFcpClient.java;h=027b41574abb751b10d579aff60542cdc6365af9;hb=c62dc5885567ae89db150776ac01fcc31b3120fe;hp=1b695e9d7b66e3a70b82670e8be206cc176fe415;hpb=b782bfe5ddfe62489591eda0537a9c335ed4c624;p=jFCPlib.git
diff --git a/src/net/pterodactylus/fcp/highlevel/FcpClient.java b/src/net/pterodactylus/fcp/highlevel/FcpClient.java
index 1b695e9..027b415 100644
--- a/src/net/pterodactylus/fcp/highlevel/FcpClient.java
+++ b/src/net/pterodactylus/fcp/highlevel/FcpClient.java
@@ -23,22 +23,29 @@ import java.io.IOException;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
+import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import net.pterodactylus.fcp.AddPeer;
import net.pterodactylus.fcp.ClientHello;
import net.pterodactylus.fcp.CloseConnectionDuplicateClientName;
+import net.pterodactylus.fcp.DataFound;
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.GetFailed;
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;
@@ -46,9 +53,13 @@ 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.PersistentPut;
import net.pterodactylus.fcp.ProtocolError;
import net.pterodactylus.fcp.RemovePeer;
import net.pterodactylus.fcp.SSKKeypair;
+import net.pterodactylus.fcp.SimpleProgress;
+import net.pterodactylus.fcp.WatchGlobal;
import net.pterodactylus.util.thread.ObjectWrapper;
/**
@@ -161,6 +172,8 @@ public class FcpClient {
fcpConnection.connect();
ClientHello clientHello = new ClientHello(name);
fcpConnection.sendMessage(clientHello);
+ WatchGlobal watchGlobal = new WatchGlobal(true);
+ fcpConnection.sendMessage(watchGlobal);
}
/**
@@ -535,6 +548,131 @@ public class FcpClient {
}
//
+ // 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 Collection getGetRequests(final boolean global) throws IOException, FcpException {
+ return getRequests(global);
+ }
+
+ public Collection getRequests(final boolean global) throws IOException, FcpException {
+ final Map requests = Collections.synchronizedMap(new HashMap());
+ 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) {
+ GetRequest getRequest = new GetRequest(persistentGet);
+ requests.put(persistentGet.getIdentifier(), getRequest);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see net.pterodactylus.fcp.FcpAdapter#receivedDataFound(net.pterodactylus.fcp.FcpConnection,
+ * net.pterodactylus.fcp.DataFound)
+ */
+ @Override
+ public void receivedDataFound(FcpConnection fcpConnection, DataFound dataFound) {
+ Request getRequest = requests.get(dataFound.getIdentifier());
+ if (getRequest == null) {
+ return;
+ }
+ getRequest.setComplete(true);
+ getRequest.setLength(dataFound.getDataLength());
+ getRequest.setContentType(dataFound.getMetadataContentType());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see net.pterodactylus.fcp.FcpAdapter#receivedGetFailed(net.pterodactylus.fcp.FcpConnection,
+ * net.pterodactylus.fcp.GetFailed)
+ */
+ @Override
+ public void receivedGetFailed(FcpConnection fcpConnection, GetFailed getFailed) {
+ Request getRequest = requests.get(getFailed.getIdentifier());
+ if (getRequest == null) {
+ return;
+ }
+ getRequest.setComplete(true);
+ getRequest.setFailed(true);
+ getRequest.setFatal(getFailed.isFatal());
+ getRequest.setErrorCode(getFailed.getCode());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see net.pterodactylus.fcp.FcpAdapter#receivedPersistentPut(net.pterodactylus.fcp.FcpConnection,
+ * net.pterodactylus.fcp.PersistentPut)
+ */
+ @Override
+ public void receivedPersistentPut(FcpConnection fcpConnection, PersistentPut persistentPut) {
+ if (!persistentPut.isGlobal() || global) {
+ PutRequest putRequest = new PutRequest(persistentPut);
+ requests.put(persistentPut.getIdentifier(), putRequest);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see net.pterodactylus.fcp.FcpAdapter#receivedSimpleProgress(net.pterodactylus.fcp.FcpConnection,
+ * net.pterodactylus.fcp.SimpleProgress)
+ */
+ @Override
+ public void receivedSimpleProgress(FcpConnection fcpConnection, SimpleProgress simpleProgress) {
+ Request request = requests.get(simpleProgress.getIdentifier());
+ if (request == null) {
+ return;
+ }
+ request.setTotalBlocks(simpleProgress.getTotal());
+ request.setRequiredBlocks(simpleProgress.getRequired());
+ request.setFailedBlocks(simpleProgress.getFailed());
+ request.setFatallyFailedBlocks(simpleProgress.getFatallyFailed());
+ request.setSucceededBlocks(simpleProgress.getSucceeded());
+ request.setFinalizedTotal(simpleProgress.isFinalizedTotal());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void receivedEndListPersistentRequests(FcpConnection fcpConnection, EndListPersistentRequests endListPersistentRequests) {
+ completionLatch.countDown();
+ }
+ }.execute();
+ return requests.values();
+ }
+
+ //
// PRIVATE METHODS
//