X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Ffcp%2Fquelaton%2FClientPutCommandImpl.java;h=f0a670616f244fa3c82a41129b2f3a305d4dd29a;hb=12eb8641be8a71957856ec76c9522d80394e5cd6;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..f0a6706 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; @@ -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,37 @@ class ClientPutCommandImpl implements ClientPutCommand { } @Override + protected void consumeProtocolError(ProtocolError protocolError) { + if (protocolError.getIdentifier().equals(identifier.get()) && (protocolError.getCode() == 25)) { + sendMessage(new TestDDARequest(directory.get(), true, false)); + } + } + + @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) { + e.printStackTrace(); + 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); } + } }