|
|
|
@ -3,11 +3,14 @@ package org.qortal.network.message;
|
|
|
|
|
import com.google.common.primitives.Ints; |
|
|
|
|
import com.google.common.primitives.Longs; |
|
|
|
|
import org.qortal.transform.Transformer; |
|
|
|
|
import org.qortal.transform.transaction.TransactionTransformer; |
|
|
|
|
|
|
|
|
|
import java.io.ByteArrayOutputStream; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.io.UnsupportedEncodingException; |
|
|
|
|
import java.nio.ByteBuffer; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
import static org.qortal.transform.Transformer.INT_LENGTH; |
|
|
|
|
import static org.qortal.transform.Transformer.LONG_LENGTH; |
|
|
|
@ -15,19 +18,22 @@ import static org.qortal.transform.Transformer.LONG_LENGTH;
|
|
|
|
|
public class GetArbitraryDataFileListMessage extends Message { |
|
|
|
|
|
|
|
|
|
private static final int SIGNATURE_LENGTH = Transformer.SIGNATURE_LENGTH; |
|
|
|
|
private static final int HASH_LENGTH = TransactionTransformer.SHA256_LENGTH; |
|
|
|
|
|
|
|
|
|
private final byte[] signature; |
|
|
|
|
private List<byte[]> hashes; |
|
|
|
|
private final long requestTime; |
|
|
|
|
private int requestHops; |
|
|
|
|
|
|
|
|
|
public GetArbitraryDataFileListMessage(byte[] signature, long requestTime, int requestHops) { |
|
|
|
|
this(-1, signature, requestTime, requestHops); |
|
|
|
|
public GetArbitraryDataFileListMessage(byte[] signature, List<byte[]> hashes, long requestTime, int requestHops) { |
|
|
|
|
this(-1, signature, hashes, requestTime, requestHops); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private GetArbitraryDataFileListMessage(int id, byte[] signature, long requestTime, int requestHops) { |
|
|
|
|
private GetArbitraryDataFileListMessage(int id, byte[] signature, List<byte[]> hashes, long requestTime, int requestHops) { |
|
|
|
|
super(id, MessageType.GET_ARBITRARY_DATA_FILE_LIST); |
|
|
|
|
|
|
|
|
|
this.signature = signature; |
|
|
|
|
this.hashes = hashes; |
|
|
|
|
this.requestTime = requestTime; |
|
|
|
|
this.requestHops = requestHops; |
|
|
|
|
} |
|
|
|
@ -36,10 +42,11 @@ public class GetArbitraryDataFileListMessage extends Message {
|
|
|
|
|
return this.signature; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static Message fromByteBuffer(int id, ByteBuffer bytes) throws UnsupportedEncodingException { |
|
|
|
|
if (bytes.remaining() != SIGNATURE_LENGTH + LONG_LENGTH + INT_LENGTH) |
|
|
|
|
return null; |
|
|
|
|
public List<byte[]> getHashes() { |
|
|
|
|
return this.hashes; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static Message fromByteBuffer(int id, ByteBuffer bytes) throws UnsupportedEncodingException { |
|
|
|
|
byte[] signature = new byte[SIGNATURE_LENGTH]; |
|
|
|
|
|
|
|
|
|
bytes.get(signature); |
|
|
|
@ -48,7 +55,23 @@ public class GetArbitraryDataFileListMessage extends Message {
|
|
|
|
|
|
|
|
|
|
int requestHops = bytes.getInt(); |
|
|
|
|
|
|
|
|
|
return new GetArbitraryDataFileListMessage(id, signature, requestTime, requestHops); |
|
|
|
|
List<byte[]> hashes = null; |
|
|
|
|
if (bytes.hasRemaining()) { |
|
|
|
|
int hashCount = bytes.getInt(); |
|
|
|
|
|
|
|
|
|
if (bytes.remaining() != hashCount * HASH_LENGTH) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
hashes = new ArrayList<>(); |
|
|
|
|
for (int i = 0; i < hashCount; ++i) { |
|
|
|
|
byte[] hash = new byte[HASH_LENGTH]; |
|
|
|
|
bytes.get(hash); |
|
|
|
|
hashes.add(hash); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return new GetArbitraryDataFileListMessage(id, signature, hashes, requestTime, requestHops); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@ -62,6 +85,14 @@ public class GetArbitraryDataFileListMessage extends Message {
|
|
|
|
|
|
|
|
|
|
bytes.write(Ints.toByteArray(this.requestHops)); |
|
|
|
|
|
|
|
|
|
if (this.hashes != null) { |
|
|
|
|
bytes.write(Ints.toByteArray(this.hashes.size())); |
|
|
|
|
|
|
|
|
|
for (byte[] hash : this.hashes) { |
|
|
|
|
bytes.write(hash); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return bytes.toByteArray(); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
return null; |
|
|
|
|