package net.i2p.android.router.netdb; import java.lang.reflect.Field; import net.i2p.android.router.R; import net.i2p.data.DatabaseEntry; import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.router.RouterInfo; import net.i2p.router.RouterContext; import net.i2p.router.TunnelPoolSettings; public class NetDbEntry { private final boolean mIsRI; private final DatabaseEntry mEntry; private final boolean mIsUs; private final String mCountry; private final String mNick; private final boolean mLocal; private final boolean mUnpublished; public static NetDbEntry fromRouterInfo(RouterContext ctx, RouterInfo ri) { Hash us = ctx.routerHash(); boolean isUs = ri.getHash().equals(us); // XXX Disabled, no GeoIP file String country = "";//ctx.commSystem().getCountry(ri.getIdentity().getHash()); return new NetDbEntry(ri, isUs, country); } public static NetDbEntry fromLeaseSet(RouterContext ctx, LeaseSet ls) { String nick; boolean local = false; boolean unpublished = false; Destination dest = ls.getDestination(); Hash key = dest.calculateHash(); if (ctx.clientManager().isLocal(dest)) { local = true; if (! ctx.clientManager().shouldPublishLeaseSet(key)) unpublished = true; TunnelPoolSettings in = ctx.tunnelManager().getInboundSettings(key); if (in != null && in.getDestinationNickname() != null) nick = in.getDestinationNickname(); else nick = dest.toBase64().substring(0, 6); } else { String host = ctx.namingService().reverseLookup(dest); if (host != null) nick = host; else nick = dest.toBase64().substring(0, 6); } return new NetDbEntry(ls, nick, local, unpublished); } private NetDbEntry(RouterInfo ri, boolean isUs, String country) { mIsRI = true; mEntry = ri; mIsUs = isUs; mCountry = country; mNick = ""; mLocal = mUnpublished = false; } private NetDbEntry(LeaseSet ls, String nick, boolean local, boolean unpublished) { mIsRI = false; mEntry = ls; mNick = nick; mLocal = local; mUnpublished = unpublished; mIsUs = false; mCountry = ""; } public boolean isRouterInfo() { return mIsRI; } // General methods public Hash getHash() { return mEntry.getHash(); } // RouterInfo-specific methods public boolean isUs() { return mIsUs; } public int getCountryIcon() { // http://daniel-codes.blogspot.com/2009/12/dynamically-retrieving-resources-in.html try { Class<R.drawable> res = R.drawable.class; Field field = res.getField("flag_" + mCountry); return field.getInt(null); } catch (Exception e) { return 0; } } // LeaseSet-specific methods public String getNickname() { return mNick; } public boolean isLocal() { return mLocal; } public boolean isUnpublished() { return mUnpublished; } }