Refactor FCP dialog
[jFCPlib.git] / src / main / java / net / pterodactylus / fcp / quelaton / FcpDialog.java
index 5be102c..5b030bd 100644 (file)
@@ -46,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;
@@ -71,17 +72,31 @@ 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();
+       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"));
@@ -119,8 +134,8 @@ public abstract class FcpDialog<R> implements AutoCloseable, FcpListener {
                }
        }
 
-       protected R getResult() {
-               return null;
+       protected final R getResult() {
+               return result.get();
        }
 
        @Override
@@ -356,6 +371,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);
        }