diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java index 4cb55541ff634c748e58cc9b78bad1022aaf8784..517b103938a1c235376b55d834d53c6f3ade94d8 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java +++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java @@ -155,7 +155,7 @@ public class BEncoder out.write(bs); } - public static byte[] bencode(Map<String, Object> m) + public static byte[] bencode(Map<?, ?> m) { try { @@ -169,23 +169,29 @@ public class BEncoder } } - public static void bencode(Map<String, Object> m, OutputStream out) throws IOException + public static void bencode(Map<?, ?> m, OutputStream out) + throws IOException, IllegalArgumentException { out.write('d'); // Keys must be sorted. XXX - But is this the correct order? - Set<String> s = m.keySet(); - List<String> l = new ArrayList<String>(s); + Set<?> s = m.keySet(); + List<String> l = new ArrayList<String>(s.size()); + for (Object k : s) { + // Keys must be Strings. + if (String.class.isAssignableFrom(k.getClass())) + l.add((String) k); + else + throw new IllegalArgumentException("Cannot bencode map: contains non-String key of type " + k.getClass()); + } Collections.sort(l); Iterator<String> it = l.iterator(); while(it.hasNext()) { - // Keys must be Strings. String key = it.next(); - Object value = m.get(key); bencode(key, out); - bencode(value, out); + bencode(m.get(key), out); } out.write('e');