diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java index 6e20499d..3147f9cb 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java @@ -484,6 +484,7 @@ public class ArbitraryDataFileListManager { GetArbitraryDataFileListMessage getArbitraryDataFileListMessage = (GetArbitraryDataFileListMessage) message; byte[] signature = getArbitraryDataFileListMessage.getSignature(); String signature58 = Base58.encode(signature); + List requestedHashes = getArbitraryDataFileListMessage.getHashes(); Long now = NTP.getTime(); Triple newEntry = new Triple<>(signature58, peer, now); @@ -513,36 +514,37 @@ public class ArbitraryDataFileListManager { // Load file(s) and add any that exist to the list of hashes ArbitraryDataFile arbitraryDataFile = ArbitraryDataFile.fromHash(hash, signature); - if (metadataHash != null) { - arbitraryDataFile.setMetadataHash(metadataHash); + arbitraryDataFile.setMetadataHash(metadataHash); - // Assume all chunks exists, unless one can't be found below - allChunksExist = true; + // If the peer didn't supply a hash list, we need to return all hashes for this transaction + if (requestedHashes == null || requestedHashes.isEmpty()) { + requestedHashes = new ArrayList<>(); - // If we have the metadata file, add its hash - if (arbitraryDataFile.getMetadataFile().exists()) { - hashes.add(arbitraryDataFile.getMetadataHash()); - } - else { - allChunksExist = false; + // Add the metadata file + if (arbitraryDataFile.getMetadataHash() != null) { + requestedHashes.add(arbitraryDataFile.getMetadataHash()); } - for (ArbitraryDataFileChunk chunk : arbitraryDataFile.getChunks()) { - if (chunk.exists()) { - hashes.add(chunk.getHash()); - //LOGGER.trace("Added hash {}", chunk.getHash58()); - } else { - LOGGER.trace("Couldn't add hash {} because it doesn't exist", chunk.getHash58()); - allChunksExist = false; - } - } - } else { - // This transaction has no chunks, so include the complete file if we have it - if (arbitraryDataFile.exists()) { - hashes.add(arbitraryDataFile.getHash()); - allChunksExist = true; + // Add the chunk hashes + if (arbitraryDataFile.getChunkHashes().size() > 0) { + requestedHashes.addAll(arbitraryDataFile.getChunkHashes()); } + // Add complete file if there are no hashes else { + requestedHashes.add(arbitraryDataFile.getHash()); + } + } + + // Assume all chunks exists, unless one can't be found below + allChunksExist = true; + + for (byte[] requestedHash : requestedHashes) { + ArbitraryDataFileChunk chunk = ArbitraryDataFileChunk.fromHash(requestedHash, signature); + if (chunk.exists()) { + hashes.add(chunk.getHash()); + //LOGGER.trace("Added hash {}", chunk.getHash58()); + } else { + LOGGER.trace("Couldn't add hash {} because it doesn't exist", chunk.getHash58()); allChunksExist = false; } }