From 299a44e7ebd2145c8d893dd21096f12ee1c4e824 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sat, 7 Jun 2014 17:07:44 +0000
Subject: [PATCH] i2psnark: display peer version when available

---
 .../java/src/org/klomp/snark/PeerID.java      |  2 +-
 .../org/klomp/snark/web/I2PSnarkServlet.java  | 56 +++++++++++++++++--
 2 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerID.java b/apps/i2psnark/java/src/org/klomp/snark/PeerID.java
index 0a71450c7c..405d9e508a 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerID.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerID.java
@@ -42,7 +42,7 @@ import org.klomp.snark.bencode.InvalidBEncodingException;
  *  and the PeerID is not required.
  *  Equality is now determined solely by the dest hash.
  */
-class PeerID implements Comparable<PeerID>
+public class PeerID implements Comparable<PeerID>
 {
   private byte[] id;
   private Destination address;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index bed4519817..f84fa230e0 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -32,6 +32,7 @@ import org.klomp.snark.I2PSnarkUtil;
 import org.klomp.snark.MagnetURI;
 import org.klomp.snark.MetaInfo;
 import org.klomp.snark.Peer;
+import org.klomp.snark.PeerID;
 import org.klomp.snark.Snark;
 import org.klomp.snark.SnarkManager;
 import org.klomp.snark.Storage;
@@ -1478,7 +1479,8 @@ public class I2PSnarkServlet extends BasicServlet {
                     continue;
                 out.write("<tr class=\"" + rowClass + "\"><td></td>");
                 out.write("<td colspan=\"4\" align=\"right\">");
-                String ch = peer.toString().substring(0, 4);
+                PeerID pid = peer.getPeerID();
+                String ch = pid != null ? pid.toString().substring(0, 4) : "????";
                 String client;
                 if ("AwMD".equals(ch))
                     client = _("I2PSnark");
@@ -1487,15 +1489,15 @@ public class I2PSnarkServlet extends BasicServlet {
                 else if ("TTMt".equals(ch))
                     client = "I2P-BT";
                 else if ("LUFa".equals(ch))
-                    client = "Azureus";
+                    client = "Vuze" + getAzVersion(pid.getID());
                 else if ("CwsL".equals(ch))
                     client = "I2PSnarkXL";
                 else if ("ZV".equals(ch.substring(2,4)) || "VUZP".equals(ch))
-                    client = "Robert";
+                    client = "Robert" + getRobtVersion(pid.getID());
                 else if (ch.startsWith("LV")) // LVCS 1.0.2?; LVRS 1.0.4
-                    client = "Transmission";
+                    client = "Transmission" + getAzVersion(pid.getID());
                 else if ("LUtU".equals(ch))
-                    client = "KTorrent";
+                    client = "KTorrent" + getAzVersion(pid.getID());
                 else
                     client = _("Unknown") + " (" + ch + ')';
                 out.write(client + "&nbsp;&nbsp;<tt>" + peer.toString().substring(5, 9)+ "</tt>");
@@ -1569,6 +1571,50 @@ public class I2PSnarkServlet extends BasicServlet {
             }
         }
     }
+
+    /**
+     *  Get version from bytes 3-6
+     *  @return " w.x.y.z" or ""
+     *  @since 0.9.14
+     */
+    private static String getAzVersion(byte[] id) {
+        if (id[7] != '-')
+            return "";
+        StringBuilder buf = new StringBuilder(16);
+        buf.append(' ');
+        for (int i = 3; i <= 6; i++) {
+            int val = id[i] - '0';
+            if (val < 0)
+                return "";
+            if (val > 9)
+                val = id[i] - 'A';
+            if (i != 6 || val != 0) {
+                if (i != 3)
+                    buf.append('.');
+                buf.append(val);
+            }
+        }
+        return buf.toString();
+    }
+
+    /**
+     *  Get version from bytes 3-5
+     *  @return " w.x.y" or ""
+     *  @since 0.9.14
+     */
+    private static String getRobtVersion(byte[] id) {
+        StringBuilder buf = new StringBuilder(8);
+        buf.append(' ');
+        for (int i = 3; i <= 5; i++) {
+            int val = id[i];
+            if (val < 0)
+                return "";
+            if (i != 3)
+                buf.append('.');
+            buf.append(val);
+        }
+        return buf.toString();
+    }
     
     /** @since 0.8.2 */
     private static String thinsp(boolean disable) {
-- 
GitLab