X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Ffcp%2Fquelaton%2FClientPutCommandImpl.java;h=39d525ad01837c01b4e65383a71f02f81fd1a26b;hb=d05d526e4db3c92e6795c3e25648e159ae9a1473;hp=43d6c99e858532ebb01c92d5f38ed6e24d05df03;hpb=1ce220842b96db2ea57e456c70977620943cb5de;p=jFCPlib.git diff --git a/src/main/java/net/pterodactylus/fcp/quelaton/ClientPutCommandImpl.java b/src/main/java/net/pterodactylus/fcp/quelaton/ClientPutCommandImpl.java index 43d6c99..39d525a 100644 --- a/src/main/java/net/pterodactylus/fcp/quelaton/ClientPutCommandImpl.java +++ b/src/main/java/net/pterodactylus/fcp/quelaton/ClientPutCommandImpl.java @@ -3,6 +3,7 @@ package net.pterodactylus.fcp.quelaton; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import java.util.Objects; import java.util.Optional; import java.util.concurrent.ExecutorService; @@ -13,8 +14,13 @@ import java.util.concurrent.atomic.AtomicReference; import net.pterodactylus.fcp.ClientPut; import net.pterodactylus.fcp.FcpMessage; import net.pterodactylus.fcp.Key; +import net.pterodactylus.fcp.ProtocolError; import net.pterodactylus.fcp.PutFailed; import net.pterodactylus.fcp.PutSuccessful; +import net.pterodactylus.fcp.TestDDAComplete; +import net.pterodactylus.fcp.TestDDAReply; +import net.pterodactylus.fcp.TestDDARequest; +import net.pterodactylus.fcp.TestDDAResponse; import net.pterodactylus.fcp.UploadFrom; import com.google.common.util.concurrent.ListenableFuture; @@ -48,8 +54,8 @@ class ClientPutCommandImpl implements ClientPutCommand { } @Override - public Keyed> redirectTo(Key key) { - this.redirectUri.set(Objects.requireNonNull(key, "key must not be null").getKey()); + public Keyed> redirectTo(String uri) { + this.redirectUri.set(Objects.requireNonNull(uri, "uri must not be null")); return this::key; } @@ -112,7 +118,9 @@ class ClientPutCommandImpl implements ClientPutCommand { private class ClientPutReplySequence extends FcpReplySequence> { + private final AtomicReference originalClientPut = new AtomicReference<>(); private final AtomicReference identifier = new AtomicReference<>(); + private final AtomicReference directory = new AtomicReference<>(); private final AtomicReference finalKey = new AtomicReference<>(); private final AtomicBoolean putFinished = new AtomicBoolean(); @@ -132,7 +140,12 @@ class ClientPutCommandImpl implements ClientPutCommand { @Override public ListenableFuture> send(FcpMessage fcpMessage) throws IOException { + originalClientPut.set(fcpMessage); identifier.set(fcpMessage.getField("Identifier")); + String filename = fcpMessage.getField("Filename"); + if (filename != null) { + directory.set(new File(filename).getParent()); + } return super.send(fcpMessage); } @@ -152,9 +165,40 @@ class ClientPutCommandImpl implements ClientPutCommand { } @Override + protected void consumeProtocolError(ProtocolError protocolError) { + if (protocolError.getIdentifier().equals(identifier.get())) { + if (protocolError.getCode() == 25) { + sendMessage(new TestDDARequest(directory.get(), true, false)); + } else { + putFinished.set(true); + } + } + } + + @Override + protected void consumeTestDDAReply(TestDDAReply testDDAReply) { + if (testDDAReply.getDirectory().equals(directory.get())) { + try { + String readContent = Files.readAllLines(new File(testDDAReply.getReadFilename()).toPath()).get(0); + sendMessage(new TestDDAResponse(directory.get(), readContent)); + } catch (IOException e) { + sendMessage(new TestDDAResponse(directory.get(), "failed-to-read")); + } + } + } + + @Override + protected void consumeTestDDAComplete(TestDDAComplete testDDAComplete) { + if (testDDAComplete.getDirectory().equals(directory.get())) { + sendMessage(originalClientPut.get()); + } + } + + @Override protected void consumeConnectionClosed(Throwable throwable) { putFinished.set(true); } + } }