X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Ffcp%2Fhighlevel%2FHighLevelClient.java;h=0ec6da6f44761cd2936e719bf4cb0887db601094;hb=16353715c279d8b535b7aabb287764e591788c92;hp=089c205899befee64538f670132e3ae56cd5a871;hpb=3a469460159df2cb9e9c99dbedd1e9b7b4ef22bd;p=jFCPlib.git diff --git a/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java b/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java index 089c205..0ec6da6 100644 --- a/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java +++ b/src/net/pterodactylus/fcp/highlevel/HighLevelClient.java @@ -35,6 +35,7 @@ import java.util.logging.Logger; import net.pterodactylus.fcp.AddPeer; import net.pterodactylus.fcp.AllData; +import net.pterodactylus.fcp.ClientGet; import net.pterodactylus.fcp.ClientHello; import net.pterodactylus.fcp.CloseConnectionDuplicateClientName; import net.pterodactylus.fcp.ConfigData; @@ -68,6 +69,7 @@ import net.pterodactylus.fcp.ProtocolError; import net.pterodactylus.fcp.PutFailed; import net.pterodactylus.fcp.PutFetchable; import net.pterodactylus.fcp.PutSuccessful; +import net.pterodactylus.fcp.ReturnType; import net.pterodactylus.fcp.SSKKeypair; import net.pterodactylus.fcp.SimpleProgress; import net.pterodactylus.fcp.StartedCompression; @@ -125,6 +127,9 @@ public class HighLevelClient { /** Mapping from directories to DDA callbacks. */ private Map> directDiskAccessCallbacks = Collections.synchronizedMap(new HashMap>()); + /** Mapping from request identifiers to download callbacks. */ + private Map> downloadCallbacks = Collections.synchronizedMap(new HashMap>()); + /** * Creates a new high-level client that connects to a node on * localhost. @@ -227,7 +232,7 @@ public class HighLevelClient { public HighLevelCallback generateKey() throws IOException { String identifier = generateIdentifier("generateSSK"); GenerateSSK generateSSK = new GenerateSSK(identifier); - HighLevelCallback keyGenerationCallback = new HighLevelCallback(new KeyGenerationResult()); + HighLevelCallback keyGenerationCallback = new HighLevelCallback(new KeyGenerationResult(identifier)); keyGenerationCallbacks.put(identifier, keyGenerationCallback); fcpConnection.sendMessage(generateSSK); return keyGenerationCallback; @@ -243,7 +248,7 @@ public class HighLevelClient { public HighLevelCallback getPeers() throws IOException { String identifier = generateIdentifier("listPeers"); ListPeers listPeers = new ListPeers(identifier, true, true); - HighLevelCallback peerListCallback = new HighLevelCallback(new PeerListResult()); + HighLevelCallback peerListCallback = new HighLevelCallback(new PeerListResult(identifier)); peerListCallbacks.put(identifier, peerListCallback); fcpConnection.sendMessage(listPeers); return peerListCallback; @@ -261,7 +266,7 @@ public class HighLevelClient { public HighLevelCallback addPeer(String nodeRefFile) throws IOException { String identifier = generateIdentifier("addPeer"); AddPeer addPeer = new AddPeer(nodeRefFile); - HighLevelCallback peerCallback = new HighLevelCallback(new PeerResult()); + HighLevelCallback peerCallback = new HighLevelCallback(new PeerResult(identifier)); peerCallbacks.put(identifier, peerCallback); fcpConnection.sendMessage(addPeer); return peerCallback; @@ -279,7 +284,7 @@ public class HighLevelClient { public HighLevelCallback addPeer(URL nodeRefURL) throws IOException { String identifier = generateIdentifier("addPeer"); AddPeer addPeer = new AddPeer(nodeRefURL); - HighLevelCallback peerCallback = new HighLevelCallback(new PeerResult()); + HighLevelCallback peerCallback = new HighLevelCallback(new PeerResult(identifier)); peerCallbacks.put(identifier, peerCallback); fcpConnection.sendMessage(addPeer); return peerCallback; @@ -297,7 +302,7 @@ public class HighLevelClient { public HighLevelCallback addPeer(NodeRef nodeRef) throws IOException { String identifier = generateIdentifier("addPeer"); AddPeer addPeer = new AddPeer(nodeRef); - HighLevelCallback peerCallback = new HighLevelCallback(new PeerResult()); + HighLevelCallback peerCallback = new HighLevelCallback(new PeerResult(identifier)); peerCallbacks.put(identifier, peerCallback); fcpConnection.sendMessage(addPeer); return peerCallback; @@ -319,12 +324,40 @@ public class HighLevelClient { */ public HighLevelCallback checkDirectDiskAccess(String directory, boolean wantRead, boolean wantWrite) throws IOException { TestDDARequest testDDARequest = new TestDDARequest(directory, wantRead, wantWrite); - HighLevelCallback directDiskAccessCallback = new HighLevelCallback(new DirectDiskAccessResult()); + HighLevelCallback directDiskAccessCallback = new HighLevelCallback(new DirectDiskAccessResult(directory)); directDiskAccessCallbacks.put(directory, directDiskAccessCallback); fcpConnection.sendMessage(testDDARequest); return directDiskAccessCallback; } + /** + * Starts a download. Files can either be download to disk or streamed from + * the node. When downloading to disk you have to perform a direct disk + * access check for the directory you want to put the downloaded file in! + * + * @see #checkDirectDiskAccess(String, boolean, boolean) + * @param uri + * The URI to get + * @param filename + * The filename to save the data to, or null to + * retrieve the data as InputStream from the + * {@link DownloadResult} + * @param global + * Whether to put the download on the global queue + * @return A download result + * @throws IOException + * if an I/O error occurs communicating with the node + */ + public HighLevelProgressCallback download(String uri, String filename, boolean global) throws IOException { + String identifier = generateIdentifier("download"); + ClientGet clientGet = new ClientGet(uri, identifier, (filename == null) ? ReturnType.direct : ReturnType.disk); + clientGet.setGlobal(global); + HighLevelProgressCallback downloadCallback = new HighLevelProgressCallback(new DownloadResult(identifier)); + downloadCallbacks.put(identifier, downloadCallback); + fcpConnection.sendMessage(clientGet); + return downloadCallback; + } + // // PRIVATE METHODS // @@ -403,6 +436,12 @@ public class HighLevelClient { directDiskAccessEntry.getValue().setDone(); } directDiskAccessCallbacks.clear(); + /* download callbacks. */ + for (Entry> downloadEntry: downloadCallbacks.entrySet()) { + downloadEntry.getValue().getIntermediaryResult().setFailed(true); + downloadEntry.getValue().setDone(); + } + downloadCallbacks.clear(); } else { HighLevelCallback keyGenerationCallback = keyGenerationCallbacks.remove(identifier); if (keyGenerationCallback != null) { @@ -428,6 +467,12 @@ public class HighLevelClient { directDiskAccessCallback.setDone(); return; } + HighLevelProgressCallback downloadCallback = downloadCallbacks.remove(identifier); + if (downloadCallback != null) { + downloadCallback.getIntermediaryResult().setFailed(true); + downloadCallback.setDone(); + return; + } } } @@ -582,7 +627,20 @@ public class HighLevelClient { * @see net.pterodactylus.fcp.FcpListener#receivedGetFailed(net.pterodactylus.fcp.FcpConnection, * net.pterodactylus.fcp.GetFailed) */ + @SuppressWarnings("synthetic-access") public void receivedGetFailed(FcpConnection fcpConnection, GetFailed getFailed) { + if (fcpConnection != HighLevelClient.this.fcpConnection) { + return; + } + String identifier = getFailed.getIdentifier(); + HighLevelProgressCallback downloadCallback = downloadCallbacks.remove(identifier); + if (downloadCallback != null) { + downloadCallback.getIntermediaryResult().setFailed(true); + downloadCallback.setDone(); + return; + } + /* unknown identifier? */ + logger.warning("unknown identifier for GetFailed: " + identifier); } /** @@ -644,7 +702,9 @@ public class HighLevelClient { if (peerResult != null) { peerResult.getIntermediaryResult().setPeer(peer); peerResult.setDone(); + return; } + logger.warning("got Peer message with unknown identifier: " + identifier); } /** @@ -665,7 +725,16 @@ public class HighLevelClient { * @see net.pterodactylus.fcp.FcpListener#receivedPersistentGet(net.pterodactylus.fcp.FcpConnection, * net.pterodactylus.fcp.PersistentGet) */ + @SuppressWarnings("synthetic-access") public void receivedPersistentGet(FcpConnection fcpConnection, PersistentGet persistentGet) { + if (fcpConnection != HighLevelClient.this.fcpConnection) { + return; + } + String identifier = persistentGet.getIdentifier(); + if (downloadCallbacks.containsKey(identifier)) { + /* ignore, because a download does not care about this. */ + return; + } } /** @@ -763,7 +832,26 @@ public class HighLevelClient { * @see net.pterodactylus.fcp.FcpListener#receivedSimpleProgress(net.pterodactylus.fcp.FcpConnection, * net.pterodactylus.fcp.SimpleProgress) */ + @SuppressWarnings("synthetic-access") public void receivedSimpleProgress(FcpConnection fcpConnection, SimpleProgress simpleProgress) { + if (fcpConnection != HighLevelClient.this.fcpConnection) { + return; + } + String identifier = simpleProgress.getIdentifier(); + HighLevelProgressCallback downloadCallback = downloadCallbacks.get(identifier); + if (downloadCallback != null) { + DownloadResult downloadResult = downloadCallback.getIntermediaryResult(); + downloadResult.setTotalBlocks(simpleProgress.getTotal()); + downloadResult.setRequiredBlocks(simpleProgress.getRequired()); + downloadResult.setSuccessfulBlocks(simpleProgress.getSucceeded()); + downloadResult.setFailedBlocks(simpleProgress.getFailed()); + downloadResult.setFatallyFailedBlocks(simpleProgress.getFatallyFailed()); + downloadResult.setTotalFinalized(simpleProgress.isFinalizedTotal()); + downloadCallback.progressUpdated(); + return; + } + /* unknown identifier? */ + logger.warning("unknown identifier for SimpleProgress: " + identifier); } /**