Follow redirects in ClientGet
[jFCPlib.git] / src / main / java / net / pterodactylus / fcp / quelaton / FcpDialog.java
index 2aa003c..f2b71fd 100644 (file)
@@ -36,6 +36,7 @@ import net.pterodactylus.fcp.PersistentPutDir;
 import net.pterodactylus.fcp.PersistentRequestModified;
 import net.pterodactylus.fcp.PersistentRequestRemoved;
 import net.pterodactylus.fcp.PluginInfo;
+import net.pterodactylus.fcp.PluginRemoved;
 import net.pterodactylus.fcp.ProtocolError;
 import net.pterodactylus.fcp.PutFailed;
 import net.pterodactylus.fcp.PutFetchable;
@@ -45,6 +46,7 @@ import net.pterodactylus.fcp.SSKKeypair;
 import net.pterodactylus.fcp.SentFeed;
 import net.pterodactylus.fcp.SimpleProgress;
 import net.pterodactylus.fcp.StartedCompression;
+import net.pterodactylus.fcp.SubscribedUSK;
 import net.pterodactylus.fcp.SubscribedUSKUpdate;
 import net.pterodactylus.fcp.TestDDAComplete;
 import net.pterodactylus.fcp.TestDDAReply;
@@ -57,7 +59,7 @@ import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
 
 /**
- * An FCP reply sequence enables you to conveniently wait for a specific set of FCP replies.
+ * An FCP dialog enables you to conveniently wait for a specific set of FCP replies.
  *
  * @author <a href="bombe@freenetproject.org">David ‘Bombe’ Roden</a>
  */
@@ -70,17 +72,35 @@ public abstract class FcpDialog<R> implements AutoCloseable, FcpListener {
        private final AtomicReference<String> identifier = new AtomicReference<>();
        private final AtomicBoolean connectionClosed = new AtomicBoolean();
        private final AtomicReference<Throwable> connectionFailureReason = new AtomicReference<>();
+       private final AtomicBoolean finished = new AtomicBoolean();
+       private final AtomicReference<R> result = new AtomicReference<>();
 
-       public FcpDialog(ExecutorService executorService, FcpConnection fcpConnection) {
+       public FcpDialog(ExecutorService executorService, FcpConnection fcpConnection, R initialResult) {
                this.executorService = MoreExecutors.listeningDecorator(executorService);
                this.fcpConnection = fcpConnection;
+               result.set(initialResult);
        }
 
        protected void setIdentifier(String identifier) {
                this.identifier.set(identifier);
        }
 
-       protected abstract boolean isFinished();
+       protected String getIdentifier() {
+               return identifier.get();
+       }
+
+       public final boolean isFinished() {
+               return finished.get();
+       }
+
+       protected final void finish() {
+               finished.set(true);
+       }
+
+       protected final void setResult(R result) {
+               this.result.set(result);
+               finish();
+       }
 
        public ListenableFuture<R> send(FcpMessage fcpMessage) throws IOException {
                setIdentifier(fcpMessage.getField("Identifier"));
@@ -118,8 +138,8 @@ public abstract class FcpDialog<R> implements AutoCloseable, FcpListener {
                }
        }
 
-       protected R getResult() {
-               return null;
+       protected final R getResult() {
+               return result.get();
        }
 
        @Override
@@ -355,6 +375,13 @@ public abstract class FcpDialog<R> implements AutoCloseable, FcpListener {
        protected void consumePersistentRequestRemoved(PersistentRequestRemoved persistentRequestRemoved) { }
 
        @Override
+       public final void receivedSubscribedUSK(FcpConnection fcpConnection, SubscribedUSK subscribedUSK) {
+               consume(this::consumeSubscribedUSK, subscribedUSK);
+       }
+
+       protected void consumeSubscribedUSK(SubscribedUSK subscribedUSK) { }
+
+       @Override
        public final void receivedSubscribedUSKUpdate(FcpConnection fcpConnection, SubscribedUSKUpdate subscribedUSKUpdate) {
                consume(this::consumeSubscribedUSKUpdate, subscribedUSKUpdate);
        }
@@ -369,6 +396,13 @@ public abstract class FcpDialog<R> implements AutoCloseable, FcpListener {
        protected void consumePluginInfo(PluginInfo pluginInfo) { }
 
        @Override
+       public final void receivedPluginRemoved(FcpConnection fcpConnection, PluginRemoved pluginRemoved) {
+               consume(this::consumePluginRemoved, pluginRemoved);
+       }
+
+       protected void consumePluginRemoved(PluginRemoved pluginRemoved) { }
+
+       @Override
        public final void receivedFCPPluginReply(FcpConnection fcpConnection, FCPPluginReply fcpPluginReply) {
                consume(this::consumeFCPPluginReply, fcpPluginReply);
        }