From d01b7923aa4895d9ed1415b4f65db7dc71b05d6e Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 6 Aug 2021 21:27:33 +0200 Subject: [PATCH] Receive requested file contents on client --- .../dataexchange/handler/DataExchange.java | 43 ++++++++++++++++--- .../dataexchange/handler/RequestFiles.java | 8 +++- .../api/dataexchange/handler/SendFiles.java | 30 +++++++++++-- 3 files changed, 70 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/DataExchange.java b/src/main/java/ru/bclib/api/dataexchange/handler/DataExchange.java index fbaa3a75..a5b0a1d7 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/DataExchange.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/DataExchange.java @@ -97,15 +97,27 @@ abstract public class DataExchange { return new byte[0]; } + public void serializeContent(FriendlyByteBuf buf){ + DataHandler.writeString(buf, modID); + DataHandler.writeString(buf, uniqueID); + serializeFileContent(buf); + } + public static Pair deserializeContent(FriendlyByteBuf buf){ + final String modID = DataHandler.readString(buf); + final String uniqueID = DataHandler.readString(buf); + byte[] data = deserializeFileContent(buf); + AutoFileSyncEntry entry = AutoFileSyncEntry.findMatching(modID, uniqueID); + return new Pair<>(entry, data); + } + + public void serialize(FriendlyByteBuf buf){ getFileHash().serialize(buf); buf.writeBoolean(requestContent); if (requestContent) { - byte[] content = getContent(); - buf.writeInt(content.length); - buf.writeByteArray(content); + serializeFileContent(buf); } } @@ -120,19 +132,38 @@ abstract public class DataExchange { boolean withContent = buf.readBoolean(); byte[] data = null; if (withContent) { - int size = buf.readInt(); - data = buf.readByteArray(size); + data = deserializeFileContent(buf); } return new Pair(hash, data); } + private void serializeFileContent(FriendlyByteBuf buf) { + byte[] content = getContent(); + buf.writeInt(content.length); + buf.writeByteArray(content); + } + + private static byte[] deserializeFileContent(FriendlyByteBuf buf) { + byte[] data; + int size = buf.readInt(); + data = buf.readByteArray(size); + return data; + } + public static AutoFileSyncEntry findMatching(FileHash hash){ + return findMatching(hash.modID, hash.uniqueID); + } + public static AutoFileSyncEntry findMatching(AutoSyncID aid){ + return findMatching(aid.getModID(), aid.getUniqueID()); + } + + public static AutoFileSyncEntry findMatching(String modID, String uniqueID){ return DataExchange .getInstance() .autoSyncFiles .stream() - .filter(asf -> asf.modID.equals(hash.modID) && asf.uniqueID.equals(hash.uniqueID)) + .filter(asf -> asf.modID.equals(modID) && asf.uniqueID.equals(uniqueID)) .findFirst() .orElse(null); } diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/RequestFiles.java b/src/main/java/ru/bclib/api/dataexchange/handler/RequestFiles.java index 9a716055..77832369 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/RequestFiles.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/RequestFiles.java @@ -12,6 +12,7 @@ import ru.bclib.api.dataexchange.handler.DataExchange.AutoSyncID; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class RequestFiles extends DataHandler { public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "request_files"), RequestFiles::new, false, false); @@ -55,6 +56,11 @@ public class RequestFiles extends DataHandler { @Override protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient) { - + List syncEntries = files + .stream().map(asid -> DataExchange.AutoFileSyncEntry.findMatching(asid)) + .filter(e -> e!=null) + .collect(Collectors.toList()); + + reply(new SendFiles(syncEntries), server); } } diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/SendFiles.java b/src/main/java/ru/bclib/api/dataexchange/handler/SendFiles.java index ecd7ef23..1e9afbe2 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/SendFiles.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/SendFiles.java @@ -8,22 +8,44 @@ import net.minecraft.server.MinecraftServer; import ru.bclib.BCLib; import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.DataHandlerDescriptor; +import ru.bclib.util.Pair; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; public class SendFiles extends DataHandler { public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "send_files"), SendFiles::new, false, false); - - public SendFiles() { + + protected List files; + public SendFiles(){ + this(null); + } + public SendFiles(List files) { super(DESCRIPTOR.IDENTIFIER, true); + this.files = files; } @Override protected void serializeData(FriendlyByteBuf buf) { - + List existingFiles = files.stream().filter(e -> e.fileName.exists()).collect(Collectors.toList()); + buf.writeInt(existingFiles.size()); + + for (DataExchange.AutoFileSyncEntry entry : existingFiles) { + entry.serializeContent(buf); + } } @Override protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean fromClient) { - + int size = buf.readInt(); + List> receivedFiles = new ArrayList<>(size); + BCLib.LOGGER.info("Server sent " + size + " Files:"); + for (int i=0; i p = DataExchange.AutoFileSyncEntry.deserializeContent(buf); + receivedFiles.add(p); + BCLib.LOGGER.info(" - " + p.first + " (" + p.second.length + " Bytes)"); + } } @Override