2 * fcplib - HighLevelClient.java -
3 * Copyright © 2008 David Roden
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 package net.pterodactylus.fcp.highlevel;
22 import java.io.IOException;
23 import java.net.InetAddress;
25 import java.net.UnknownHostException;
26 import java.util.Collections;
27 import java.util.HashMap;
29 import java.util.Map.Entry;
31 import net.pterodactylus.fcp.AddPeer;
32 import net.pterodactylus.fcp.AllData;
33 import net.pterodactylus.fcp.ClientHello;
34 import net.pterodactylus.fcp.CloseConnectionDuplicateClientName;
35 import net.pterodactylus.fcp.ConfigData;
36 import net.pterodactylus.fcp.DataFound;
37 import net.pterodactylus.fcp.EndListPeerNotes;
38 import net.pterodactylus.fcp.EndListPeers;
39 import net.pterodactylus.fcp.EndListPersistentRequests;
40 import net.pterodactylus.fcp.FCPPluginReply;
41 import net.pterodactylus.fcp.FcpConnection;
42 import net.pterodactylus.fcp.FcpListener;
43 import net.pterodactylus.fcp.FcpMessage;
44 import net.pterodactylus.fcp.FinishedCompression;
45 import net.pterodactylus.fcp.GenerateSSK;
46 import net.pterodactylus.fcp.GetFailed;
47 import net.pterodactylus.fcp.IdentifierCollision;
48 import net.pterodactylus.fcp.ListPeers;
49 import net.pterodactylus.fcp.NodeData;
50 import net.pterodactylus.fcp.NodeHello;
51 import net.pterodactylus.fcp.NodeRef;
52 import net.pterodactylus.fcp.Peer;
53 import net.pterodactylus.fcp.PeerNote;
54 import net.pterodactylus.fcp.PeerRemoved;
55 import net.pterodactylus.fcp.PersistentGet;
56 import net.pterodactylus.fcp.PersistentPut;
57 import net.pterodactylus.fcp.PersistentPutDir;
58 import net.pterodactylus.fcp.PersistentRequestModified;
59 import net.pterodactylus.fcp.PersistentRequestRemoved;
60 import net.pterodactylus.fcp.PluginInfo;
61 import net.pterodactylus.fcp.ProtocolError;
62 import net.pterodactylus.fcp.PutFailed;
63 import net.pterodactylus.fcp.PutFetchable;
64 import net.pterodactylus.fcp.PutSuccessful;
65 import net.pterodactylus.fcp.SSKKeypair;
66 import net.pterodactylus.fcp.SimpleProgress;
67 import net.pterodactylus.fcp.StartedCompression;
68 import net.pterodactylus.fcp.SubscribedUSKUpdate;
69 import net.pterodactylus.fcp.TestDDAComplete;
70 import net.pterodactylus.fcp.TestDDAReply;
71 import net.pterodactylus.fcp.URIGenerated;
72 import net.pterodactylus.fcp.UnknownNodeIdentifier;
73 import net.pterodactylus.fcp.UnknownPeerNoteType;
76 * A high-level client that allows simple yet full-featured access to a Freenet
79 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
82 public class HighLevelClient {
84 /** Object for internal synchronization. */
85 private final Object syncObject = new Object();
87 /** The name of the client. */
88 private final String clientName;
90 /** The address of the node. */
91 private InetAddress address;
93 /** The port number of the node. */
96 /** The FCP connection to the node. */
97 private FcpConnection fcpConnection;
99 /** The listener for the connection. */
100 private HighLevelClientFcpListener highLevelClientFcpListener = new HighLevelClientFcpListener();
102 /** The callback for {@link #connect()}. */
103 private HighLevelCallback<ConnectResult> connectCallback;
105 /** Mapping from request identifiers to callbacks. */
106 private Map<String, HighLevelCallback<KeyGenerationResult>> keyGenerationCallbacks = Collections.synchronizedMap(new HashMap<String, HighLevelCallback<KeyGenerationResult>>());
108 /** Mapping from request identifier to peer list callbacks. */
109 private Map<String, HighLevelCallback<PeerListResult>> peerListCallbacks = Collections.synchronizedMap(new HashMap<String, HighLevelCallback<PeerListResult>>());
111 /** Mapping from request identifier to peer callbacks. */
112 private Map<String, HighLevelCallback<PeerResult>> peerCallbacks = Collections.synchronizedMap(new HashMap<String, HighLevelCallback<PeerResult>>());
115 * Creates a new high-level client that connects to a node on
116 * <code>localhost</code>.
119 * The name of the client
120 * @throws UnknownHostException
121 * if the hostname of the node can not be resolved.
123 public HighLevelClient(String clientName) throws UnknownHostException {
124 this(clientName, "localhost");
128 * Creates a new high-level client that connects to a node on the given
132 * The name of the client
134 * The hostname of the node
135 * @throws UnknownHostException
136 * if the hostname of the node can not be resolved.
138 public HighLevelClient(String clientName, String host) throws UnknownHostException {
139 this(clientName, host, FcpConnection.DEFAULT_PORT);
143 * Creates a new high-level client that connects to a node on the given
147 * The name of the client
149 * The hostname of the node
151 * The port number of the node
152 * @throws UnknownHostException
153 * if the hostname of the node can not be resolved.
155 public HighLevelClient(String clientName, String host, int port) throws UnknownHostException {
156 this(clientName, InetAddress.getByName(host), port);
160 * Creates a new high-level client that connects to a node at the given
164 * The name of the client
166 * The address of the node
168 * The port number of the node
170 public HighLevelClient(String clientName, InetAddress address, int port) {
171 this.clientName = clientName;
172 this.address = address;
185 * Connects the client.
187 * @return A callback with a connection result
188 * @throws IOException
189 * if an I/O error occurs communicating with the node
191 public HighLevelCallback<ConnectResult> connect() throws IOException {
192 fcpConnection = new FcpConnection(address, port);
193 fcpConnection.addFcpListener(highLevelClientFcpListener);
194 ClientHello clientHello = new ClientHello(clientName);
195 connectCallback = new HighLevelCallback<ConnectResult>(new ConnectResult());
196 fcpConnection.sendMessage(clientHello);
197 return connectCallback;
201 * Disconnects the client from the node.
203 public void disconnect() {
207 * Generates a new SSK keypair.
209 * @return A callback with the keypair
210 * @throws IOException
211 * if an I/O error occurs communicating with the node
213 public HighLevelCallback<KeyGenerationResult> generateKey() throws IOException {
214 String identifier = generateIdentifier("generateSSK");
215 GenerateSSK generateSSK = new GenerateSSK(identifier);
216 HighLevelCallback<KeyGenerationResult> keyGenerationCallback = new HighLevelCallback<KeyGenerationResult>(new KeyGenerationResult());
217 keyGenerationCallbacks.put(identifier, keyGenerationCallback);
218 fcpConnection.sendMessage(generateSSK);
219 return keyGenerationCallback;
223 * Gets a list of all peers from the node.
225 * @return A callback with the peer list
226 * @throws IOException
227 * if an I/O error occurs with the node
229 public HighLevelCallback<PeerListResult> getPeers() throws IOException {
230 String identifier = generateIdentifier("listPeers");
231 ListPeers listPeers = new ListPeers(identifier, true, true);
232 HighLevelCallback<PeerListResult> peerListCallback = new HighLevelCallback<PeerListResult>(new PeerListResult());
233 peerListCallbacks.put(identifier, peerListCallback);
234 fcpConnection.sendMessage(listPeers);
235 return peerListCallback;
239 * Adds the peer whose noderef is stored in the given file.
242 * The name of the file the peer’s noderef is stored in
243 * @return A peer callback
244 * @throws IOException
245 * if an I/O error occurs communicating with the node
247 public HighLevelCallback<PeerResult> addPeer(String nodeRefFile) throws IOException {
248 String identifier = generateIdentifier("addPeer");
249 AddPeer addPeer = new AddPeer(nodeRefFile);
250 HighLevelCallback<PeerResult> peerCallback = new HighLevelCallback<PeerResult>(new PeerResult());
251 peerCallbacks.put(identifier, peerCallback);
252 fcpConnection.sendMessage(addPeer);
257 * Adds the peer whose noderef is stored in the given file.
260 * The URL where the peer’s noderef is stored
261 * @return A peer callback
262 * @throws IOException
263 * if an I/O error occurs communicating with the node
265 public HighLevelCallback<PeerResult> addPeer(URL nodeRefURL) throws IOException {
266 String identifier = generateIdentifier("addPeer");
267 AddPeer addPeer = new AddPeer(nodeRefURL);
268 HighLevelCallback<PeerResult> peerCallback = new HighLevelCallback<PeerResult>(new PeerResult());
269 peerCallbacks.put(identifier, peerCallback);
270 fcpConnection.sendMessage(addPeer);
275 * Adds the peer whose noderef is stored in the given file.
279 * @return A peer callback
280 * @throws IOException
281 * if an I/O error occurs communicating with the node
283 public HighLevelCallback<PeerResult> addPeer(NodeRef nodeRef) throws IOException {
284 String identifier = generateIdentifier("addPeer");
285 AddPeer addPeer = new AddPeer(nodeRef);
286 HighLevelCallback<PeerResult> peerCallback = new HighLevelCallback<PeerResult>(new PeerResult());
287 peerCallbacks.put(identifier, peerCallback);
288 fcpConnection.sendMessage(addPeer);
297 * Generates an identifier for the given function.
300 * The name of the function
301 * @return An identifier
303 private String generateIdentifier(String function) {
304 return "jFCPlib-" + function + "-" + System.currentTimeMillis();
308 * FCP listener for {@link HighLevelClient}.
310 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
313 private class HighLevelClientFcpListener implements FcpListener {
316 * Creates a new FCP listener for {@link HighLevelClient}.
318 HighLevelClientFcpListener() {
326 * Searches all callback collections for a callback with the given
327 * identifier and cancels it.
330 * The identifier to search for, or <code>null</code> to
331 * cancel all pending requests
333 @SuppressWarnings("synthetic-access")
334 private void cancelIdentifier(String identifier) {
335 synchronized (syncObject) {
336 if (connectCallback != null) {
337 connectCallback.getIntermediaryResult().setFailed(true);
338 connectCallback.setDone();
339 connectCallback = null;
342 if (identifier == null) {
343 /* key generation callbacks */
344 for (Entry<String, HighLevelCallback<KeyGenerationResult>> keyGenerationEntry: keyGenerationCallbacks.entrySet()) {
345 keyGenerationEntry.getValue().getIntermediaryResult().setFailed(true);
346 keyGenerationEntry.getValue().setDone();
348 keyGenerationCallbacks.clear();
349 /* peer list callbacks. */
350 for (Entry<String, HighLevelCallback<PeerListResult>> peerListEntry: peerListCallbacks.entrySet()) {
351 peerListEntry.getValue().getIntermediaryResult().setFailed(true);
352 peerListEntry.getValue().setDone();
354 peerListCallbacks.clear();
355 /* peer callbacks. */
356 for (Entry<String, HighLevelCallback<PeerResult>> peerEntry: peerCallbacks.entrySet()) {
357 peerEntry.getValue().getIntermediaryResult().setFailed(true);
358 peerEntry.getValue().setDone();
360 peerCallbacks.clear();
362 HighLevelCallback<KeyGenerationResult> keyGenerationCallback = keyGenerationCallbacks.remove(identifier);
363 if (keyGenerationCallback != null) {
364 keyGenerationCallback.getIntermediaryResult().setFailed(true);
365 keyGenerationCallback.setDone();
368 HighLevelCallback<PeerListResult> peerListCallback = peerListCallbacks.remove(identifier);
369 if (peerListCallback != null) {
370 peerListCallback.getIntermediaryResult().setFailed(true);
371 peerListCallback.setDone();
374 HighLevelCallback<PeerResult> peerCallback = peerCallbacks.remove(identifier);
375 if (peerCallback != null) {
376 peerCallback.getIntermediaryResult().setFailed(true);
377 peerCallback.setDone();
384 // INTERFACE FcpListener
388 * @see net.pterodactylus.fcp.FcpListener#connectionClosed(net.pterodactylus.fcp.FcpConnection)
390 @SuppressWarnings("synthetic-access")
391 public void connectionClosed(FcpConnection fcpConnection) {
392 if (fcpConnection != HighLevelClient.this.fcpConnection) {
395 cancelIdentifier(null);
399 * @see net.pterodactylus.fcp.FcpListener#receivedAllData(net.pterodactylus.fcp.FcpConnection,
400 * net.pterodactylus.fcp.AllData)
402 public void receivedAllData(FcpConnection fcpConnection, AllData allData) {
406 * @see net.pterodactylus.fcp.FcpListener#receivedCloseConnectionDuplicateClientName(net.pterodactylus.fcp.FcpConnection,
407 * net.pterodactylus.fcp.CloseConnectionDuplicateClientName)
409 public void receivedCloseConnectionDuplicateClientName(FcpConnection fcpConnection, CloseConnectionDuplicateClientName closeConnectionDuplicateClientName) {
413 * @see net.pterodactylus.fcp.FcpListener#receivedConfigData(net.pterodactylus.fcp.FcpConnection,
414 * net.pterodactylus.fcp.ConfigData)
416 public void receivedConfigData(FcpConnection fcpConnection, ConfigData configData) {
420 * @see net.pterodactylus.fcp.FcpListener#receivedDataFound(net.pterodactylus.fcp.FcpConnection,
421 * net.pterodactylus.fcp.DataFound)
423 public void receivedDataFound(FcpConnection fcpConnection, DataFound dataFound) {
427 * @see net.pterodactylus.fcp.FcpListener#receivedEndListPeerNotes(net.pterodactylus.fcp.FcpConnection,
428 * net.pterodactylus.fcp.EndListPeerNotes)
430 public void receivedEndListPeerNotes(FcpConnection fcpConnection, EndListPeerNotes endListPeerNotes) {
434 * @see net.pterodactylus.fcp.FcpListener#receivedEndListPeers(net.pterodactylus.fcp.FcpConnection,
435 * net.pterodactylus.fcp.EndListPeers)
437 @SuppressWarnings("synthetic-access")
438 public void receivedEndListPeers(FcpConnection fcpConnection, EndListPeers endListPeers) {
439 if (fcpConnection != HighLevelClient.this.fcpConnection) {
442 String identifier = endListPeers.getIdentifier();
443 HighLevelCallback<PeerListResult> peerListCallback = peerListCallbacks.remove(identifier);
444 if (peerListCallback == null) {
447 peerListCallback.setDone();
451 * @see net.pterodactylus.fcp.FcpListener#receivedEndListPersistentRequests(net.pterodactylus.fcp.FcpConnection,
452 * net.pterodactylus.fcp.EndListPersistentRequests)
454 public void receivedEndListPersistentRequests(FcpConnection fcpConnection, EndListPersistentRequests endListPersistentRequests) {
458 * @see net.pterodactylus.fcp.FcpListener#receivedFCPPluginReply(net.pterodactylus.fcp.FcpConnection,
459 * net.pterodactylus.fcp.FCPPluginReply)
461 public void receivedFCPPluginReply(FcpConnection fcpConnection, FCPPluginReply fcpPluginReply) {
465 * @see net.pterodactylus.fcp.FcpListener#receivedGetFailed(net.pterodactylus.fcp.FcpConnection,
466 * net.pterodactylus.fcp.GetFailed)
468 public void receivedGetFailed(FcpConnection fcpConnection, GetFailed getFailed) {
472 * @see net.pterodactylus.fcp.FcpListener#receivedIdentifierCollision(net.pterodactylus.fcp.FcpConnection,
473 * net.pterodactylus.fcp.IdentifierCollision)
475 public void receivedIdentifierCollision(FcpConnection fcpConnection, IdentifierCollision identifierCollision) {
479 * @see net.pterodactylus.fcp.FcpListener#receivedMessage(net.pterodactylus.fcp.FcpConnection,
480 * net.pterodactylus.fcp.FcpMessage)
482 public void receivedMessage(FcpConnection fcpConnection, FcpMessage fcpMessage) {
486 * @see net.pterodactylus.fcp.FcpListener#receivedNodeData(net.pterodactylus.fcp.FcpConnection,
487 * net.pterodactylus.fcp.NodeData)
489 public void receivedNodeData(FcpConnection fcpConnection, NodeData nodeData) {
493 * @see net.pterodactylus.fcp.FcpListener#receivedNodeHello(net.pterodactylus.fcp.FcpConnection,
494 * net.pterodactylus.fcp.NodeHello)
496 @SuppressWarnings("synthetic-access")
497 public void receivedNodeHello(FcpConnection fcpConnection, NodeHello nodeHello) {
498 if (fcpConnection != HighLevelClient.this.fcpConnection) {
501 synchronized (syncObject) {
502 connectCallback.getIntermediaryResult().setFailed(false);
503 connectCallback.setDone();
504 connectCallback = null;
509 * @see net.pterodactylus.fcp.FcpListener#receivedPeer(net.pterodactylus.fcp.FcpConnection,
510 * net.pterodactylus.fcp.Peer)
512 @SuppressWarnings("synthetic-access")
513 public void receivedPeer(FcpConnection fcpConnection, Peer peer) {
514 if (fcpConnection != HighLevelClient.this.fcpConnection) {
517 String identifier = peer.getIdentifier();
518 if (identifier == null) {
521 HighLevelCallback<PeerListResult> peerListCallback = peerListCallbacks.get(identifier);
522 if (peerListCallback != null) {
523 peerListCallback.getIntermediaryResult().addPeer(peer);
526 HighLevelCallback<PeerResult> peerResult = peerCallbacks.remove(identifier);
527 if (peerResult != null) {
528 peerResult.getIntermediaryResult().setPeer(peer);
529 peerResult.setDone();
534 * @see net.pterodactylus.fcp.FcpListener#receivedPeerNote(net.pterodactylus.fcp.FcpConnection,
535 * net.pterodactylus.fcp.PeerNote)
537 public void receivedPeerNote(FcpConnection fcpConnection, PeerNote peerNote) {
541 * @see net.pterodactylus.fcp.FcpListener#receivedPeerRemoved(net.pterodactylus.fcp.FcpConnection,
542 * net.pterodactylus.fcp.PeerRemoved)
544 public void receivedPeerRemoved(FcpConnection fcpConnection, PeerRemoved peerRemoved) {
548 * @see net.pterodactylus.fcp.FcpListener#receivedPersistentGet(net.pterodactylus.fcp.FcpConnection,
549 * net.pterodactylus.fcp.PersistentGet)
551 public void receivedPersistentGet(FcpConnection fcpConnection, PersistentGet persistentGet) {
555 * @see net.pterodactylus.fcp.FcpListener#receivedPersistentPut(net.pterodactylus.fcp.FcpConnection,
556 * net.pterodactylus.fcp.PersistentPut)
558 public void receivedPersistentPut(FcpConnection fcpConnection, PersistentPut persistentPut) {
562 * @see net.pterodactylus.fcp.FcpListener#receivedPersistentPutDir(net.pterodactylus.fcp.FcpConnection,
563 * net.pterodactylus.fcp.PersistentPutDir)
565 public void receivedPersistentPutDir(FcpConnection fcpConnection, PersistentPutDir persistentPutDir) {
569 * @see net.pterodactylus.fcp.FcpListener#receivedPersistentRequestModified(net.pterodactylus.fcp.FcpConnection,
570 * net.pterodactylus.fcp.PersistentRequestModified)
572 public void receivedPersistentRequestModified(FcpConnection fcpConnection, PersistentRequestModified persistentRequestModified) {
576 * @see net.pterodactylus.fcp.FcpListener#receivedPersistentRequestRemoved(net.pterodactylus.fcp.FcpConnection,
577 * net.pterodactylus.fcp.PersistentRequestRemoved)
579 public void receivedPersistentRequestRemoved(FcpConnection fcpConnection, PersistentRequestRemoved persistentRequestRemoved) {
583 * @see net.pterodactylus.fcp.FcpListener#receivedPluginInfo(net.pterodactylus.fcp.FcpConnection,
584 * net.pterodactylus.fcp.PluginInfo)
586 public void receivedPluginInfo(FcpConnection fcpConnection, PluginInfo pluginInfo) {
590 * @see net.pterodactylus.fcp.FcpListener#receivedProtocolError(net.pterodactylus.fcp.FcpConnection,
591 * net.pterodactylus.fcp.ProtocolError)
593 @SuppressWarnings("synthetic-access")
594 public void receivedProtocolError(FcpConnection fcpConnection, ProtocolError protocolError) {
595 if (fcpConnection != HighLevelClient.this.fcpConnection) {
598 String identifier = protocolError.getIdentifier();
599 if (identifier == null) {
602 cancelIdentifier(identifier);
606 * @see net.pterodactylus.fcp.FcpListener#receivedPutFailed(net.pterodactylus.fcp.FcpConnection,
607 * net.pterodactylus.fcp.PutFailed)
609 public void receivedPutFailed(FcpConnection fcpConnection, PutFailed putFailed) {
613 * @see net.pterodactylus.fcp.FcpListener#receivedPutFetchable(net.pterodactylus.fcp.FcpConnection,
614 * net.pterodactylus.fcp.PutFetchable)
616 public void receivedPutFetchable(FcpConnection fcpConnection, PutFetchable putFetchable) {
620 * @see net.pterodactylus.fcp.FcpListener#receivedPutSuccessful(net.pterodactylus.fcp.FcpConnection,
621 * net.pterodactylus.fcp.PutSuccessful)
623 public void receivedPutSuccessful(FcpConnection fcpConnection, PutSuccessful putSuccessful) {
627 * @see net.pterodactylus.fcp.FcpListener#receivedSSKKeypair(net.pterodactylus.fcp.FcpConnection,
628 * net.pterodactylus.fcp.SSKKeypair)
630 @SuppressWarnings("synthetic-access")
631 public void receivedSSKKeypair(FcpConnection fcpConnection, SSKKeypair sskKeypair) {
632 if (fcpConnection != HighLevelClient.this.fcpConnection) {
635 HighLevelCallback<KeyGenerationResult> keyGenerationCallback = keyGenerationCallbacks.remove(sskKeypair.getIdentifier());
636 if (keyGenerationCallback == null) {
639 KeyGenerationResult keyGenerationResult = keyGenerationCallback.getIntermediaryResult();
640 keyGenerationResult.setInsertURI(sskKeypair.getInsertURI());
641 keyGenerationResult.setRequestURI(sskKeypair.getRequestURI());
642 keyGenerationCallback.setDone();
646 * @see net.pterodactylus.fcp.FcpListener#receivedSimpleProgress(net.pterodactylus.fcp.FcpConnection,
647 * net.pterodactylus.fcp.SimpleProgress)
649 public void receivedSimpleProgress(FcpConnection fcpConnection, SimpleProgress simpleProgress) {
653 * @see net.pterodactylus.fcp.FcpListener#receivedStartedCompression(net.pterodactylus.fcp.FcpConnection,
654 * net.pterodactylus.fcp.StartedCompression)
656 public void receivedStartedCompression(FcpConnection fcpConnection, StartedCompression startedCompression) {
660 * @see net.pterodactylus.fcp.FcpListener#receivedSubscribedUSKUpdate(net.pterodactylus.fcp.FcpConnection,
661 * net.pterodactylus.fcp.SubscribedUSKUpdate)
663 public void receivedSubscribedUSKUpdate(FcpConnection fcpConnection, SubscribedUSKUpdate subscribedUSKUpdate) {
667 * @see net.pterodactylus.fcp.FcpListener#receivedTestDDAComplete(net.pterodactylus.fcp.FcpConnection,
668 * net.pterodactylus.fcp.TestDDAComplete)
670 public void receivedTestDDAComplete(FcpConnection fcpConnection, TestDDAComplete testDDAComplete) {
674 * @see net.pterodactylus.fcp.FcpListener#receivedTestDDAReply(net.pterodactylus.fcp.FcpConnection,
675 * net.pterodactylus.fcp.TestDDAReply)
677 public void receivedTestDDAReply(FcpConnection fcpConnection, TestDDAReply testDDAReply) {
681 * @see net.pterodactylus.fcp.FcpListener#receivedURIGenerated(net.pterodactylus.fcp.FcpConnection,
682 * net.pterodactylus.fcp.URIGenerated)
684 public void receivedURIGenerated(FcpConnection fcpConnection, URIGenerated uriGenerated) {
688 * @see net.pterodactylus.fcp.FcpListener#receivedUnknownNodeIdentifier(net.pterodactylus.fcp.FcpConnection,
689 * net.pterodactylus.fcp.UnknownNodeIdentifier)
691 public void receivedUnknownNodeIdentifier(FcpConnection fcpConnection, UnknownNodeIdentifier unknownNodeIdentifier) {
695 * @see net.pterodactylus.fcp.FcpListener#receivedUnknownPeerNoteType(net.pterodactylus.fcp.FcpConnection,
696 * net.pterodactylus.fcp.UnknownPeerNoteType)
698 public void receivedUnknownPeerNoteType(FcpConnection fcpConnection, UnknownPeerNoteType unknownPeerNoteType) {
702 * @see net.pterodactylus.fcp.FcpListener#receviedFinishedCompression(net.pterodactylus.fcp.FcpConnection,
703 * net.pterodactylus.fcp.FinishedCompression)
705 public void receviedFinishedCompression(FcpConnection fcpConnection, FinishedCompression finishedCompression) {